From e2b8fab8a079f0f7519f8d7b5142b6a5f16ea4c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nils=20Petter=20Sk=C3=A5lerud?= <np_skalerud@hotmail.com> Date: Mon, 8 Apr 2019 01:36:04 +0200 Subject: [PATCH] Removed LibKTX as a dependency. Project now uses DTex for texture importing, added as submodule. Added Vulkan-Headers as submdoule for future development. Removed all internal TextureDocument structs. DTex will be favored. Worked on getting compressed textures to work. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Nils Petter Skålerud <np_skalerud@hotmail.com> --- .gitmodules | 8 + CMakeLists.txt | 1 - CMakeSettings.json | 29 +- Data/Textures/test3.ktx | Bin 0 -> 1398236 bytes external/CMakeLists.txt | 29 +- external/DTex | 1 + external/KTX-Software-master/BUILDING.md | 409 --- .../KTX-Software-master/CODE_OF_CONDUCT.md | 1 - external/KTX-Software-master/CONTRIBUTING.md | 12 - external/KTX-Software-master/LICENSE.md | 228 -- external/KTX-Software-master/NOTICE.md | 1 - external/KTX-Software-master/README.md | 72 - external/KTX-Software-master/include/ktx.h | 845 ------ .../KTX-Software-master/lib/checkheader.c | 172 -- external/KTX-Software-master/lib/errstr.c | 70 - external/KTX-Software-master/lib/etcdec.cxx | 1845 ------------- .../KTX-Software-master/lib/etcunpack.cxx | 288 -- external/KTX-Software-master/lib/filestream.c | 324 --- external/KTX-Software-master/lib/filestream.h | 39 - external/KTX-Software-master/lib/gl_format.h | 2456 ----------------- .../KTX-Software-master/lib/gl_funcptrs.h | 69 - .../KTX-Software-master/lib/gles1_funcptrs.h | 68 - .../KTX-Software-master/lib/gles2_funcptrs.h | 67 - .../KTX-Software-master/lib/gles3_funcptrs.h | 72 - external/KTX-Software-master/lib/glloader.c | 1115 -------- external/KTX-Software-master/lib/hashlist.c | 344 --- external/KTX-Software-master/lib/hashtable.c | 97 - external/KTX-Software-master/lib/ktxgl.h | 228 -- external/KTX-Software-master/lib/ktxint.h | 205 -- external/KTX-Software-master/lib/libktx.gypi | 226 -- external/KTX-Software-master/lib/mainpage.md | 214 -- external/KTX-Software-master/lib/memstream.c | 588 ---- external/KTX-Software-master/lib/memstream.h | 55 - external/KTX-Software-master/lib/stream.h | 137 - external/KTX-Software-master/lib/swap.c | 52 - external/KTX-Software-master/lib/texture.c | 1636 ----------- external/KTX-Software-master/lib/uthash.h | 960 ------- external/KTX-Software-master/lib/vk_format.h | 1371 --------- .../KTX-Software-master/lib/vk_funclist.inl | 55 - external/KTX-Software-master/lib/vk_funcs.c | 164 -- external/KTX-Software-master/lib/vk_funcs.h | 97 - external/KTX-Software-master/lib/vkloader.c | 1444 ---------- external/KTX-Software-master/lib/writer.c | 477 ---- external/KTX-Software-master/lib/writer_v1.c | 708 ----- .../other_include/KHR/khrplatform.h | 282 -- external/Vulkan-Headers | 1 + src/Engine/Application.hpp | 2 +- src/Engine/AssManRendererConnect.cpp | 31 - src/Engine/AssManRendererConnect.hpp | 4 - src/Engine/AssetManager/AssetManager.cpp | 6 +- src/Engine/AssetManager/AssetManager.hpp | 3 - src/Engine/AssetManager/TextureDocument.hpp | 91 - src/Engine/AssetManager/TextureDocument.inl | 201 -- src/Engine/Engine.cpp | 4 +- src/Engine/Renderer/OpenGL.cpp | 118 +- src/Engine/Renderer/Renderer.cpp | 3 +- src/Engine/Renderer/TextureDocument.hpp | 86 - src/Engine/Renderer/TextureDocument.inl | 85 - 58 files changed, 88 insertions(+), 18108 deletions(-) create mode 100644 Data/Textures/test3.ktx create mode 160000 external/DTex delete mode 100644 external/KTX-Software-master/BUILDING.md delete mode 100644 external/KTX-Software-master/CODE_OF_CONDUCT.md delete mode 100644 external/KTX-Software-master/CONTRIBUTING.md delete mode 100644 external/KTX-Software-master/LICENSE.md delete mode 100644 external/KTX-Software-master/NOTICE.md delete mode 100644 external/KTX-Software-master/README.md delete mode 100644 external/KTX-Software-master/include/ktx.h delete mode 100644 external/KTX-Software-master/lib/checkheader.c delete mode 100644 external/KTX-Software-master/lib/errstr.c delete mode 100644 external/KTX-Software-master/lib/etcdec.cxx delete mode 100644 external/KTX-Software-master/lib/etcunpack.cxx delete mode 100644 external/KTX-Software-master/lib/filestream.c delete mode 100644 external/KTX-Software-master/lib/filestream.h delete mode 100644 external/KTX-Software-master/lib/gl_format.h delete mode 100644 external/KTX-Software-master/lib/gl_funcptrs.h delete mode 100644 external/KTX-Software-master/lib/gles1_funcptrs.h delete mode 100644 external/KTX-Software-master/lib/gles2_funcptrs.h delete mode 100644 external/KTX-Software-master/lib/gles3_funcptrs.h delete mode 100644 external/KTX-Software-master/lib/glloader.c delete mode 100644 external/KTX-Software-master/lib/hashlist.c delete mode 100644 external/KTX-Software-master/lib/hashtable.c delete mode 100644 external/KTX-Software-master/lib/ktxgl.h delete mode 100644 external/KTX-Software-master/lib/ktxint.h delete mode 100644 external/KTX-Software-master/lib/libktx.gypi delete mode 100644 external/KTX-Software-master/lib/mainpage.md delete mode 100644 external/KTX-Software-master/lib/memstream.c delete mode 100644 external/KTX-Software-master/lib/memstream.h delete mode 100644 external/KTX-Software-master/lib/stream.h delete mode 100644 external/KTX-Software-master/lib/swap.c delete mode 100644 external/KTX-Software-master/lib/texture.c delete mode 100644 external/KTX-Software-master/lib/uthash.h delete mode 100644 external/KTX-Software-master/lib/vk_format.h delete mode 100644 external/KTX-Software-master/lib/vk_funclist.inl delete mode 100644 external/KTX-Software-master/lib/vk_funcs.c delete mode 100644 external/KTX-Software-master/lib/vk_funcs.h delete mode 100644 external/KTX-Software-master/lib/vkloader.c delete mode 100644 external/KTX-Software-master/lib/writer.c delete mode 100644 external/KTX-Software-master/lib/writer_v1.c delete mode 100644 external/KTX-Software-master/other_include/KHR/khrplatform.h create mode 160000 external/Vulkan-Headers delete mode 100644 src/Engine/AssetManager/TextureDocument.hpp delete mode 100644 src/Engine/AssetManager/TextureDocument.inl delete mode 100644 src/Engine/Renderer/TextureDocument.hpp delete mode 100644 src/Engine/Renderer/TextureDocument.inl diff --git a/.gitmodules b/.gitmodules index 0e7ea5b..0cddf4f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -6,3 +6,11 @@ path = external/fx-gltf url = https://github.com/jessey-git/fx-gltf.git branch = master +[submodule "DTex"] + path = external/DTex + url = https://github.com/Didgy74/DTex.git + branch = master +[submodule "Vulkan-Headers"] + path = external/Vulkan-Headers + url = https://github.com/KhronosGroup/Vulkan-Headers.git + branch = master diff --git a/CMakeLists.txt b/CMakeLists.txt index 77be300..df64bf9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,7 +9,6 @@ endif() file(GLOB_RECURSE SOURCE_FILES "${CMAKE_SOURCE_DIR}/src/*.cpp" "${CMAKE_SOURCE_DIR}/src/*.hpp" "${CMAKE_SOURCE_DIR}/src/*.inl") add_executable(${PROJECT_NAME} ${SOURCE_FILES}) -#target_include_directories(${PROJECT_NAME} PRIVATE include) add_subdirectory(external) target_link_libraries(${PROJECT_NAME} external::external) diff --git a/CMakeSettings.json b/CMakeSettings.json index 772c29f..01191ed 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -1 +1,28 @@ -{ configurations : [] } \ No newline at end of file +{ + "configurations": [ + { + "name": "x64-Release", + "generator": "Ninja", + "configurationType": "RelWithDebInfo", + "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}", + "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "-v", + "ctestCommandArgs": "", + "inheritEnvironments": [ "msvc_x64_x64" ], + "variables": [] + }, + { + "name": "x64-Debug", + "generator": "Ninja", + "configurationType": "Debug", + "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}", + "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "-v", + "ctestCommandArgs": "", + "inheritEnvironments": [ "msvc_x64_x64" ], + "variables": [] + } + ] +} \ No newline at end of file diff --git a/Data/Textures/test3.ktx b/Data/Textures/test3.ktx new file mode 100644 index 0000000000000000000000000000000000000000..ac7933ea6b3c3a99b310b5bbaac13524868a9ff4 GIT binary patch literal 1398236 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�Hi5$QV@TgX(_>4XW>%z;!-| zk6!nK_{jA>jLoXd_#cEZ+W-vz*_9xe155o6Y7d~-{~$iB?&noz_>Yc3Z2(Zc52HbB z<oX}R2DJf%l^OmcWAyr8R2fnK!`cBb8q^k$RA%@O!mzp@nTFN<Fd9<-GyIoRf?!bH z55l0jABHjOe}@06N(hXv{?}Ay{I9Ld0LRF6KZvcXj9UML>V0tiuMC|BPzKfinBza7 zx*vwklo<Y-D<kTD^fmyf{s&<jC5HbnY^#h~|AX2Bu=?Lo8CL%@{C8G@VC4EAxeWkr z2Pi@6e&qTe)CPdn{V>{3iQ&J$GQ)ou4XghHl~L<|NE?9Rf2cA9!`c9#x*vo=^*;!M z>U|iFRz}qSptb<44FIbD<CP(GKdAl(VOag2jHL~buFUWsgpuq2Ol73{Uy0#=juOLv zQ2h_Wu(}^c7b-FS2V-SO-4Ck&i<J>=08rfz!l3#eghBN_GDfcdL2OtX0KNYYs{28> zS&0GK20*R<LG1uo{ok$(tN$7PcPc?JsQ&L(X7~@nuyz1){ok()sry0o|3qcf`XAI5 z0M-9fl^OnnFt++1y$t}X|6w$&{ztR{82&F*VgT3up!y$#LG?ZiFI9%s{|x_^L+gH6 z{g2!RK(7DSDkJKCP#a*qGNS$mwF6*vKZxF}jHv%X?EvKZAJPV3_`gF5f?;((jK)^~ z?}yg=u=*d=7C>$T99D+a{|x_+DnT%)-UrqHFbt~uLHHDj_5XQz{SRvgpw|DOwg7Vd z4`~B1{J*9I!Pk{h>wn}n0I2>4VMrT*;s0GFhX41_>VHss0ECg-01uT>>wn}n0I2>4 zwFA)Wei;9S62t$O$`FjL{s)O6*ZnXyr2c34|6ZBl|2rIYKde0fYXgAleq{VbiQzvw zMy~tO*`PWfRQH20f(@zfL3KVdhSmQdF&G<E=ObfK-4DXZbw7yBsLb#m8H4J05Qd3? z*vOa#TGzv9P`!`94F6e`AsAHeb0{<XN5-J~9vy?~dl2SUX8ezeQR{v_6^8#H465(3 zVNks<q|Epqfl=#zP&)ur-($n@I$wq1zXTM6>V0Gks{3V>8UG_=SlutH%<x|x3x?JE zAX-V8@js~VkHC<6UriZ7gZll*7}Wm<)%%*t4F5qGRR8O!K-vHx8dT>aV^II!K$-DB z2pfXxePxFKAR2^?R2ct*#sENZj*LNdznKcde=}vK{~#Jx|AS~NWk&Eg0Eh-*Yh{N2 zFl?j3@E=t7gD|MhhhYb0#{VD;s{0+48UBMXsP1=BX7~@opn4yM-IW>tLomaCcUa$F zh2g)K3d4VIWmN13s`H^3RR6;;sQw4l{U8jg^MjQc{)2Fc3Z&jguKy#H8UKSYsNRoM zX7~@opn4w}gX?}}#{ZCdA4D_!N3Q>qlo|em>V0IKs?6{ohCy{d2xq7;{s-0j$T%BR z_bVgneo*}n!uiUK|6#aLnc+VO7pXA(2i5y93>yO|Q)c`Rs`nw7;eWX@!~aSoT%*hg z9s{URVfYWiwaN_tvGxB!bw3D$>i-sHrvELVe!miw2C<bH{)6g$2!_=8pt`?Hnc+VO zgX(=4?o(#`kH8H7L3KX}gX(=42G#i>JVlxD{}dHSy$`DUK^Rp3&roLg55wTPUzzd$ zY%pf{KU<mMKfK;oX8b=-nejiU-iKgFy}wAA;Xe$6>V6nrqQdweRQE$LwC-1C_`gD# z;XkO}N5-IWfHlgD|3URW46jpR_z$Z0kukXLS7!VVs`HWY78S<-+ms;~ROf@SGQ<BJ zDh&U3DkCtw-dAS)zXysz{r|nn4F5s+0I1)Ogh6#b2p>{m{C`-P0ghqyK8QXB>h~){ z`v0){|CBPr|5M70|3Nfz-Up5UpH*h~55u7P9)vF_GlItfE~qg4zo?9g!F9ee<NqsA z465_NSefDfH5G>cpgJEJgX(-3zNO6gA5`bxR%U?H@OmFq_e1;rpgJFhAE+??2i5ry z%<%uAG6aL_eGq=4!tfu2L3KYm2G#p7lo|iOP-XyQSly3IzgA}aj}5<7X7~@n?^GE6 zgD|M>$A&@m{wHO||LFL$GQ)pl{8gFZKQ0Wb`+q1i{)b^uy^p{Q|9>i@;y<ANJ`x7i z^)N9I8y){sVfg=F8FTy>R?p+2k?VdC8&vNjV{COls11Ov{s*-M(CdE?A5s4^{O49i zVC23(sP2bh-1R@he<5X54665GSVV>4KhFAJ8BzCx+5pIPKZuRJ{%80Ps{27$P6dA( z095~jFmnB`tjzEqx&8;Sk?VgD8&vNjV^F;hYX^YX$n`&n4XXP=7*yvQ3{?HE0;%^w zbw3CbuKyu*KQ-$AKxo~Mt^NnK13+~@2*c`q7>!)_gV?b8KMvdmfYkly^*?$W09N;d zXi(h`!kG0x!+%))pM%y0fYtr^(7GR6{SRsffZ70{`X7Wr^*#&}Q~&=%oBs#Z{SeIX zA6EZ^+5jL7>idImn+hYe4FGBjK-vJHx*vpLbw7yiQGwO}4FCI-5%vEB6^8$?`X5At z>wgsnjQStc27uN5AR1Qx&r*TZ{h<0Egh6cpP~8v1u=;;KQr!<~1HkHj5RIt+8U8O- zCZ_&p_`gP(0p13{S^ujr;I02b?EqZ$Kd3DLY6HOPeh>|+_hFdW`XAI50M-2<OltiP z8vBRU|1cU{|0^^62i5-|jNAr5um3^q0DSd7s4ak6|AXp&R1EI-<Ej54Z2(BUkE{O2 z)dqmo{V*E2?gz24)%_qbP~8v0pt>K1DXIUzsE||tqt^MzZ2(wZ52Hc#Ju(}_N5(ko ze^o|s|DQpH;XjiKgbiv7fY|65R`0W_GW<uzY$^=@abZxM55k-(jQ^1_mkPswbj+;^ zsrz|U82-aBtj<TK`BfSJgRp=K<9`Td_%EP>R`07Y{1=8|P`!_gL2Upr6^8%F7*yvY zV@XxU|57Tb7~c0+VfZhr3c;XyA05l9GX7UkL0}~nhW{|Etjh2ogjG}+{=+c1-dAD# zua1N@R2crlFsT05QepUyj6roj2<xgc{?}7sz`&roAA}8682^K?kqQHt2JQJr?gN;p zF#HE$aNl2*5j+N9p~CndhOJZ>{#&au{D;w?em^p{Q(^oM!3_T$R1nxvmEpgW3IfCX z{;CZBT~!(WyQv_shYG`gWDM&2gRr+MBX|tJM}^@(48z6%{8bqL2cTev|3NAU4C?!X zaHuNd|1cF8X80eW0>P204F5qmN`>J+41?<Z7!}6<ARMQ{@E?ZbRT=&#s30)7-dAD# zpRB_8KShNB1%vATG!@4GAPlPeA(-KRmI^A)Rbl)OuK!gS|L1`*!~Z-LhX0_tzd(iI zKL~^R{xDpu%J{!T1%w&?m#8rOFIQ#wUk0TsR2crlFsKbsrNa2XN|gbOL4AK1t^@S} zK%G9M1kj|y@E?Xjbv}p<qFYrM|AR27?r&3J_}{L|@V`R^fkAaY2zRS6{s-0jJt_?U zK^R=`t1$fUhhk9O55f~w8UIgGVSr;$-yejhsxtharh>rWdS8X{|4dZ|Fb38AFg!<v z@jncM>i+pEO#kPpF#Mmd%J6@I3MyW#!uTJALG}I;6^8#Hyi}Fp|1uQ>2KD_xc%=&C z|5aej@PCyG1g}+L_z%ONx*vqst1^Pe05+&F{D<L9p!#2x@&9I3#{ZyxKQi8~!t{Te z3d8^Hs*t`vsQ(YcyHpte!|)yzhW{|UPle$>G6uB)4yrKz2h*wy{|~7kFsR-?qQdYW zhGBI-m{wu<e?o=v{|OaP-yg(g_<tG{|44BUDhtl2K>Gh6`kV^Ge`E}*`$71kD&zl4 zDlp9O|B?y_GycD-%JBb+3Imu1_5IQD4Hd@!Fnmje;Xe%DR%Q4P!go{{{=+b+4RBwD z@&A2Q1~7i0!tfs*gX;cADh&T&7*yvY<EN?&|DUN~VtC!J!ubEC3giD*7?|PzYh{N2 zZ&Xk*tlo#w?^PN9e^9}O8UBA#f#A=o4F5qGRNrI6pfP}NDvbY8F~k2KDwz1ED#L#e z2Fd+WVfc@XL3KTh4`TmSVf+uGLHMsK!+#J4)%g(2_#Z@r#E_#O#AYO+{%2BQ_|Kw( zTK9w60l4aZkT|IB2Vvy8AIw%IuKowL1CZ-}5F1qY^Q%JYd{DiQjA8wMSlthzk?VdK zTU3?w`d><g;lB(N6R!Um{wt^;FuwX9)DA$d`$242-4COY>wXX$RQH3ht}4TS5JqnU zfa-n_2G#u_46pw|k&c8xbw3DWum2JCJ~8#b9iI9h)E012fz<t=`X7X0Z2;uDAI65% z|B&&2Slthzk?VidHUOgThqVJ>^*^Ky!0<mz1%g3s08rfz!?5}vM1$)77!`*9AdIX2 z2ek!2b$_xdYTXZN3*f5%GgXPJ|3Pg4P~8v1sP#Xj?#EaEgW3VGx*tTt>i$|)#{b~@ zA1UrZ%tlpu)&GdPAJz_l)&J;i09f4*qG5GEh=$euAR1i%t1?in{$HsIsrT{M{|x^@ z?EqNa52BIlfAls0sNRRw{~$K3?g!DZx*tL#>i@l}IO=~DhW`f%)c>G%0J!c4%>k$| z{69`){ST`9K^VF22eCnQKL~^Be-MV$`=GiXf|2Wg5F20pe}h2%4{8U%>V6Q7UiX9e z==DFS9Y9X~4`~B1{C}l_iqY$T5Fb|egJ{(HpW*)p6$D1F|M9i~R6+GW!~bt8s2Ehw zBV$nA55gcZSX~dJLG?T`8(jaZF#P|c0;&5!bv+FKQz20Qt1|otw*x?J0afTYfGQ(+ zJb+o1=|8h70~~|udu$j~*CS(gRmT4?46E-sRT=&xV=gs@|KL79sNau-L3KU|^Qtn! z#{qcN82*Fmd~^(}`vp}Q{=+b+&PT_f`W_u4_y5IJ8UKU&{OA}m2Eg!NS`~p|bw7*- z_4m;+tnOD-g|q=ceSTyNs`EiuRh98S2&=0y{71%`s*wIahz4O$oe#p=s*L|Z7*yvY zV}0m20Eh-*P@RvAja3=`8>upZihLAos>=8ugw0hM{+p{Z{s+;JzCXi%OH~L4_5YEv ztt#Vx7zWk($Qab`N5-If-&vLMzq2X>7=!A47<N}>_z%Oddf!8p;lHOE!+&p81P0an zAndEk_#cEp^*#&-sxthCVOYHnqJvc#|AXp%2!_=Ap!z=?+V6+e{UAD8mGM6WL+X7{ z-5;yU@E_FgN5-IfKT(z8KL~^Bei#PV`>KrpQ=u5t_fJ=4`k$`G@E=s~BV*7wK(;F5 ze^CD)j8z%_=c+RN&qu?Bs*K<<08qalf)RCpsVb!Z4;ll2;YwA;|COo?a15&ZtJN6) zgD|M>hhWV0pRoELL^rE4{s&=DzaNZMA^m<(-yeoSV*s71jQ>Fx)c5aJW%v)my{ZiV zVHno;2hpH@|3p=W|1b=y`zNb1{0CuBy${2nF@Wi+4F5qGRPV#^EH%devsDpzjtay7 zxvCHh>h~jK&=|l%RmT4y4C?zYR%Q4P!k~UXG6szSELUax55l0nKdA19;nk`P|3Mhu z_g7{74`Q!ZW%!SbL3RH|Xuls+@5AsG6^8#?RS_6e@5As8HOButRUsHw@9$P+_z%ON zx*vpL{r~-{jQ>FxRPQ6>!>SDbVHi~BgYZ#R#{V#UT$SNJ41@arCsi5#gD^(_|NsC0 zXVe(}pH*f2e^wRJ_lMEvRT=+-FsR;#V21yf)FAc#WmSg%Fbt~qVfdOF<Nxcbs2Ei5 z-&AGz52Hc-eq;=)_wTAQ{=cir0LGxY9~nPXW%!SbL3KU|KUQP-|45bLKd8@-jzMDp z&s7=!BV$mVkBncdGW^GeL3KU|zg1-fj|YJ2d~}Rl?|)Qf_z%ONIv*SUs>=8u6{FVs zpmxA_Rfhi{465((VOX92Tb1!Y48!XA-_U+Pj1Qy#t1?2y1Jtn0|3mA1Nc|6L2cTl) zx*x^{)&C$ih{lB>bw9&@c2xvMuKPi3T=hS!O#rI%c~lwxgD{8<!szusj1Q~(VKlh@ zS7rDw48<a94FA#Ve-Izm1_0In$XHU9;Xg7)uKz)7Slthz<<uDeL+XEq|MIE`3~B?w z>VFW8T>pdEkouqDzp5$(BiH{LYN+);tPKFF`@vWZ((i}00rb=$^8lc_ABMs8zba(h zpHTg8s)nflL2UpKhSmQt8rBA|QDgWI!nUdm|3MhJ{<l|U_z%LcHUOmlht&O`HUO;d z2hnb7i25JY4gl5tAPlPiK^VCW0AhpcelS*J`0uX@!2xQB`X9L+0IL5%I8>G4KMcd_ zfAls$lp3i1XZRnjiol@yAB2(Xe-Il~_rox({s+-1YKZzjRh0o;_ow5j|FhK~^**TX z2jM(5)HVRD{s+;;sto^;F{u6rVOZS{qAS!8bw8*bKuY}&s{270RQE$L!~a%Q2yRnD zZ3DpTe>H~xoobM}A5{PMs3GcqP&)ur_k-{RHALMHY6BqG|LAQ1P~DG=L2Urk`k&$d zY-rt&s|^6E`xmM*{0CuB-4DV`)ENHbtp8OR{=@2i5DlvPVHi~JuLITpsto_vsiD^Y zptb<0{s&=L-M?9t;Xep(Q6p6UGyLDF%J6@e3Zm`@wE;kNKQac@{rgoJ{=+b=4RA;e zQUAl*0Y}vs{v%^p{STr+bw3E>uKz)80DSd7!~ct_#Mb`||F5eeFs$B((a3c_hz+U# zA$32f4S-ztgV+z$Q0sqKTL4!7gJ=*&Zv!CL{V?`RRfhjC{7Q}CKL}%M1AxR}^*@LP z;rFTx|Isn19RREQk!kccz!x=8{m=0Kt12c2)%_q0s{4^KzBT|z4pi48V^CcW<Ad19 z7+?L*q{j50NsZw@qdEha2C<PbsGdj1ENYDZVVF&g@jnDJ{AW``U|7A+p~mnZ8H4J4 zY?xb}@jnRjs4@QMQDcB(P@NCLeCiDUK^VjqP-FOyj$!q_kQ(EEFji;yFQm@!A5`xn zV=*<x|L7RG-j`5g`Y)l*@Lx&|6@%)05SCG6{Ev)5b-$b%!+#J~P-FOy4TI`_B{jzX zFj_^8@xO{10~~|ue>F9R|1b=$`$6@;8pD50b;keTx?hdqzZMj0t1<kCVI6hG|KPeG zRR60n{?}J$`VXrA4b&O_8>lh;H&SEx4`Q3BF@o7Bo&W#;!F_*_9H{;`Q)BvXp~irM zL3O{C8smR3R)^I4pt>J~?bI0l!!W4MhhYab#{W)W%<$hy4N>>Is4@HpVNksf!yamk z|2@<g;22czgRqx6<9`tLQDgiM!@lYa|9#aM{`;vj{0G(h$T&!i@jo&SR%7@dq7K1f zY7GBj7*zL1s4@NrVNksvrN;0dgrn6Vb$^T+!+#J4)%_qGr^fg{L5%?ggX;ezHOBuS z4665GI8~kDf0`NugX(@5&QfFikH8H7L3MwQI>Ubu2G#p8oUhIZ9tS8;WBd=Q_Y2h+ z{uil3aEThje`H*y#`qtELG?ZiSE@tC0IHz<eh^)w&h#JD_pei9`d_Dp+5c}+WBd=p zEouz^kuj+5hv5!2#{UousrNy3f0sJLe^9-TjQi9W|3fgte^A{I!;{n){=+b+-Us0+ zYK;G<s5AVZriQ>X)ENK6FsSYa;o0g8|3P?;8pD4OhSmM^)ENJR@B%f){}9aZf1x_0 z?q8(F@E=s~!|+md#{bLIK$zkGGBt+(%b|FMI>Y}}YN!}g|F2PF{J%yGQtyN6eh^-- z&iH?W8Ulmr{!MC3|2L^K{0G(f$atF?<9`?i_4`41r#i#`9cm2!cOhX=y${2C)ENKo zQ)58Ept}En8pD4W2G#u_d_;}mKQe~Z{m0Z9{)6xdHHQB%466H2sWF24`sn!|)c-%H z#`yoNI^%y34Z`Qu7{Go13+fF2L2PipAJq4UVo=}ziW=j87zXwGuc<Nozpl>kA4K0! zWB8AZLH&OazNN<aAB69yG5&{OhW~fe82;Z=gVg^Z8iYZ0K01B`>hGgrP`&>|o$)`6 z2C<*1G5$x!pt}Es8pD4W2G#lK_>CIle@x8q|E(Is|99#L8pQsf#_%5<gX;cIYK;Gp z@fS6Q|LFLe8pD5V7`fj6p~m<h8UIpa{Qpah0R#Vmii7HW5E~i)Q)B#(i5b9R=<yG$ z_hB@0-H(k8Y74;Xein6x{~(N9@1wJk>wa`Layx)qo#8(SBiH>fHmJ@A)%_rh%tmhm zfcT&~9~~pt|Dx)Q|6v%p9U!j8@E?Rhbw3QFw*f$Wc-^ng@Lxt9QtyN6eh`*dXZR1p z=<NV-{jbLGUr8N;k?VgD8&>zjXjmISQ=Q>Ihz+azVKj36k7xrh{MT1!_^$`8^Fj4K z3>&KxQU9wm{5Mm_QU9wm{I^1@|83O~^*_8FpvLguK^=lYbw4r&)&0mA)CO=@N7Vhu z?Ep~S55lmz-$#w%KXUyKY6E~UtPK#T4y*qe{s*Z+Fs%Lu(Xjd-L`SGI{71&H`X5At z>V6mo*Z=Aa|KrqA>wi#t095ybFs$xRQDgXzT>pdG0kHZ%L!I$I2xqA={D)ys-4Daa z^*@MRpvLeYhGF$Th(@XZ)fxVmK{0au4`PGreK1yM_+O*W@V{COLSwK08Nl^_gF2+{ zZ-&yab^xsYZ&wG^{|x^-)F2pE|D(47`qUWyBV$<oKT#b~|HIk=pt>K1VQqlv>WKOu z)DD=X2C4gz>wj1q095zG@B%f4{~!#i|3NgU{s&>?`hTf9r0xgR{~!!%1Ayv(7)EXf zfa-o22G#u_466S@7`Y7qs{4^KtPQYL9Z~;-+X3nf|6%n%h(>M$fY_imz#esm{~(Oq z2EbMSA67@L|6y$bP~8v1$o2n8b;kdvu(ba`^*^ZYKda90|C|~KgW3Tgn&CgJ{s++@ zjNA^mtd6Mvuc$Np2Vq$K528UBxeWkfgX;cU>J0y37*zLz@LhF8I{;MwgD`si|4^Ob zKejdisLsb;|1<o5rUt>Vx*wTFZUeklXZ#PsZ`2t6qhnB=4{Ha2*ywdXj1R8+)fxVO zLc-|v|5tT}|1gZT9iYbW|A#tujNS$S)%P$l5E~l?wE_O9L+bs1Y7iP*{ST`9VHi~B zGpjSg#{)oYWQ<<-gX(_}W>;tUj|(H$`<&{G|G`*;;XkJaq|OJ``^Xqx@2fNX=S9Mx z`X3z&sx$r<RA)fJ$o0Rl2IGGahSm89n&H0~sLoes_%9B{uzDYvmR4u{kB-4@0Ck4{ zvKkN!tMid*SpBc4&iG$Z15)S1>V6Qds?P8q8N=#*b#=!7APlPakukj9S7-dMt<Lx# zROcfwq}~VB{V)ux_hGcLI>UcZ8vs52L4AHxb%y^S466G<*ixPGKQac@`ygzs!SEl1 zLG?Zi!|HuIb%y`;8jyM)R{w)&XLW}E$QWGzt26v})nND!s{3IWR`+|VGyVr*P~8v1 z;Cdg__lIIoz3;EV2p$Ij)%y?(sq;Z~f3P~ke-H-M`!Ecu_ruj0{(~^A?vK=fv;(3+ zeSav1*ZmrhdLLBx!*HTH<9`?i)%`FGs`rsGxb9bH{GSf3_d#`khC0LlObv$r+3FAs ztNU{`82^KCzB<EyWL&7u@E?Rh^*#)jsxyMe07{|tKB)dL*I@h)!r;C?sQ(Ye)#^<D zt2G$F7}N#;VQlq3sJ;i`Mh%AlAR2^Q)fvI#03aGv??W)d|8{kT|D8w}RQJPhuR6nj z7>3pV{pt+=LG?Z|o~+LBABJId|5Ode|DbvwhC%iI40VS8Gc_O>RQJR1Ty@6(Fbu2v z=czONpRWP!`-A%b>J0xub^l^@#{VD;>idK0ei#PV{pt+=m#Z`Uht>TcdZh-#|JCXc z46FOssx$rvVNkt~zzqL4szWex-49}e>V0Gks{6NVF#LyMP~8v0;5uKO@&9f(hSdF_ z`hUMV!+&H9>-!(nVE7Nhpt>K1VfFq|b%y^i46FY^^htGw|1gZL{)g24p#DF@|MQ^! zzB&_>hVVi4J`7*fVEhlN_b;n6z-dsue^rCwKMaHFePj%(_iw5*{=ccg0LHMoA4K2Q zVE7NJ`;jrI?!T|W@E?Xj^*%C&wE-T3`u*yR|3URX0yF%7qR#ODITnmu_k-A=`W}H9 z{=Zg-U|9YC7S!)ohxGqJ^*%EGsLuEw6*K(*h*a;x+5n$582*DWtj<TKVfFuab;keS zH5lL+SN#tX|Ea<F|F=41JOD()Fs$we@nP)0>P-K^ScBpJe|3icf59~7`Y%|$k4%H= zdk`Pi769?VScBm|vj(Kk532K#F|N8FCJt)@fa`ux8vsxJ4{8g5+5pIPKa7oD|MP30 z*8QNi0I~JID74<kSN}_DAlLs4|D~b*eo)_^VEwPo0IvH%^*;!M>U|hSuKQtZP#XYL z_k%EU-4A1f+5n)sAA})wKf`|=bqLngU;y|1@zwu^8kp-pOx2mdb-$?wr0<Ve|1<oz zg!cVGbw3Eh>V6Q7UjL)F0g&r{5Zgta;XeoyU;i`w_tt>+{jt>lpmqSP{tr}#v;jbM zKMcd_e-I6-`(YT=2EbPTgW3Wy>J0y5H6R#P_k(Cy-4CK+b$^mN!~bLrNZ%jU2EeTU z8UB-7|0A~niZzI>{~`50vGqTw?gwE|-4DW`dLPvP2hqrNKeg+BP&)wB1_0InAPlSj zr>iskC#L=fwF5wPKM3Qm{~7+n>V6PSS^dxOe?7GB2ekn}bv`oQtikvnrT$k()cv3~ z0I2Q<VbuDc;s0)E-yd834{8g5+5n)sAB16bKa2*o0bq4Mhz8aB$2B1H03e!_`v05; zq~3?L1t4PpsP#Xn?nhv%*Z=B>x*yaAK(6~iZ1nmc)DD2u|B$+$wE7=X=fmoL5RG2{ zgW3Vebw7xWsQV%HKB(@8VOZS{qCs^(2qV|~FgCdUS4Y(Qur>gwp2vkj^*;!M`u(7~ z9)@9c{%>`L{~!$N^MmSpV(Nb;4Tk>^%!o!q#6k5vGG@_a_>YWPH5mS5!yFon{}Gts zKZgbcgZlh1%%zDK1K`nM_>YcZbv}sZ(`5J$!=O4J9fRwA4aWaMXc*M@hhT>PBAN{U z#WXN6y#Ci<{4W8;k{S&EkukX5*I@WBgM?xAKa5t;VEm834F4505cR*3Cc}RaR@Pwn zkBrqc82_tjFu<|82E%`3tfj&D9~pz{eh}8tWcUxlpn4w}8)z{82V+eJFb%5n4K*Nr ze<MxI`Cl_lNZ%ja|JPvrZw|%`|IIZR{#$84>wYL3RQDreI}OJFb{dd=Kd9aZVFyiy z{~+wB!SEl3!S%id!+#ej2G#vA?4iN<9~paUF#Pw@gkVs;kBt35eSRng)%*S$4F3Z( z8UBOoeGP{HK~M~@`!yK<hk`M~|4<DG2G#!&8VvtIbw4tW(O~$GjN$daCgcBj4Fpb9 zXZR1oNg53QK^Ro`gK&x_<Nq`b1Wwmr_z%Jvnvi}!sP7NMpfP|P4aWZ<oU6g`ABGDw z82-aBsNM(RA`Qm>#TpDK7~KEYVEkVO?fZlJ|K%DC|ErKNyzbXz{9mg9!<g|8s`o({ zRPVQFF#d;NhW{-Z4F6l9xJ{Gce}@JFgT?^5G#LMbaJL4-e;Dr3Wcc5wfxw{tKL}6I zWcWWx1A#&HJ_t|IVEhlN_aT_!|5Ocz|1*#<sQ*7plkq<Y&(UD~KSzTBjOVH|{GX?R zz@WMxh8Jlt{)b?O|BE#cc!?&%|798oyh4NVKNxE={9mboiq~i`{)b^u-+!$J!+#Lo zpuzAT8H4M84aWbVIv;`={%_V`_`gMy;r})b1P0anAiP79@&7IjWX$k?j|M8<tHJOe zh7V{kg2w?4XfXT-VNl%<!$&k2{v+dK8jRrnKZri2$?zXk?}P9OO~(JHG!Phl{O^n= z!+%hn55k~2A4Y@N7c?0EgD|Mye^G<sKL~^R{#P^@{v%^p-~XB>BX|wK4Go6>H#8Xk zLug39AJqT9rOEIg)aOUX_cR#)-_u|KV^E!sjvr_;{(q!_il1mQ{C}*$@E=6O@KX(j z|LFLI2IGHZ{8F9q|4R)9IDVtS@E;p~r@{CiT=#1*{s*z&X)^qOuYrj{_5LRfhX3do zRPQ6>FPaShziD8{u(}^a|IlRo55k~&9v}Xr!SEj$gX()2AH>Fm(c>Rd_k-$sYS;ge z`W{yA!)RFD529i9Ka7pD{?|a%{h&4gdfgA>qu2c)KCJE+)}XBZ2ek!|>wXv;R`-Kw zMBNW+2M}BTBkF!oI{>-v2eFaseh?c}_k%E~?gwGyx*x;_*ZrV20KEQZ_>Zgp|M&0T zf6D5A25|k4+y(&E{U8jh`$07E^*_UZ4`S+nO@{xVx*vo=^*@M))%`FU)CLFv*ZrV2 z0Hp2*wE<xDKYAMgx$XzCvDg0$|Kl}q*Z+t%0Hp3GSpRDx>V8lg09N;dXi(h`!l3%U zNE5aG2ek)4bw3D0>VD810BZdYYYWs6sQ()@82*!8|7#-Zeoz~Lw)H=x?gzC22-p7% z{}&<E{h)RL*7{$Q;r|LM)c>2nZ2$&v-A}0ghqM70{_oO&V5-*t8VvtIbw3D$>V6mo z*Z-Of;C29d`F~miv;K#*0YG&>2qV}3pf&(<-49|T>VL>Q0Ic4J(V)5?ghBN`2;-~& zLG1vV)&H7^dLPyXc%?~1{jbUJA6NYkY7?N>{UAPa-49~ptN%gm0#Mx#!l1ezhDoXa zVRb)<2G#vA8pH<Sf0~StIRLZ-z^n<X`x*W-XhQ0L7$4Lw0I@+BxxbIhX4PW+55jDk zjQ>$F!+$nS2!_@BAes}@--lvQ-H#1}+5o(ojQ@Ex8Ne7+-($o4T8#e%G*L0AzK3C9 zEr$Ov4C?ozV{uK!|Hv5D?+4SG4F4sy82(FXqGDK`529r?8UKT@oF?Oc2xj;%r-{Id zn$Y?m+V2PT{Xtk+i}61Qt7tO(hhcENuL&6kP}gMq55gLnjQ?R6T<>c#{MSappt>J~ zb+s7(gX(=fO~(Jo*Z@}lYcc#c)MEH=q{;LjXa8T55!?;{wFN-^e+x~9|1b<11At*` zO~(H=nhYq|UX$TJ41?-@7<SZR{O_a*!VLeNG$9z?|JP*v@2bi8-wlc({eOo4o|+I0 z>;HpjQ2*aYlkq<UGyM0{gkVs;kBmX}ey}DZcnknUgX;beO@{v<9Hz<eABI8oJ`6`{ zGX9U!WPoFEy|2j#9tViiWc-he6EqqA!!W4d55u53AAuSEr)fZNx+cSaP~RVhGqo81 zXK8{k!~ZNzhW|NGoU6s~KTi{ZL3KX}!|Hud-4DW`I=@7d@jncM>V6O|*JAizp^3n- zdcRte@jnQI>VFWf)nfQxhh_YyQIqjM2sdd$`u<It(7wMW!~a%IhX0_xKMZ$jGXC$> zWB}tXO@{w44665G7}o#q*JS+Puf^~m)c1$s$(oG+VHni+2jQt&4F9KTA}~t-AKLey zrOEIggu!*cCd2=^nuxwXXdGa^CgcAFV9fA;fhM%>*JSv=Sd-yDsNP4$pfP~unhgIz z7*zMe@JcPl|En|+7~KEYWca^Ui{bw|O$3JZ|2Jwf{s&=D-M>kb;Xeq2`u#AB(*M_F z{12-4cW5&F2Vq#<zgv^xKL{hY0rqJ!{zqU)zaP~12jPR74F3;7F|6-@RFm=lQB4Lg z2G#p8d|ZnWJO%*j|AX);O@{v<8m;*M59<HJ@Oe$f|K~Ls{)1>xy${Bk4F4}`LHhoe zG#UPbFsRN)##c2N|6kK&fMa;QuL&9lVEBJili@$8-iKjO{eMT3@jnDJ{J*0K?fYv& z#sNV6eQX#u2Jjfv_t!-2`-8>+o@z0I`~S~08UG{W7n%(JVfdvM!+#J4)%(a8HU{uk zlkq<UL+X4`y${3hwIKcf51I`B(J`pbhvCnfjQ>IPJuVEY?_v16CgXn)hSmAV^iM6O z|6r`a`2VK{!~b8J2n?#<VSEr98H4J25FbSU)nxqtPm|$4hz-K%@z1CQs{270QU8PL zeB}Bc#D`&Q^*^Ky0IBa`^*%BUs{270x&8;SvDN<|F<9M?Ory5}K=nTiBiaEB{{=J| z{tIa$>V8~p08uT*{~(NL12FuT&_rNR{SU*~+5w=tUsj9ZKL{h&`!F_g{SRV;>V6Og z)%_q0tNURzsLqGA13+v@-Oun}Llc6L>wXX$RQH20sQw4h$aO!64X*z+A$32b{s*-I zFvovQLF50>`X9uG)%(aay#Ci>_;0O+yZ#5Y0}%B;!+%FDNWBlM|3NgU4FIb9K^Rv5 zyJ<rD{jmBUM1$&n7>3pTKAH^wK^W8q@YiDa55mZ808qUTX$LU;4~EwLp!z>l3sL`r z+5zDDUz6c~q!t7tw*g|I^*@M4)c*|s<Fyd=Kd2o5tN)WV8UI7-e}?}lnh*?X1Ayv( z5Js;5GqoUfKYIO--Ua}*2MV<q{(~^6?uTJm-4CM6G#UPbFsS|qVdORdhz+XyK^Ro` z*Jv{QC#L=f)%_q09{a~q|F>&F>VEV#K(`jde^~twqWd%%z;!=*{XbC)QU6cYWcWWt zli@$8{s&=fZGf5J`X5sFgX(_}2G#u_4665G7*hX3>V8oD55l0jABK_Ze-Il~_rox9 z{f}q^F#KPm3BjQHAB2(H03bG~?gwE|y${2iwHUx-|LARi?V61Lw`)P_eo*}n!k{() zsP0F`pmxAsEr$R5G*L0A?gwE|{SU&hHUNl*)%`FUfBlb{|6z4Mhz8aBu=*cFU(jUu z55l1OA4G%deq;=516<W&_z%L!Z2%A(RPTe@0w5ZMVf8<VzO4nR_d#_(4Bv;={~#KM z5$ynm{|_`7{y)-S_z$c9K{Tk|hhb3t4`M^=eun?gG!d9k{SRsjfZ70%x*yaAVEF$Q z+V4lM|3Pf@x*x_zuKz!4G5m*NZ0!K_`XAH=0AbYnpW**cEr$O;G$9yP--BpS{SKl* z7{o@#pgJFnwHW?`XhQWrs11OOL3KTd529JL82_VVRxO7AEZPkJK{PhZrp@r5T?-R~ z>U?C(rN#K48;lwLb8DeuP~Fd`1sMkb(J&0F^O0!*ZHE7XTBsOS?}KO&ZN~o~465%D znBl*u7Q=sWP@S*E@LvKA!|HwzEv3!)Us?+pL+X7{-4DWY+6@2YwNNpr&Ie&7Eyn*~ zTASg&vK9iv>U~u$#{V!3uJ^T=!2N$sEr$Q-7+mjbG5*&9_4(1To;JgOJxzxH`dSDK zs`p{oSc~yL2&1?E%(NK(n}X_pEr$Ofwz(F=e-O6NX8dod1;fyKUmHT(g4zJu4F5qi z2!rZ<FxF!D@1PCApt>J~L3O^f7UO>y2G#p8?554|-(3rV!S%it<9{zG_SRzj@2$n~ z-$xr#@B3;o{0CuBy${0y+Km4LwLqBRf1nnm-UrwHS`7a~v>5(_>V6mo)&1dG4F5qG zR`-MGC~e07(ORfDPK)V(oHnH12i5&BoT$b4ABI77f3g<Ce-KX5X850~g}@nFjQ>G6 zQ;YFGsNRR+Y%PZWAPlPWk#W8j<Ntgu1~@L#W`xxL+Km5;wGg;Oli`1<7Q=r~osWzw zwHW^+;~H&-|J7Oy|3NgU?gwF<{eLZn|IJ7k)bEGkHZ8{gpn4yMyR;boBV$nA55hg# zjQ@MJ7~mLG_k-{RZN~qgdLM?TXfgap#-O?%hCywB=~|5cL3pMX!+#K-rOohvwiW_| z>wYc9|MQ@Dz81rO5MH1Sss9&hG5m*Nc>S-<@PDZm0)y)Q6<Un{K^Ro$!|*C?hX1Rz zAQ)8VBjfd2jQ=5+;s1Iq2;QW{@E?Rh^*#)5(PsP)!dtZ%|AR2N-q&V;)c@KH|95I3 zFsSa|qs90ijI|m5gX(?|-lxs*AB6X7G5m*NaJ{d^`2V05!~er*7*zKk(_;LOjKTeX zEr$Omw3+^&)M9{R^!$HTi}C+iEr$Of8dT?>(`NX8K?{LFbw3PW(q{aBSqm9M>U~h% z55m{98UA0_LdD>EUyJeoEo}xc2G#p8d`BBJ2Eg$Dt`;L4!|MI}S`7amXhZNrEr$Q- z_=y(de;5YU`>2@V|8p%&4C?p8@GEV`|F5->F~k4YS`ZAb_q7=Qzk_0MzaP~1N5dbr z82=+M!~c(35DcsLLG%}G#{VGvRg3XIHvApd|JP>t{{snw>V16pw-)1n7zWkxAPncj z>V0i!{jbgN|DP7q|NmN;?LSaG55f%E4F5qiI)>N%+K@UQRPQ5WQtE$pZHE7xS_sUg z&F~)?qqhM-bv~>e0Aj;1r0!?<&#wi+p!y$#(c1tZK63q!+6I8s|DZMidfgA=gX(=4 z2G##k+6@1twJ<TP{>Rn^0JRB}v>E;@YBBr=(IAZ61^}^Pbw8NaX85n6&G27c3qpg~ z=xqQ{-4Dmw4F7etAQ)8tgV@ORKZp&g|Mj&Qz;(ZoHfH>T>U>bYA4G#Nr0!?<kEs6{ z{#$B6unn~S2hku5s{3KsUW?&B2&32kpf&)k?g!J_4F6rVAQ-*=2ekz}w4wFCHUqfs zht>Ze8dUegFmnALpbe?}LG?cjgX(?|hSmKr8dUegFsSYaVbuDc;eWIi1Gw%7)&C$2 ztNTH8f;P1N*Jk*is12$6Vf8<98vs=IgRwRPO8uXu4XOV@Z2%C4wE^<95p_SP9e`Z_ zgV>NZ0K@-cEr$Ok+K@H?ayy_x8&>}_{I7)8`{?yQs11N#{x@nd{0HGCZPYdZs67B` z1GH%~{0CuJ{okRDtNv&B-=oa{um3@90a*QyXag|(pQMeu{s*-KrfV_$hhbR#kKP8D zr_Jym8N=#-5DlyQK{UAj*JAj;L>q#U+W?@tABG|IKf`}e{SU&hHUNl*wE@;?gX(`s zy^mi1BewxSb^jJ^hW}f&5O@bt{SRUzw*g>v{~m3I{~(O3{s*-K4rw!h>wgf9-UdLf z`$23({SRsb;I9AAXv6A%(6~RtfAsnv)D}Rl|1W7X{J*S)ia~Wh2!rZ>5JqnU!0LV& zja>hO*vR$&T`h+Hpt>J~Vf8<V##jG?+X31P|DS3h@H1_O{~(Os4nVH|UuiS^2Vq#f zk4(ereq<WG9q>V$;Xeq&>V0GyRQH20sP2bh%=(|<|5q&tMy~r|Y+~zwNWIVS|F;$d z{{_|mS`7dHf$D!K4Ps-f|CzKI|1*K=ejP?|{SV`V#9$b?z6Y^cbr}95V^Dt|7Y2<3 zaOg1nN5{zZK8Ve&!}uSJwHW^MXfwhwtj-71+6@2sv>E>M>p(E5&PT?e`W}Xbv>E@y zFsR;#V21x9+7K+J&F~)?gX(-_EUClrA5`ZfW90f@Mw{V32!rZ<Y*;~?;Xe$6>U|hi z)?xe)!YbN~|6y2Fo8iBj4k`xK{V)t_188Y8{zt|-+6@0eSXYPPKdA0U#|GMr|G`*? z;lF_n!+#@f#{anLe-mv;-yc-}gX(<?ZBYFW!JxX|N}J(741?-@WNfF+_}@;O0gT~w zzYgPnM;*rhPTI(r;lGOxDhAd6APlPWk+GLH!+#L=)`9l@LH&Oy2G#$5+Km4}{eDor z55u5(KS-P5KMaHFeh?1TX8a!p#ti?%v>|<eQ2igF&G;XLL3KX_L+bq)ZHE6K4665$ zF{s{$VNkuFq{HwZgh6#aGEUQG{13ql|1-1^I8%q=KdA19;T&y7@Hha72G#vA466GJ zv>E?{>U?Ajs`HU?nKmPM8~{Xv>i!CChW{W8s{5<7A^m<B4ITr~Vf<gG&4^z8{|D9k z$QV@bw`eo|Z_#D|V^G}>!tFW?|2wo17&Zpbt<4Co_d#_(2={3-{zt~3x*vom>Oks# zQ2h_WurYwC+Km6Ffic7XY1)vwe}*>0e;5YU{V)s~2biPH@E?Rh_5XYwNIL*TgZuxW zF#v5y|9_D-!+#Kl)%_rPsSe}+W!eY~um5!z{;$+Q)c>G1z#45v@K^wd2G#xRv>E=d z*MZdk8?+hz!!Wq+*Jk{`8Qkw@_z$Z4K^Rp3Z_{S@55u5(ABJ~nGyaEQhX1>u^**TX z2VqdZ9~pz{{R7&J{|{(0fHA1<2Vq$Ke?*({KMaHGeQhT2H~^^Me?l8l_k-wD+Km4} z7(D@i>wg`F|7Ud|bwAenUz_nisNRQRSp9zm+7<xOpn4yMLG}L)ZN~pMv>D(SRQKQ3 zfs6xy`~9H4KN1Gj`}edN{(~^6zQ=|iX*2#uV21xsv{CU>9Y~!Is`rsGs15K!oAEy~ z2G#q>_>DHhe{_so_k-B)bs+UUsLn^npt}E)HsgO7hSm9~G{gU|It>56X=7qoosUfa z)M5M&!oRc`|D$72UH?m);Xerf(PsD$!XPma2G#X23=)U2K{R^&!|HoRJoP_%I{>-v z2eEP0{UC8rpC7&M2k}95J~9T^{h&4guKFKZ_aoQ;pmqRq{SRW}uKywRKCJ#1)gfH} z<7)$e>V6m|zy4?VucFQHe^Au_+6@0e?Eup2e@NYr+y(&E{UA(U{m<~<gHZji!|>lv zhv7f0?uXH^x*tS?>V6Q0)c=sWpOpF^y$t}X`xCSo{(~^6?uTK_`k&!{8dBX4Y6sw~ z|8*Gt!|Hwz4XgiA+W-vzi*+FVepnj-RPTfO{~#J${ST`9K^Ro`gK#aL`oBSk0i_*4 zQvI(3>Gy-`eh@~k`$23_-9JH_;Xgg=e^6ThRQH20sNRQRto6S(r0&OG|1<n2rvBfo zgQ)*OZ2(x^529gpKZxF`1F82xbw3P)>V6R3s{<MPhqVD9^*^NU2ekn}bw3P)+5oV+ zA4DJ1X83<xhv7en#;E^w7>KU_L2UpK2KD_x_##^U4{Ha2>U~gK07S#;ei(gS2T}Kf z+5yP*Kd2o5!pQ9a<oX}f1^{97HUOgT2ekuG>wZvMfMETv!|?wF6eHLDAU1m458{LB zd^px-_)kjxkJ%1j`2R&4QvVa%1_0IlFicAQ532J)7*yZGXb>BOLG?dq-xr7mVMZN> z{~!#i<6$(24Z_Si4FAzFsJ_RB*>xEH<HMjjAA~t|8UMpDyv_&J`$(8a8#D&M@Sj%) z6@%(~bS$9D_+L;56$|Mw{D)y-U55W4465(3VbB<WxDMlg5SG+t{13)D4F5rOKL|_d zGW?g;LB+6oA4JRQF#ea<VZgw!zQ3Xl<9`qa_4$#pst&a7*J1b%V#E6X>bi{oL0D6V z@jn7H{MXiD_^+i6p+Rg=zaJUv>oERD#-KjGz7E5GLtRM!A4D7LV2=Nr>N5NXVRLQ9 z|K>UjU<~U2Tk0_UhhbRX-&&X9zm*Qde_JFBs`u@682=+<P~8u~4F8>VP%-itfV&Rk ze+Y)u`Jj5=Q-|R{2!s0mFzl<t2wnr=tHbaggh6$`zb>Q=5U9iOABI8oevl5s|6pAR z4%K1!55wTPUx)F3xDKS>59<3z>M;F}&|&x=jf7)$7{UF25DmidI*kA0br`@nQHS9_ z48!Vv5S^^c_&-$#gc<&)>OkuLbRCBOAPlPaVK_^d@qe}s0~qJ%F#HGMTwO*mov*|A z9~l?wF#Rvoh1C0?x*vo~br>OI|2mBSLG?Zem+Lb8FVkW8Ux|jRbs7GH>VHtZ55jfY z4FBtNG2_2cm+?QS{%_V{{NJp@0LHMsf2$6|e^9?4hC6f_|99#zz;U+@!+#L&(PjMK ztAoIxdcRMH;eWp_q}~VB{UAI^m+}8(9RvpT{io_M{GX=F@PE1v0>k?LGj$mM&jw?L z|Fd-<7}WQltHbagghBm&7+#>u@PDBW0)y&)5MHdq_#ag7BQV4NW!en?m+L?<sNM(R zRl1D-L3p(e<9`qa_50W8F#KPu3&G&NKdAo?#i0KGMjc4MA5`zd@D^Q$|66qs7*zLf z*J1p>O^4w>sNRQRSiQenhv7dAgX(?|-mk;(9~pz{eGopV!}uSB59=`gKdi$5#z%D+ z{vXk1_z$8%7*ziw<C8iJ|4-^L{)f<*@qbzu()S1T|Ih0%{s-0j=X4nUgV^VF8UA0? zLEy_e4FAzFsP4b2!}$M-4#R&?osW(|b^lEr#{VD;s`GE_F#LyL#{YM88UEkVX83<s z2ZBL$J`CU2Vf+um4|N#-LombthdK=ZA8AAIV;zS7APlPWVfdLY<9`tQxenuhRE((i zU+6IWf2qsx|FsTw4666v>M;I)tIGh!pgJFhKj<=o+W;SR82{tKuzLTqF2jEq2G#fI z7<mlfyAI=j7>3pNs5Ha>pE?Zxe?u{-&ktjRXiy!G3;)$&{13waK{S^9532LgF{thb ziJ{m1AU?LbA0)=6OM3keY6qaU0T}*s>p<#$P#XZf{s-~#*Z&Ov1$7`8z5d7520*U= z#dR6}!!W4s2VrdWKd3z*qr>nYgk^OZ{(~@j8vwojM{fgw>U?nDA6ox|_@FibsO|@0 zO&x~+$XH7kfBmngOIiJIszadu*J1dNt^NnK1(5505Zh6Q;Xe%HtN&ef5%s^j4x|kL zs{270R`-KweDy!59RREUK{Rsx4{8U%>VFUos{270RQH2$q%H$S{U4)?yZ%qmMb!VG zb^xgE2VqG452^b>^*;!M>V6Q0)%_qkOBYi2gW3R~x*vqG*Z&OQx*t^kgD|M>2jLQ3 zwEAC%;Xk4Jzgma!Kd3EGtAo4#2ekoUbw7*-wE;l&KL{i0e?;96YX`vUf8;g*sO|@0 zQ2h_Wpt>J~(d+-oIt>3|^*?eO0J;8$v;iP>Kd23WT>m4t0f?*r8U8QTA*TLk_z$Z4 zL6}he4{ihKF#IQ`{@<>P*#>~s{U91t_k%EU-49}e>V6Og)%_rhT>l@@MXmqQ+W?Sy zpSb$}oGw!RugmZsz5c(Xi@*NAs*BkMK(7C9>cZ-N2#sF<gW3V;^*^Ky0IB;y^*;!M z+5n)sABI77J_w`M{|x`1>!4y#-4DW~)c>G%0HyUms2zY_|AY9jHUO;dN2WpbJv#oS z3uy!3s{b+C0y+%fx*uQt&!o%nA0GzQ`N)_>m+?QSu4mC>0Mj5gHVhjJ;Lv6K55u7P z9vwsKe}?}&x|kSL-@`DUF5`a?2KDzbF{I81)%`-c4F6$R7~1!T(V+gnm@eagbPTKW zVYGxE!+%h{kBmWeJ_yU`GX95PNWBlL`#~61|10P+{)b^uoe#rGdJO+nbWt&=&WB+& zXuls+_d_tG{s-6lpt@fd(f0@S|8;a3|AYGfpn4yI8UBO%`v#!?zAl0d>i5GizW%?N z9>aeNT~rM3|AYGdx{&%G)CPcIJ6*>AAPlPW!C05!zr8NQe+NB=|4zCH3~B?o=raC? zVNksf!3_UBbWt&=?uTI?UB>?q%<$hw7t;3!_y2Vn{)6g$7zWq-x(xq=p#6SOy${1- zx{Uu}7*zL%>oEL}&}H}!s{4^KxZVfV{ZI_*`^V}+`u(7KABI8oJ_sl2GX4kE`w-0V zKUtUIe;N`7)%`FG>i2`{ei#PV|GJF-L3KYeF3@H8pRdF4A4G%deGo3vV}y+TgX(@= z#{Zx(01z(Ih1C6^`X7d?bQ!_p03aGv=fiM~9;EKa)&FnQh4%ZA=oVdu|Dd`bghBoO z4qb--APlSbL3Ecc<9|@S55s-B4F8casO|@0P`wYspgJFhr|3fZ{-C-agkfU<GjtjM zgYZmUhW{WuN0;G041?-?7@nug_#ag7!!W4-zetx6JPrV&L4AK1UZThFf0-@<!}|X# zp#6SO-+z@Z!+#K7t;6tt4Yc16tN%gt23^Mg$atd;!~adX4F5rWesl~P1K6g^_#af~ zBV$nif0r)9e-H-M`Eabu@PCgU!~cD{2n?$GLHK|!<9`qa)%^!`8UBMXxZVfV{kn+0 zKdA0Mrpx#rgiq)){)b=&c>n(tmi`~8{|~PBL3KZ<&evfC*ZZKl|AHQ*?+>c?VHmmp ze?^z^Kd8<}#-RTH4PD0nFbwMVgRw5d|66(tkUl@C-w(y0Iv<Ab=|cMapgRA)F2jEq z2G{wz4F4Y?VOZV&M3?bD2!rZ=1ZMdEOczo2ztCm)55k~&A030n0p92`{(qy(fPz8w zJ_x_lWBd=opuRsgj2H)C`2R^4fkAaXG6vW8x{Uw7VZq>fUzg$kcPRd$$M7Fi*W<%~ zbQ$5}0U$Q0jt9{o3}gS*W%v)qI*kASgW3XE;vZD^Gw9)N1HkKkU55Y6x(xq8^*%Dj zR`<iiKy3h6-H%K|+5imyIdu`3OON3{2&1<H(CdFh8-U@zfG#RVum7>N14Q&-^*_UZ zF<l6T)%!3STm27e3qb0BhW|3U2n?$Gkuj|9htLfF6?7T?E9x@*2i5;DjIA92s{dga zR{yK(GW^%jWB8BU1^}^P^}n_*!+#w;hW~oH2&}Ki@E_I&0MW3zA4Y@be2}q;F2jEi z2G##CjNA?YwE?W4^*@M))%_saMh{Z|gW3Rg(7GR1|D(47V0FKX9>afET?BU1L#_Wo z?EzT*?**>^A$32f{s&=f^*^W`0IK_uF|7U%(L>b#VY&?eVf8<H8z4%L@js#s!0;bb z_rox(?uXH^`XAB;fYkk<`aeYvdmA7_kKsS8?g!DZ`acJy4Z!d}PY-+j4{8U1`~KiI z0K@+h(3n3I!|HwzU7-i7{~5r2ep2dxP#XYL=ObfK-4DWTdJO+T7*zj*FsSYaVNm@K z!jSr(;eW3l_WFN<9^-!yo}|n0AB2(Xe{5}l8M+MrK^Ro`gYYaphW{Xp(gx6F_&-k% zf?@SPh+e3NsQ=+@09}Uvp!y$#(c1u^`X7Wr^*#*4>VNb$z&brp{m<}!gDwJt>VFtU zZUaE-e}@0tbQv((0HC@b8SmC*_z%M9^*^XBfL#9{(1X<d==DFSEdZ+fK^Ro`gYXGm z2538gnEIdLKco!+8TUU2Y6s{t{0G(lpmqSP?uXH^Hoz5KhW{XpT>pdEu(}^cgZlj- z466S@7~JoN*8d<ja{Yf#4^i*K>VFW8T=&D+pf&)g?gwK%hW}6WAoV_|?nlO;x*r*% zw*k=Wei$FQ{s*-IKp3?R!0`WrF2nziIuMMn{s*-MzUZOX{|x`X=|V89?g!DJ`X7dI zwE;l&JV*}Q=htQY590sPWB3okpgJE$gV@Lzx$FnAL3KX}!`cDNdW`=;7{q7RWB8Ab zVRb*NKI4BFX4hl<j}L?DeolRc|L7Q0-=kwt{m-k%_#cKr^*tEtG5qI)Vt##w|1d15 z$M7E+!|QxK#{a@dSVWKEKROoIWB3olpgJEJOX@TJ2VrSF#{bfK3~&sq`(^bQ|HH7H z9^-#>tf<HE9~r~yer0{e{~)ZY$M_!^tLZWP2Vr%6hW{W8s`rtxwjSeuWDKhJL0DHG z(gpz4`^Xqn_k*yZ9^-!yHqvAG55k~0N5-al4F5qGR`;9hGyJ#IWBhNa2cjANgX(-3 zw$@|(532K#vArI{e`E}*_d(cEpYgx59x`V553c+58UDLMF{thbVNjh9!=8E!|3TPG zkKsQEgX?@fhX1}$><60n2lfB;82<<8F`(dJJx0hFfF9$25F1qYgK)SW!+&H9uKV>E z|3~UE{s-0j2+Z(5Ru6&W^ceobaJ)X_|3p0yX850|$M8Q%kKuo^J_Lj6ePj$82T0dr z{12-4VK`Ht@qe}+0)y&)5YE+y)cc^iABMsGe?7+kpuRr>GyE^rLts$<AB4;G82^Ln zeF$dwU!lkFze<<kf3+UNe^9?4hCzM*T74|*|Mi&uH|jI|Z_-0xP#d6CkMV!2KBV3U z)%_scsmJ&q8H4KnE<H%S532iNxL=R)KMaHF{Rw&u|3P@N9>afR466I5>M{PG4#y1t zr|UuMem#c&Gokf9sO|@0Q2jqwkKsQE!|HwzJzt;kKe*lp)%{SsSdZ!dVtqut532h? zc)1?qe;5YU`z!Pq{)6yJeTM(5^$>Wi9wTH7K#%c1sNP?v$M7G9H|jC`hhbRV52Ls0 zG5m*NP~8v0+w~a!gYXVLhW{`Os{eQEG5m*NP~8v0d-WOr@7F_MaKB%l;Xk<U*Jt>D zNDqO*^}ZhC|D#Y0s`tTIkKzAueTM(X^_c#j)MJ3-(|VZke@2htKLj)WKd;Atf<g5^ z2w&7^{C`oO;s0elR1B*7LHMd3<9`sorpNdn8Q;`n_>YW1bw3E-)@S?=!guu;|06KN z|NHt3|H1XYK7{>1kKsQu2G#qI^%(y{FvI`H&^jMf?}PADeMtTPT#w;DItJDMFZCGz z!|*FThX3gJtsdilbPTHVVfej1(|=I?|51<OKQ@d~|LZaS|E$OOA5`aKVrZSO$MF9< z5{A|JF#4xH<9`qa@qg<v{zt~3`X0sy*Y*04x*x{=tIzQNpB}@15DmgGHgeeyVuR{_ zWDKkCL1HjAGL5bN$K4KK_|L8f!RU2AjE`RbgZQwzpI49JKRO1r0bq4Mj7F~iVQg^S zug~yb7zv}-|DyVc`XAN~fYFlr4F6#mx&DW-VRb)@hSdKI|K;=`7`g6;u|aJBP~8v0 zkh-7Yzp5Sr<E#HQ^+EMN!+&i(2nN;tAPlSjK{R^(58@l@GyI2PeDy!94FIYCA$31` z8vs=QgRqSr!+#jI)km%WL2Ut8{f}q^F#LDcgJ4+Q52Hc#KMaG~0HC@bgh6#b48!Vv z811LW@ZVn_fnn`{Kz-EuAJPV3_#dhd!LT*}a{Z5J12FuL(qs4^t&gbxL2Uu#`afPD zQul-Ee-MV%{~#K<{s*zs^%?$yFmnBm+y=<eWB3okp!y$#VRb)@F4SZE55q-z4F5s6 zSRZ@+4`~BH>V8oD55l1O9~pz%0odz*28{Y2R`-MIe-H-M{UF?~k6iyV{O{Cb_z$Z8 zyY(6VgD|%Gzh56x_k-&HiTbGZKd3DLs{g@QA5!<D*Z=5k08rhJjA8XZq7A_Cf1w@& zxb6ql{~!#i_hERcKCJ#{_`e)l_rvOc<Te0u{l8WpQTKz|0PFP;^*^W`0IT~q=`sA@ ztdFSwLG1wK`X9Xw0IU09G`9MGKd8@-RR14DYXcnCht>ZK|BvcH@G)5ZuaBtvLG1wi z^*_V^v-+s@Kd3zbss9<k_5Vd2Z2(Z+55w2=82-cXb$!(OAJi5=uKy8j0EYi}^%(x& zL#zKm?Ew%*ZUa2jN3H*n+W?^YAJh&&ulr&Am--C<VHmyc2k~F)W7hwm_5h^*XZZhK zpW**I9CbgeJpgM1fa-o^{6&x9KRQOP`_b8;Iv-T`gD`^4@c*|SCWh7dAUPNtROcgO zT=hSrKEr=Tea8O~8pMY5`C)wIx*x=5f%f}hG_3B2&<y`s^&yx;pW#0`hSm8nn#+I@ zJm$}>&-fn`qt^X=`V9X;7*^+_(?a@;|4}ho-EY9~A5`CC!>~GELZ9(J48!Vv7%ijE z_#Yj^>V8>$hX3+dFs$AO(Mr&MKdA19U`V~MrjMXO{eEN&>i>i4eNBCa{~!#i`*rl8 z^}jyDe^8x|j6wCifj;AZ5C--64Up@813dkIeTM&L1`Pi}bw3D$>U|Jxr4Jbg0MQ_9 zt<UfuhHVTO{)6g%5C+xxFzleu_#cEpb-$xN!+#J4)%`B|4F6#mR`-KwcYVhH5X|u3 zT_4)_*Jt?erO)u+8x8yEGyI2PSp6Sh!1y0j@53;t&JWgS_z%J%29SCmx&DvPXZ#Ps zpn4yMqYNPRKB(@8VQ}5A&-fqI?}uQ9|H$=!6149Rs{27W#engDsy+i8gX?|+#{U@x zjQ>IPJ~GY*)&2Sm|3URWGS1g${13z6x?i8+e~|&he^9*-!>}=cGJVGXpn4yS^%?$` z>ofeXM8Y-tjF2$^ea8Pa1`Pje^+6c3{|D;(!*H`c!+#J4)%h?Q#0J&-FbwMdcj+_y zhhb2?55s->jQ<gs;XkPE2VqdX55u53e~Lcie;9_<{Zpa!{|tSG|1b=$`}G<B&jw?L z|FiWWeSc8>KTn_WKL~^BeF%os`-}7${=+b+?uX$e28{nfbw30%{9mDuz@T~`hF2Ld z{$HaH!Jv8{hSwP|{0G(h$QWGr>ofk}tj7qh_d#_(2yZc9_`gjbf<bjY80$0q-(kS; zf2TeI!|Q#0#{YYu7}WpYtIzNsgb#q~eIyL3`$71S0ptI}`V4Rks`roSL+gHhhW{Wo zxc?6t1JGyqe@dV6|0#Wj|G4UZP`wYs;5uKQ@&5%7HbB(-pt}E(0V8+};EF!ue;9_< z`&acD{$Dd-_z$Y{kukW=*JlKe1Kfi4`)}(rfcyU-8eZ>%>V9ayA5`bV@B;(J{}1(H znBo6JeF%P{5AFZ!GyDg!L3KYmexc9!AA%YFzd)+{;cWl|#{Zx?9~*vW!0`VqsJ=H~ z_zz-(>V9k(RPTS%XZ(+jKkGC6hv6><4FA9C<HoSM|A#)~e;5YU`v}bN|EE4G{sZdo zBVkZo4-*5i(eZzMM(|hwsLzj#Vf8#R4XWp1d=MKMgX(=`45{})a{-WgA7A|sY7fBb zeh>|+|3NgO?q~SVt&hOSeSc8h55wqnKZp;h`x*WV>7!y;|6jy_;XerDt^W-e{!2hH ztlo#w=ygAc532WJSk3@{8vs=QgD|A-2h9O6{8!dz_>WxwgV@ORKZp&g_mMGj{SRUz z*Z&|ksO|@0LiImv4=A|bZ$Rbx-vCnYgX(?|CS3nR>V9g}|AElDA6xwoY6pPoeh`M$ z{gL_%|MAuTao{!pr0z$r|B>4O#Ml1}|6%oi4q6)kR`=)YGyE@vV)XhS)D8f(0YLRX z2!rZ<7^YVJ532h?7*zLzaGL?+e^~wBj#T%9+5oV+A4K;U!0La7|9$$1`hS7}!+%)) z529gpKZpj^`^Xqp_k(Cy{Xfe9Qul-Ee-K8l{}F8fhX3=C>V8lg09N;dXhi+b@P8>% z-4AL9!0LVw4XOVb{;$!8V4~`OeMr9_RQH20a{Ui#2jHszL2Ut08vs`KgJ@8_55vUP z|Dd)2sLqGA13+wS^*^W`fL!*2*r2h0Slthz;q|`(!~Y9V466G<7+d`hY6pPZ066M@ zP+I_0@59;wpgJENgZuq>>VHTZ08;Pcs{gUI0iGE^>U~h%55us!A4I<*q5j9!1|YWn z$JYkHUH_xj`N(YmSX~dJLG?W{`=0@%z6XheFs}Na$$;@cqaove5Dmkix*x_yreXCy zt0BXGWXxv3@E;cj)%hUIX~6g&8H4J61ZMcpZ3w|U1`Pj^F|5u9(fkICkTC!Q#{VF; zfC1xw2xj;%V1TIig$)?~BV$m#kBmWW05JoG|Hv3t@55+GL&pD72B;WR=Yz1UA;W(d z2G#rMSl*EFzk&e*gX?`mhW|<i4F8o4Ay~zL;Xe$6>wN>p|LRCs!+_yG2x}Tb`u<u5 z4F8casO|@0T?5AddIk&_7}WO%VM9>A9|?o<JTf+c*8SlAzais)3j<UP?)Muq{I@b- z_-}2<@E_FgN5*yrjQ?TS!GPgE2s;`w{0Ctt1BU-F4Db6JF#dNnVEpf9zyQY{1`Pj^ zF{tkk!rlgq;4uIn1BU-F4DbINF#ZSi{Slbqe~<wJgZlm;9BRn;Kg<Az8U9BYKyaiX z!+#J4)%`FG>ifqSF#ZSOI0J_NFdT2l@IS!-fx-2@0ptH<1IGU;1`H?|GzO4n!1y18 zL4AJ+X850FfQoYs82^Loe*?z<d2r0|A5`}j7%=<?VNl%<!^MV-|4R%&nBjkk0mJ`t zLx%rlP`bi^;Xe$6+5lAskUoEv0Ry=24;l*qj{z8B?*DEyWcc4?0K$y_TMQV%{eMv1 z4`PEbsP1nwVEEr|$nd|z0D(buKL~dlF#ZSC`#lB>|3MgB?;9}u?}uVg-4DVO4H^GW zG5}$Q|C0<D{!fA8sfG;yrx_qHxZXEl{6Eux0gOR)KMc<?VEhlm;CkPH>Hj<fhX3;o z8U8OYK*fs<82^JXsNP><!0;c0ml`tsUuJ;7pt>J~R~j(>2i5zl3>f~y@LB_g|1b>d z`-AX$Lq_lzzy<?`|1iACfZ_jULkI@d`^b2^0V8-EV7mdN?+@z#!|*Nx#{V!3s`vL8 zF#HGMeFhBwkuj(ZaL|D9KMWr-VE7NipnCs^0mFY72G#q>__!g%{}TqF{y&61ZGaj7 zXABtrpEYCzkNuxBVElj1fB}x-^}iwGe^A|zj;|Up{J)~l@E=5j`u@oHx*_BL8wLn` z%YfnkZ9|6tFdD?ZW5DnqhCywB`v#2v?;A3J@dE>f|LFLU0mFY}465^y@lylF|Ifgf z;XkPEhhb3N|I&c*KMaHFeRTZBfZ;zn2G#k<_`M<H{|^S(FvI^(`VjotfZ;y~gX(*1 z7&H#>&4BSgI{sn6@E;xjG-UV>!@mp|{v%^hT@T~`1=aP)*pT5rSj>>&|33p%j9m7E z*r56yR{z6keFl{F07wl4GyG>UK&|^h?EqYLKS&%@_k%EU-4A9PGW_Q<Kww<;Kd3DL zs{270ROiEJenUu|532W(F{uBKT=#?6$aO!AEow-5{V!#}@L$FNQTKz|0O)l;h>u?X zD?sagT=hSw9e`Z-gV><DAA~{mKZr)I`$23S1BU+~tZT^dAB54{0HC@bgo&yDVQm0& zit2xc|8{ule^5IB)CK_6{jP=#|3Mhm20*U+VQg^yZwQ$KfYtpV8oB=WM`;5f>V8-| z09OA)+5imy!weu8)CK_6{V)ux|3NgU?vF8G_z%Lk>VHsM095xU8=}_zptb<6`ajc< zQ2o#FKhFSyL3KY2qt^eBx*uQt4{8U1>U|gn)%&3Ozt)i9KL~^JJTgYE|C<dV^*^XR z0IK^zn7Z{pr0xgR{~!!%1Ayv(5JqkT!0LVw4XgV>G_39i(ct>ukb!FT|4Ktd-4AL5 z!0LVw4XXP=c)cORe-I6;`$05v{SRsfpw|D;IRFEO|LAQ1Slth!L3KX}?={3z{~IFe zeoz|#z5WNa17P((sO|@0Q2h_Xl+^zhQQ80u|1TLp>U~)KkKP7Aum5ilsQ*Fj09f4* zqS5Pq5Ffejhp|!We?!!IA6NYkY6qa!{|x_M8)DY~p!NXn`k&$d2Ll8~umAD30SwXW ze}@0xs8Roe>U}g!sQw4l`N){bfZ;!*AqYdp1egt({xcggz%i)4$A&?5Ju+rDWc&}q zu=<|Ukl{Zv<}!lx`C)ZGj0V;DAk1sX_#YXA>VGgcWcUxN|3Mg3_X`>_{71&1Iv*W_ z>U(sI-2WFhWc&~6^P^+X7=W}P!+&H9s`rsGsJ=(XpgJFf6%85wgD|Y$52HbKJ_xHC zGX4i)bwh^#$QV@bBV$mV55n4pjQ>FxROcgOeM86?0EmWRP~8v0Mg|Q3jSWE<bN<)V zknukVgX(?=X83Pm0K$y_Ee#pK7}W1a#<qrx|6v%?_lMN|_RxMmsP7NMpnBigknukR zL+X7{-4DX<h7A8<7*_9l7&83#G-CMg4XXR07*y|ru&*KGe-H-M`!F16$nYPAVf8+U z4mM=`532Ve7*g+p>i=+PzaLijgXm~O#{UousrNy3f2<+He^9?48H4KmL_>!EAPlPe zVHjNR8#4Y+g<??OKi!b&f4ULFe^9-Tj6vf7*@le&LH&O?He~ppkA@2k8Np)!png9D zBkKNALrDK0GzI{}m4=M}D-9Xo7*zjPL+gA{y${34bw7v=tN$B8eSc8>55=Imzr_&J z?+5k$VHh+9&}qo{AA~`D|87Hu{~+9J$nYPAVSRrP4eIwpFvI_ehLHMyvLVBN5C+xz zFbt~yryDZ-2VqdX55uzz8UN2l!gCB5{?9dpU{Jpw8H2_E78)}C2Vqd(f3YFMe-H-s z`;jqd3}Cq-<9`qa_5DG0KMb!nWcUxlpn4yK*BLT`#{ocfKQac@{TreEeo(y+!=U<q zt0BXG7zWk*FucQ%@&8UJhSmGK4H^E!FsSYaVNm~nzais)7zX$KL3O_o!~cVZ4F3-! zVNjh9!bc4m|HJTc1IGWLx*vp38Z!KcVQlsPSwl$wAJ*>&@j>kKhK&C~7*y}W@FgQi zy?@z|;Xe$6>U|i#X2|#-RPQ5WP`!WCkl{ZJgZll*7*y}yHDvsM*N_2>L3KX}KQLnW z55f-(8U7<<SiS$)kP$o<0P6EUHDvgYj6wDOb3?}e$QV@TBV$l~j}3$Bd=P$X$Os+} z0QLFNF><~C(U9Rk41?-?Z1}4o<9}2PsqaB`J`8_1WcUxlu>L+a`j-*o|KEm;;Bf#D z4a0w-b^dQC4dcV;|FCfYBh2w1MBNXm^C5LVhz-HWbw7*^s{cW35RD5%>VAg*?1l)8 zT=#?6xaxmcI{>-v=QU#Z55k~29~}!Aq1OMPwg9;PH)QxP48<Zw4FA#Ve-Izm1_0In z$XL>l;Xe#Z8KKtyptb;V{V!+4_#aaLGyIn~L}29lA6FYd)sW#o3?tY78b%ENk?VgD z8@c}1HiGo~VQm0CBP{j5A;W(|C^j;}U;l&J03d8`$nYPAVf8<ZhP44~j2QoeFr*Ct zsrx~Fe^C7o!<h9y!+&RJzaLchgRq+sqW%Z913+~@2!rZ>5JqkTfY_kAAA%YF`x`=V zfDxkpM{Wmz>VFUpHDve?!?5}vy$uj$1gifT{zn@kFsS|qVdVNB#0J&<Fbu2zL3D}{ zqW(`cWB}Lw`09Un8^Dm^f36|J|2!kqHUO;t2hqib4F8casQw3GSlthzD~u3zKd2o5 zs{270R`0`TP@RvALG?cjHybki2af?5GX4kE{UF?GgxUr`)c*|sJE3(ysQ&LULe&4D zb^xgE2jK~ZjNp17RQH20sNWB&`(YSX|AS~y-H(hxZ2;8zpW**(Xx)#i4FIb97aB7B z2Vqd%55h}~82;m|{|y=b!|Hwz4XXQL7+(K_`u#=>|B>r|5F1qggD|Y_htXS%2-W`# z|92WP{NH7OsQW=}08rfz!~2X7_5XfDhW{XZ2wMMxXyi5khz+j$jTrtPg<??M55lmz zA4H$VGXDdr@6Q;4+5iX)s`p_SR`*{tWcYuHsQRDb|8+wICa(U6)cv3~0I2Q<VNl%< z!^rhNjQ!Y%;r}B;hW{WMgpuoi5F5Gfhp}H8GW>_(S4Ir~K^R*b03-&h|3Neezc*y~ zkB&j@09f6ROry5}zJTk0hW}p;F)@1m4{8H|F!uVN;r}lq$eaMEu1Ch8x*o;{u|fEs z5yO8N4Pt{Za^45AnT#0zGa57f2hrFtsGdj0EJlp~kujSQ<9|$ysPj3D82%$;P@Rtr za~m`M2Vou~#{Uq^@Sg`-=Y#5fK4XUeFbt~i(J`pb7cye}kH8H7g^U>fgX(=`EM~;` z9~~pt`w~V>|0RqW{)6g#WDKhFWsDgAqhnCrFK5K?AA}W*82)3!pt@hli19xRs~9o< zS21FMV^ICCX2kFxhCy{d3~L%Q{?{@BVTS)&Mi30D`(aqenBhOT?g!QXMhyS;jT!%g z`u_$-4F5rOK8yyjK^PS0$k@b)@xQ4N!+$d)CNQ=zV)&1YL3O{C5#xUtwlQM(55smw z4F6#mR_{9)G5!Z(CnLuH5DcmJL3O{25yO8F2G#p8>|w<C-@}LjjzRT42zwbb{s&<n zBgX$Q>}$;M-`9}gzn>Aqe^9-TjDw6A|0CmIBZmJW#t<B4#PA=6L3MwG5#xUl2G#pf zMhyQ!INBIe_s1A9{0CuB-4DWXMvVUxj2KWbsQynfV*C%npn4yMQ;iw^rx`&osP2d1 zEF;GM2+Z(5+mPXZju8Zd>U|i_H)aHn0~8oB{s-0jg+>hji;N+-#E9WPGA=V>{13vQ zdLM=>jUjD-DkFyfpt>JSL)kUP4FBt}wEr8782>jJG5l{bV*KA?1gifTz%+;rs{3KM z!-(-e1Vie5P~G2U#PA<f?<3<rBgX$QJi&<JKMYSYV)zfku)2SW5##?U#ti?b86oft zBgX$Q466G<c(yUae-NHy#PA=4VRipJBgX$AyugU@KLj)UUuX=e`xhB8{0G(hFuc^5 z@&7U-5N7zl%!uLtazhASVZ`u%6&eQB|7(mG|F1D(_`ePbuQz7+zrhHBL3RHoBgX%m zj2Zre>U?Cp&4}?o41@apAiUF<;r|XJhX1>eFsR;#;XOu-|3URW4DUB)0N48mj2QmI zFsSYa;Uh+j{}C8b?;kT}_z%J-j2QmI@F^pP|0j(Z|AT1cybof7>i@IGjQ`IWp<+<| zf5C|9|9McIkA^{g|0_m}|6v%^@4sfm@c+6o!+#Kc!-(NOGKTg2Zy7QE2jM$LjQ=5+ z;r|^YhX41BAoV|p24Pse52GI%GyZ>Mgp3*fKQe;U{ZEV;!EFE#4Z_ci82=;V7e-9~ zUl=jKF{sW*#;=VT|GzQ9h8h09HDdVx&KN<1*dL4-{-a}1-T%pm@jo*DV#M$t9e*=o z_>T>P>U$XeVZ`_!8H4)#pgJEN|1pBJ1weH^h>eUv^*k;NigRQPs`D9*8Nl^Fj0TC} z!pL<$j18&(8UC{wVPfREADxZd4gl5t+{TbPA5`xnWAyqTS35w^7*gkh>V0I4T>pz2 zGyaER<aU6#5yO8F2G#vAj9mYN*wV&G^}jL0e;H#)y$`DUL0I0H;Xe$cw*z2xKa57M z|3Pe6-4CM?^*_UZO=C#C53Bz{G;;lq+y>Bxwg*7<J`98EeHccLdk`B`|C@m7e`ALK zX2z&>Kd2pmQvVw>!0Ucc8^G2WQUAl*0ie3y!I<Gc2s;@u{71&1x*r*X+5qmxh`JxS z9RRBPK^Ru|`xr6&N3Q=tZ2%C4wE+T+Vf8=5{~#j>hSmQd8dm><=m=wm|Hv3t|AS~y z-4Day`rnx0f1ELD{SRsnfa-n_hSmKkMhyRv>wi!?09OBJ7&HC{;VdJD|1b=z|3Nfz z{SRUn7%}{ZVOaeSqEYI9V}}1_P>fvvgV^AD-;m)ym?okAZ#G8M{h<0Egkkl6n=z>V zXZYV?1i`TSAH5CGXT<Oy8N=%TiN=WfAJz^4)%`FGYXeL-M%4eHcEBtnNZpTI|HIk< zpt>K17Z@@82VqeC528W!KL{h&|4WS_bw8;72Vqbf0960OFmgKpRQJO$tPKFF|3MhJ z4FIb9kuj_du+<n*|AX5B#ti>q^*@M4ZUcbWpf&)g{@-KF@PD5X1mmm!4;wT5KVpQ5 zL3KX}gX(@5ebN|r{SWT@gX@0=q&5JE&G7$%F$1{%2hkvW38@`$*%(p(UomF*55lne zA4G#NavK1|z6GlPjT!#mf?`nJ55jki5$ym_{SU&hx*tS?>i>tvkUAe!?;~SSoe%2& zgJ=*&)cp+qpBXXye{PJZ`?0kHK=nTiqqYMW{=Xrz{s*-Oz;(Yd!~ai67`^`gYRvE- zhH<q6;B~(-!~Y*h7+3ud5=XB4VQf(S4`PF8WDF|vkukWQH(~q_s{28h*_iP^2qUvW zd>Dq+`7Fi^|B*4fF~fgc7`fi(G-mvdjA8XYsP2bhUSo#;*f6Z#htd2djQ<6VL73q` zsP2bh<hozjnDIXd!|Hql&G26gROcHr{1=B}SiKLUB~2LrgX(;A3?2h8X812_0>Q94 zADM>L|BA+p|3MgB?;A7xS2khzuVl>dUlk3*>V0)%#{VD;s`HVtHna@@qCpr`=ObfK zy^oAxb-$r8<9`q~HfH<}!pLzCVw)N>{WmpcfMal-Z_N1L5($I*{>BXdtxX^pRPVzu zsNT0XX8aGqka{0f_rtKWF~fgk46FZLO&I=z>V6o8)%~8vjQ>FxRQJO$xZVf#{h=6C z@B14wg2w?s^*#hM{0}yU)cYVBghBN_41?<ZaASu5APlSfBTXRf0C3+Q)c-ez^!-8g zf2;|l-UrqFFq~-2_#cKrbw3P)>V0GkuKSG{|EELieNf$>Va)J9(}dxFwlM^Q>U|K- zHD>$|!r;EYF~k3SC@wT+_z%LMdLM>MjTymX0Hx4+A5{OBn=t$bVQ}9c)c=R#8Y9O4 z)y9nfLH&LZ8${#k|AXrNMq{S`AR2^0^*#u<8Z-U})%y_4@W0KN;eRI*2G#vA+-uD6 zABJJ|f4?!qe^9-Tj3*m2{-12j0LHMof2s-Ne^9*-!=QS9hB3qcnI;ens{3Jht})|( z7>3pT^Nbn(&o_bg{XzYIV}}2rx__}T<9`qa_5DG0KMaHGeq)CJ%Z(ZS!|Hwzz0!o? z|7v3hhSmLRjT!!fFsR-~#v6?p{(~@b-49}e>V0Gks{6N_F#LyMP~8v0;5y%!@&9f( zX7~@P`#~67?}PgOPz>w)A2eqC55l0jABJIVfTP9?|6v$Z?;kf|1djti>V8oD&w#!E zZ_M}~)c-#Vs_TuJ{+|ca3~(A$@5As#6UP6bdLMxy_5M{8hW{`Os`p{|h6y8h9N?xg z<Nuq+3}6ha`$6<=6Ndkwx*r*X>i+vC4F6#mRPQ5WSl#~^)bBTD{12-0(eZO*CUCtE zs{3IWR`<U&X8aGrusR==X88XW)Za(Kpguo3{%Fkj9~CqF|A<uY!`c9!O&I=zFs#l; zreXE}cVou?2#i|iBiH{R_D>Ur|G$kfF{qvgVUQe%{%g$mAB;^H{{Jy%`2Qb{G1q^Q zR{t~nXGW{{VQm0hbw5lT)&@YX`#DV*{=@2gWSYkWd;Je;6Ts?z5Y2DG@E?R>^*)Ry zw*D7|*8BMCf7CVr!+&XLzaP~1C#C*ZG=|jsxaxmUdjQl10M-2<j9mAF*jgr#F#u5A z55mZGKZvbs0vh{AVD$PQ)&>C8`N$Z({s)Z#AlLm6Hp71_BI|#9Xx|@i{cp_hpZNNp z;lH;DwC|6l{s*-KVD*2H32Ob1-Ua~G{V)t_17NHFL2ZE;V}}2r`X7X0bw7xP)%_qE zR`(|vGyG3Bf%N@hZ2-*rpW#2b^*?eOpxA`?`X5yHSDP?E>VIPdjU4wNHfa1GROh4A z|0a;R07U%{sr#u@|3m72<Te1P{s&=L{XgB9;Xg6;Kd2o5s{270fBnz!A6EB+Xj<0) zn@t%1qtyS#h`Jxt1_0IlAWTaA4{8s9+5n)s|DXxOe^}iQqd{!|Slthz$*un(Z2&~w z4{8g*>V6Q7sQ(%MUp9tdP`@8m_k(Cy-4CM4s{f4<bw8*LfL!;3*y!~?s2zZ){~7*2 zF^2T{Vf8+YCS3nB{C|y9?<2PZaM%BkdLLBx!!WGw2hpIqAB2(XeHa_F{%83A9jU($ zs_)S;sQw3GP(6=~L3KU|!^HlYFrd``V7>{c9e`H<|NH-+!IbeoqY1-*CKJa0OkkSf zKcg8FoDHh)VVK2);Xe$snlSt)26LD&{)b`ox}VFG;Xg74)%(bp*OU=F4!~!^_@B>| z0R@BVeHa!nW&97qLMDv=kuj*>55^`8|AkE${)?C*u$T$Me-MV%{UBPxgz-NNOPVnJ zN5<fK--O}63>t>D0YEgU|F2-e_#c89{wtV3uo9@xkA^|*01yV%`yi}l!tfu2)lC@w zgRq7v!+#hC*ZrXS9|`N2GW-W&P`!_iLE``hCXD|<7*y|rXd_dG|AwG604ns6u&D{d ze=}2P|KF7HzqttvGyJzShF~ibhW{W8>;Hpj8&ih=b|w%Es`EkE!Gz&I3_F@I{D)x| z6NdlD7*zMeFsT3UVZ!(yhCNN0{(G4~u(t`*e+Y)O0buO_KNH6PAPlPeVHjNZgX(`M z2G{*2jQ>MS8UBZwAaIx|!~X~qhX0_t9~sA(F#eA*VSr;$-4DWXri}mNO<<Vef1)u2 zCz&w(2Vqd%55s9DjQ?R6)b|Ht6G*=w)c1#B&=^3DDZ_sd&NX5955sw;4F3yEAQ)8d z!*G!a<Nsn41{4hH^CROb6NdljxY`uj{|D9ori}mVOrh(4{~;1UgDJ!RMpH&`-@ny_ z;eV4U<Np>DhW{Wo47Zyw{71%}CXjJ}Zezy(aBRZxzYh(A`u`w2!G!VuBohV{466U9 zm@xhaVNl%<!_!Qe{?9N0VMyP9mMP<Z5T0Yg@E?ZfnK1l^VNksf!wXCq|1UCuVTS*U zOc?$zHevX`#1w*;nK1l^VNl<Hxe3Gn6{Zjj>iZ+(H6{%IK^WBc2jO)ljQ=;7FrZ*i z{~v@mnK1s}Y{CG?TTB`LZ!>{lP@RvA!F9h0<NsYI4F7i<L+~CGhW{|U*M#B!K2yg3 z2Tag0!+%iS55q@H82%$;P`!_gkAeFCrVRg28#DetZo=^YlnEmkgJT{P{~-MT|Nk>4 zO#jcAGW-YC{h&G?#6EAz`2T_l0)y&(bbQ5x;Xg74)%_rR&6M#!2!rc>6NdjcOd$P! zQ2+my3B!LFzGKSxABOLlF#f-1!T`shdLJ1-FlGD?!jDWC|HJSTQ-=T8@KY0p|1b=% z`%M`Czd*w;O&I=zFsROdW5Vzs9fRuscP5PgQLrh)|Mw;k{K1srKMa2|Vfc@ZLG?Zi ze=%kJ|HYKy|2Grt7+mk0F#P|4ghBN@KKuu1EC9qt$FMs8j|t;{5E~>98V7(z`~QFc z|ALbOsNM(F_n`59Nd3?JpV^oh+8%(+1;EDsVeJ4A4QmI0Xl(5OHdBWG944q3)ZfR3 zL4AMZdLPE-HD&k@V)L4y*8QNi0IcqZ(V)IR*18`w{tvDHLG?X0466IlF>>7xVx!ml zFg~c>2Vqd%55llIA4G%t{4fk^1Ayv#bPTHdK^Ro`gD|M>2Vrb=Kd9di!=Sn!hLP)k zc-?Qx@ZSJb=Yz)oO&Gv)0Lb+}{QN%?NZk)>16YFUdQ*n~7ElbT_mMHE?gwETQ^x-w zY-hswABOEsnf^PNz%Ziz2ekuSOc?(|Fr+PjtNsVI1HkpaDZ_s+Q$)QFs{29M*M#A} zpDDwCe-i|T)%~D4AB;^Pa{(bHjQ>O77&7(`>i>i4e;9_f0isM1bw8*b0IK^z7+d`h zs`p_SR`-MGG!usZFr03}@E?XVOflO4IVOz%K^Qdl55k~ve^}j*OoQrvFg8Wh|0Sjj z|I17e7}O4^Fl9uk|3P&>XilKUl;M93v>i|jZU4c_fdBvggX?|p`act9aJ}CES_1&; z|3fi&48WA(f14?48=%XS;Xep>n=t%`;T}^&8vs=AgYX1X%z7WW?w?}H@PDca1Wz+% z_&>u0fsx1m=a?}5hhT>PbBz%gy&bT?l;J-JgX(=42KV`)bw9Y?hmQS&*r56!TfGme z`$2fE3B!L7UT2D0_k-F3pt>J~L4AH?yv39WUjL)F19q4){s&=L-4CLX>wZxE59;q@ zwgDjZ{~=R`{~(N9_k-9+O&I>e@G(=!c>i%T#{VETsO|@`PebGXKe+6Nl>eZ5|FkL7 z|8ph`U<|JNjT!!5FlG3E(F7I4`urdoTip+<|3P&=I!3PlLF4|&7*hWu+5pIPKZp&h z^O5PtrcD2zm_RX7TL53(5329s7&;H|%7p3v8!$#~1H3h5{Qu6B0RzM8e^`GXMuX~q zSbdL;2KD>DnJ{8)1Ayv(7)EXbAhXfi0-$;w6*K$?)$yRZ9)$mxFoVbbL2MBI4;>Q# z<#}+~|M%a25Szi2;Xi{Z^M7VjP`{r6Of#E7X;VxZRNsTKDZ_tOGlu`5dY)JeY7cOl zGW<uz$o+p18(iOm`u$+c@E_C$0AWy_kBs@v82^JXsNau_;cWm@hX2B52#nnK2eC!X z82^K?xGCd*5Qg>pB}^IqgRrC-!+#K#GG+LWjA8Y@v>D@nSyRUUvStimEN9B_9~sM= zG5l9FMPN|<kBn7J8U7<<P~8v1pt@h(4AKABG-LR$ZHkIvbw7yKHDmm*XNtg}{=T6p z^M6A#hX0^`Kd2o5qCxl{wD1Q}pd?@l>ie5Q#sJLC82+1^F#NYLVZo^XtxXyKTbnWb z2le}57~cOkMfCe&{eK5jhX0Oc4F8=>AsE#EcQs}F565N<|J_U>*u#Y3zo#hzgX(<{ zA4G$&w;AJqA5#Pd_5DF@01);!WB4Cn3c<mqjQ<gs0n+z3WB3p1^TRN#-UrjB4F4m| z82*Fmeh>!N`=*TlW1$#S_d_tl{{&M62G#vAK8T%c#_&JI6oFIC82+c5LNKWA2jNUJ z#{XHSAk6ST3)=Sw_y5fp{^y!8{LeFm;6hWz{}9aZztEK7e-RWHn=$+c)%)nU+>GHr z2v?Xg{0HGmGsgcQ4665Q%^3cJ<^VwTeyu6<e~{S!f1q;z_kTzo@cVzADbxRYGv@y- zrl7t*!~a%OXx|@1!|HuA#{cbRjQ=}K8Q>UH_k(b^8N+{2y${2%F@Szk#{VD;>idJ* z029p^|AX*kQ^x-w4C?oT@KjT#|DbvwhGF&pOjE}HAPnmJLolTOKi8DuKMcd`ep5zp zoe!$_K^WBUhvCJh4F5qGHU_ZVl=1&^QwBH&*Z*b=|5utZ{9k2?z@WMxgx8uf{0CuB z{SU$$O&R|qV^H6JlPSah&1Mh`>idK6Rx`%`+fAX^jN$)wGlu^=Oi}S}Q-=S@7}O5f zYs&b4pDAbz02LoJW%v)np!y$#51TRkKWd7=$4nW(^*x9_ZU$i^*ZrWr{U31M|NlRz z900Ll_5Nv725_Grq~^RC!+%ga0E91^GW`c*Glu^c%^3b)GDXFpcED9r#{VD;>i5I& zO;d*dFbwPS!)S2bZ^rQdjwvdJjRD+;_V+=3eq@ZO{~7*2Mym5c;{Z?182>*rMaB&O zpP54Nb2EnjApFvl;Xg8dWy<g$hF_a8{C{hTj4}KEu>L+S8r%jjW&Hmcgv}WKe>P(P z_xnM8e`E|A2l#Hv@E;u`*Y_ayPcw%9ApFae;Xfh#+l&#c2HXZPW&Ho!jN$)36Q=)v zVKk`iXT}8W_k+p+aQFW|sQw4l{Y>Dxp6NfR?uUti#Ia#;{f{;mz-G$$9~DE|2B110 zhLP)i5F1qA!!WlQ<A2b2KcfD}Q}=`B{mmHu^P4gJ7cfP|LZ%G=K^VF22eCnQJ~9?H zWB3ok;-(D$K^Ro$BV$nA55vgyKa35o`$6@;DdT@RFh<n>;J!an-4AL9AlLoMri>_c zKd2o5s{7SV8UBMXxc*0CgZSue08qUT!l1ezgpuoi5L@4j0o*14wE@8G0niu#C@nyu z9o+T<F~R+Q&>VmXBX}MF#J4bK#9IG@`ui}9+!nAmW%!SbVQm0h^}ida9e`H<V`~Fo zt@lA=|DgWA8N+{2-4DW``ajSNweAl#W%v)mpz(hY2F(G$+W??B04T;+|Hqm!{Estb z_#bZu!LT|XM1$&m5KcB_{GS5GkiI{x-iOhkx*vo=WB-u)pAkInkKP7=)&Kcsp!y$F z_k(B<hO`0D>wo0_Kd9aZVbJ(LsNWC9pt>K_?>A-mUv0|tA0!4E{|B}Ez;!>Q`TxJs zjNyO18RP#(Q&9h(5j_46ZUZ3I|KPqqQvDCA_d#s|5RI+=?>A-m55u6kABI8oJ~{@~ z|5MEv{=+b+9WdRD@&8OS1~8sw%J3hCXPY7Feoz}=9&8=}+UEz={U8jh`$06Q?gwE| z{lC-<QSZar0HFFGgt68AkouqT|5{VV|Dd{my&0nJM`nZSe-Oso27vbaL4AJ^My~fk zY((7;s{cV4QvV+?LDc)8`X5y9BjdwnjQ@|CLNIvDA3E-T+>{AC?hm3*m@<LK{z3Bq zpga%3kUHR$DWtAHXTtRVf*H$y&^Z4E6XyTt!Qu?yaRBgG0KvMS;r}&L2nO~2ubVOa zhhbPd07Qe^0HzH8Z<|3davK0v|AXlJW(@yf_<<?Ie-M6X2C4T!bw3P)>V6nTZ395+ zeo!0W1!$}vTKB{1dt@3m_7CdwW5cjHfcIt$|3Mg3|HEhy8y$n&0nqv%UmF0u9RRBH zk?~Jc#{Z!DAB55Ce^5P-3;#8RjQRgFX8@1=|2Jd!4;C|H0GIoqG5~}@{eLENM(`Q{ z1`EdjjAjh~87&z8vzS4~17LMOiy7m8WDM%}!}uUJI%YFx_|I;Jib3@~ry0Y4WXxsG z@E?S^%^3b8V^Dt|#OE<*{13u>W{m&&%o*SqRPTfO{>WIsoaw)y83P=H>U<Ce)%l=) zJ`98U`XCJ9L+gGshW`@K{ywbEN2Wo2eOwsS|Ccjo_z&vuW5Y^jjQ?R6RPTea8N+`S za|Bj3WB8AZL2Up~eUFSW`v2w(|8>n!v7RZze^9*-!eF*J19%KT-<;vUi8<4MLsKSb zzYo;@2c>|&|4l)2{^pGTP0bkoo0&8Gw=ie;4;lvm(I9MT#_%5*gX(<{wl!n;55ll| z-@%OWzk@jg7=!A4WDFVua5h8h`<pZTcQ->|P=6nWz04T@dz&%9v5z^!e_t~M2G#j6 z9AM7yKhO+;L(CZdgD|M>4>e=>55u6kKirJ*f4CW>&mU>Z2=4oX>wj~`|Iua$9B0M^ z9|M5Z{U91t?<blu{zt~3`X7W-%o+ZJ`u*rQ!;JAi3}>1#{0HGIb4Z^b)bEGkd^3js zAPnmBBjX}7hX0_tABIcK82%$;aNpmY@qdLmsNc`<ztRkXLG^v5854NUA2bdC!=SPs z6!Rb&l>b5Xe-o_lZ^rPy!JO%Tvl#;zgW3UY(7u1W8N+`N?l5Qg-)V-xp!y$#d(0XB z_nKki31*D{!PuPP|0F1$V#e@)GHBc%OT9lGTJMAU{vZsh`$6?S41?=^Gsge(knns{ z#{cup82&Fr!=QQ}gqN5x{$C2m4F5sx01#eb#_%78!To=8#{a9#8UC*}L*TV$4FA`e zGyGp~hQJ%l8UAlFLtt3F52GRde}?~C%^(=u_cv$wzXOVQnlbzb;XP)I|H0Ut;r||U zhW~rbAQ;^LH)r_2-wYKWG-LP=!=S!D41>l1j)BJdp%^sQ59<Ge@CkE<{~-QpGlu^s zLFGR<;t|9dGsgdC%^3cJ`u}Gw7{Kgv<_!NYm?1Ez-;azhn=$^sWX|yavKazjGiUgZ zjA3>EEpvwd$QWMln=}5u1I2gE82`gCsP7NL56qbU!|+2hrvIS2A030*08h*q|082i z8vul#n=$=IV9fsiD|3eb$QacBN5=2W82*DWsGdj1p!)u!8N+{c465tV@fUN3|1kX3 zjNv~rM(+RrFlYFW3xn!^bPVe6qhbbdpC8oUhv7e_4FCU_GlAOxAo?F@{SP$rgXjN2 z>;Ei}#{Eqh{)5^BpfLbYTL7c}H)r_I0>$WcK8O#h_hA^l{zvC?nKAx{VNl;6f)VWi zUQ<N>AH)W=0Z{6D=$b#!*uS6|sP0E#VQ4!5M1!!1IpcqH4C?#CFu4B@Z3BSX0U(TA z|AYGcsP#X?e`)BrKdk;oZv!ZT#{bP2{wtXyu(BD$e;5Y!`9T<^-Zx|T4;uFeVGT3J z{~)Ys#`qtC8UDlC1E98mjv3>BP`@7;>zOnC*EfS<hW~n?@qcqhaGSu`lo>o104nqU z{|Al#{suFR%^+<9&^!RF-*0Kgh*IZ+>VHt3kBmWeKMbR^0if*wl=|PC@xQYf0}6IS ztN&qb0n|1Cq8$Kg1As8B9RREULH&LRhV=JA^*#)P+5sR8Zv&V!{0}o{K(qlsWB=xi z|D#aqe}@0jpnktO!~ZyQNWULc_k%EM{m<|pH0}?>==FbwIi#)!)%P%*ZN~5)9mDGX zJafkXpuRs0gX(=4hSmKb8aDn9YXgAle-MV$|DZMi1cU1PYBPraRpw0KasL`~NIxG| z@`H*25N<Mu)cN3cfH}i|5Fb>}gX(?|2G##<=8(D{Bo3<oK^W8q0M+|2++)u8zt;?e zA#DJ7{~tQ;4;uRi;YsF9|EHKSVbuSi{y(VS532uR7&Hbj%bejq2*c`s5Ix5nRR1&l zpJ&DZuJ=K8KL{@{N3;PJn=$+c;U(q_|3Mg3-y>t>dLLBx!!T$Z0J;7LvDcX~{zt~3 zzW*jOCU_eFR_}x8E#{2>K^VF22i5-|j9&kP`~9#s0F;Kc0g&r{P`@7?!|Hw*ja>hO z*q}Negik>0c2HXYRL6tk9~ALm#{d6k%o+ZlvVhd}pmxAHb0+ZEKdk;ouJ>VVQ2h_8 z`>&cY{D)y!-4CnxK{Tkp565PZb^xsY2ho`IKg0jKW)KYO`#&&ez*_Hv+5xaS|EU?n ze{2{u-j5A~$N$Y3{=YI~1lRw_bv`m1RQJO$di@XMe=ukK|IrLPMs5dy>VM>VADInm z1N<;!{Ev>&>w6d<HV%MV_k+g!QSm=BX7JemZwsdXp#DF&?gzL3K;u4tq2mC5!R!1O zEf~S|I+!+N{Lf?oX$OGX0tgHegJ4h_fYpNGKdi3DMkCkv9OexF(J`pskBqr382=+< zP<@XJ^II_d7cj?<Ma&ugW5c2r4F5q`%$(sr41?->7?w0={13uX=8XR_F~ff;a|j02 z_sAH%@2_Ca_#cMB{eNgXK-q%fKM14u|JBSH|082qU9V-%@E;r2GiUgZ4;xr8{0CuB z-`~)J>A#UV!+&E7r1js>GQixN@js{y0HQ%-0N^%&IclHZ%ADapGPW^i_-|{$@ZZiH zH+C{-{13zEbw7v?s{diw!<_Ly2)kQAXb>Az*W<#VHh`Zw<9`qa_5Wcw(1PJV41?-@ zP+gA=gT??rbv`-<)%!3UYr*(G9t%z|XZ#PsN#;!dA(-JmsP0F`sTN3mesiY(ndVIY zv*4KFKdAqoW5Mtrg!9Z9{$s;M<_!Olaj^x%{}OWqE`#>@LG?ZaGyJbGhxGkHV*sFf zzs?*~|1<orwScVs2aWSXihXDq@c%z}{2x^3H(D@)>;4vVP~V^FKdjyd)%~FQ9vydC zF#N}cLE``*4DRzo`~DNnnf_0-K=l7X;{a358UG{WY37Xor<pUrF{sYRhUb_w{0HIr z<_!OlF{tiG#*54u|AR27?+?b%b^xd?u*{s{|4MU447>{5{|Ai$Al3Kg*!%zBF#ymw z02FVwVE7NiTg(~$Z$rlx4F9)TAjSZ8nKS%H$9pXp{=@J-bB6yQ3~C1)FlYRazzqKn zm^1u8V$S#<RL|qWM=crtAGcumf83nuKWGf#lsPlFt_R0IH1C5bP+$M7Im>?#4XXRW z^**fs52DQ({$I2}U{Jpwgs+%0{D)ys-49}eXc)d>&iEe{GyJ~+9SgW^0qXlR{J&!k zsq0~N{ylSs|1b=y`_b`33&#I246FZP^iy-D|4%I#;262?e__t}9~~q2{Xy*477YJE z_>DQke-MV%{b1Uh;s1LJRQ$o5;Xe$+#sNN=GyI2PP@RvAzgjT-2jOq#4F8G2KP?#l z!|*S2#{Uq^@c)-N1phII^!GvY{2(?u{s)@thpGY11N^aI_z$AN@ed{bf_i|UL;&VP z`h#F5Ap)+4kV5k1!D|%B*G^C;9lSu$4Y(D6%4giN#L9ry_<+=c{R$$$bG`_(|G*_- zVt>Kwg23~`AUQl3WE>vp0hgkg`#=VRFhxED=RAr`!0!Z5d_pj?I%GC(%Rys9;O+qq zB@lCQNJ2D%(-}?`5H)zDQHmvO>WJ_NNC^mI(~e(^fdBAord$@}Xb{F{5+QkzUXU6P z2C@Ic(i_Ncpx}qlpl}A|b%-*U8n6bM6A(LTZq1Oj02DqTOqK`0`41GwAp9Q`;Rp;% z3otcc8fFVrJ#>vIOmsNWpfCmD;p8XWeu2d&Y`!0xN>H8u2V4}4oN&Pw4#QUr7O!9$ zM1U~JyU@Ik+|~w3fiOsV6c61H0MGA&ihfWh;NSoMpuIkbx*j9}sS-dwgvB?k1pwL? z01~G+2Dt-<3EEAxLV_ldq+o!oCCQB-#h_>h#W#oz!mvD!?0#4p0T=$DIbo0_Bxyi| zKpKh0pt=TuK}Nwa#0Z2Ovb!L1$Rtc1vKSd`nB_2<3?qiN7EnJ96qYbwfY>k$69dr@ zF;MvcOCyl=0U)_iOtTPxrAu5i6)c9t=imR}aUO7+9#+DG;v8E3gZ2adLlTF%hYI%N zGXi7{K6$)y6lun5^6-%ax9vb>0I2N`Nde$O9n1v9KL{gx7cwUdE}I8w_=21T!^keD z4jU96$e22&4wxz6_(zIUkV9aB2ckiIur$ceu(AL|gZQxW0Hg>RL*&3|1X-9EHpot7 zOpG21)F4|0Vxt>{O$=QP1|OsehA||O1VCz#xa2Si83B?9VVq`z;{P8wv;T+G10a>4 z_=C{kwjZ(qAT}}vDI*6%&45ziB8OySKyHV&L&?z#vJ~NGG!tMBLlXvbVR9fEEP$H; zDS=_!s&L3q;y<X7FuOrCR0u2e51Izxl3)#>bO6Gj{0{3If^sz|y@13)7_NhO2FPqE zhEkxY0AqAR2*nSm1Ol0Xt`E$|DFK!R6CfoZ4CatZkgXAF5fS={Py#iK1PWv*48yd6 z(i%t%-2MZ_HzIDqWdK+mD73*0FaZ(=X@Oy|ASnb$BLVe9C?Q}1Wzrz~VVE+L2B&V2 z-#{4;MuTD)QWhZMAC%)6ESdf@S~34;vSj$rXw3konXMT9Gg~o&F^eVRe-MW78UC|a zK`^T|<9~F_ZpHW?6*K&2w_^CufrL4&8UBMXmleZ*T$sm_;XkhxBN}G-&u4|e{MHQr zVOY?L;XgVSwqpDb!y;CU|Ix9y6~ljIEMdv;9~nzpGyI2PX)A{R=vdZ@;Xg8#vtsy< zj1{dI{-a|hD~A6ttZK#Z9~rAzG5m*Nb!&$I8dj)S+lui&GS;<b_z%PSRt*2qv4IuC ze?x1A|AtnK|Bav+#7Csozu<!3*qY(Li6z5-Q!9r5rq&Gq&7s)Ris3&DTUj#vN5<Ax zjQ?$|8Q|F7is3&xcD7>tkB(g|8UMRlF+s33!+$p`1a`M({13vOR*e5a*vpFHzmFxu ze_tz9>}SdFAB6p_8UBNCfEB}kWE^PC_&?Z+@qe&2!~YN~hX0|~2pn$3@E?XFtr-7D zS~I|Lloi8&5RSHH_z%KyRt*1<aiSID|3oVWI8L%+_@8Xa@IS>06{lG;{0HH5D~A6d zoMFZAABHon8UANmL2#}W<9}qFXT|UzhV!i%{})*?VBk_KhW{{JX36j$ge$BV|06KN z{|YOH|5cU@|0}H-{?}L`aIG~Xm=7)wz;yw*@&CWUis65wHN*cVOQ!$L){OsKtr+1n zh}~w%_#cj~82)!!F@kZI6~liR?y+L{kB<AT8UBOt1S^LBFg(eU;s0bS2%cie@E?Sy zS~L6y;ptWk|6zEBCBy%jRuDYPis3&po@>SUAB5*wG5m+&`PK~oL3p7R!+#iFY{l>& zgqK(`{71&itr-7<@Cqx2|HycyHN*eaRtUV-it+ziYX&%8XT|Uzgx6a${0HHURt*1P zc#|c=e;D3u#rPkDw^=g$2jT5j4F6$xhZVzr7~XBg_#cM%STg>HV=IRLd#o7#?}y?8 zmJI(7S|RWuD~A6deAt@t|6yweFg|L<@E;u?w`TYc!zZnn{-3gB_<!08a{fCg4Z!eO zYo`C_EE)fU=(E-g|1VfF{XcI7q7nF_732TQV9fCUvK0hhwPO5_j;~oU{)ge4R!sj< zF~k2`RtS9Cn(_Z#D+UaF&ywLk2;aA2`2PS8er(0?{|OHK)SBV{b1PK*!jj=XGJa*n z@E;k!v1IrU!f&k@{-fh}mJI*V@kcAh|H$~0CBuJY{Kbm#KQ8>ulJWm{D+Ubw!;0ZQ zI{s<R@E;rgZN=~(AO35_^#31J%^ypK|NpHS{{OXxtp5g&^+GEG1}jj#&-kCw8dBeb zX=qyj(hdN%1u!vs-4ElV*8hzEIV_<VsSN;X4}jVLFpRAo0IB~$?EnZyuKPi3P~DGS z=Y#k{mJI(vSlF83KMadlG5klzqSg%mK^Wc!ux9u#VTHhwR*e5a7`@(?v1Is<jzR4J z<hmckR<vUL55r29jPQCNRR615G5$x#YL<-uL0H|2=|8smU(1pKrT*8pV)(CPg=hnS z+5*UJ07ENgaQ$y!$pofBZ2(YP02J+@z8APH`0qcs&Ns7U_-}5-_}|om;lG&`!+#4) zMBR_x1_0IlAZ%mB_#cGrEK%!z2P=mEAna(3UjH-vceO@f<htL(lHorLds;F42i5(^ z*xMSl4FGBr_*pUh_qRl?`-3bQAay^e{<mWMAA*L%t(g8pFvI@{O9+m%1l9YD|D&uJ z|HoJ&a4cH=4{8fQ+5n(-0ONm9{SU&))(rna7}gF*wPySe!l1ezgt68Apf*5`6~liJ z&b4Ov55mZGKdAmMv|{`Z!bMh~wgBV*VrxX*4{8H|>i%*o#{V!3s`o({RPTc@sP3<@ zWCqvy)mBVky50(s|3PU0jQ{<I)cv3~fECmK7E6ZzjaE$mTdf%2xXp^;KMcd_ei+?l z$@m|HyRDf1_rNj3|2|8G|NT~sa6G|^@jnQ|>V9N;sukmZ7@ls$_#cF4STp^fVGXJO zk=p^Ytr`E%wr2Q07pd+CwE@uUeoz}=ktL}9XZ*j|it+yvOGbDb095xQ;}w>S|5sWu z{YS6=L2ZFGmJI)q+X0~ZAB4g6zcs`Ejn)kRH(8<LtyT>GVHi~ZgE02`pW***D+mVF z_sDpkC8+*q{J-A{fe%<R{y%8N1jn#8z)>s4|1f;alJP$bgW3Zptr-3vvu5}YqEA^t z+5_-DA*c=b@Be?0IH<lqW5xLYj18pD2eku0VlaHclHvbFYY2wb{~-E`CBuIZhP4B( zSuy;F;p^56|6%y16~liRhP46iT7l|+1ioj<_#YXA>VFVMZv#BCWcUxlp!y#fqqhZ+ z>wn~WAI3(m`(bR9`rn%2|63@2XT|Uz9e=c9_>Yd^^}iLv|IgN__=^?8e`NgKis?Tl z#;pHg?SY@xjQ^4GA4|sn2+Z&wRL8^cUn_?HU<|GELG1ugd*Ht{BWM5!ob|!PzyJT4 zY?#1(enwly|B$u-!+!>AX7E@5XgmPc24Jyf{Ev)b^*w@S_|Iz1@Sg(@hSm2Vn#+dq zKMZqQGyaEQhX35w5X@@@srNxNpEbjO7zWk*=vcsp@xPEYI%fDU1Z@L|*f9KuVNjiq z4NF)v{s&_lhW`>ah`v8)3_!|;;lGSEDhAd0Fbt~i<*gb1gD|Ym4`PF`qBX;RB^wA< zwr2Pb!?3=;nl;0J5C+xx$XLUM@jnb}S~LEKV21xX)({M;?~$>AHRFE-W&pE6^}Vqz zBc%SfVE~T>fa`rw-UlUszyJP&`u}FujNtyig$?6>b1UZmAR1KfTUj&yhhb}LhX2SI zSO4F^hT*@XH7a(pVfgQ24aGK)Hh`NA<9`qa_4$!8sQw3GFKdSXAPlPeVc5@_@jncM z`u-psV8i$yghBm&WDM^A+aUV>pm6}?zJCOA-`|Gef0PXaxZe-z`-5<tHRFE}j<;s` z55q~;4F6#mROch(RBML+$QV@jgK&m5!+%h}ABI77KM3boGyVr*@ECwK!~Z-R#{Zyt zABKx;82%$;Q2h_WB{q!zLAcDC@qd{$!~b$9uCRgh`9XC*2-jLO{I3S}|7{rlS6egu zueD+Nk6izQ#sfh~0Mz$y0QLW^8U8ohF#K-<)%P|G|C>R4Yli<VHjMw<tRcAFn(=?T zHN*c78;1W~)(G5f&F~+Dd#xG&!!W4t55f~{82(SRM&K#djQ^1_sP7NMp#DFo-iP5? z){OsQ7*y}W@H}gV|Hv3r|HJSC8;1XjtQr0<0?{@M{})>`{9j@N!Aq?f{=@JJYli>G z7*zkSvSIiS!fQbNezg8SsLn^np#J|RYsUYZY#9D;wnoL<tQr2pFsT0DVa@n|hYiF3 zoz|#$mks0pJ=Rcc!|;EP4a5Jv)(rpm*)aS+V2!}AF@QtXjQ>Fx*7t|epn4t|pRi{B zf6NBb=Ra)?X#<?Lft>#aig(c1FNg-!`Jnn9gfCb#{yzii`&%=D#{fX}KS&H#_rqv# z-EYnK{|XWYwE?bKGyMnQ>()#tb^k4E#{VD;>hmKo!~fgX5PZjm;r~5r1P0gp){Orj zz_1O&{|7b<{~uZ-@Dpo>|1b>d@1x^qHVpqk_=PpYe{}rPn&JN|8wh@F&F~)^erL`2 zABNvsG5!Z*Yli>t(eMWw#{VGv$(r#$GX8AE_#cG7STp^H;jh*V|FL1vSilc!#{b9| zTc00U?2k3We|#9!*9Wx${#i4F+XDYAng0K`Vfc?y{{R0A9^+@WX86xw!|<QcmI2%b z0M+xLx*vqG)&HP6AEX9ELolT72i5=J@qQxP0HAgN2t(?A)HVR9-iKjW-4CPD>wg#@ z(FOq3{gCzmXbb>W_k(C`bw6wj095~j>U(qy8v{UZ1AzFl)(rpUY#<m^-y>sKTL45W zSu_4u24h$o0LEwhuVMpf1Ay8AFbo_2*R*E%55l1SJ`97}03bGqMs5Ru`u_&jpt>J{ zL1X?#pt|3h;lGhJ3;6s$$l6d)?*IGW#D*C>24HT>2&O@80a*Qy+y(&k`H``$HPe3> zhK>C@STp_yVNl;68N=&-Xd3`!9KZ%N?$7Yw-5P;G^*^l62hpJZJ_!3+GyDf(P`wYs z0X7W(1FaDlRPV!Z2wMFQYXd}BqmKQ9<^e!;J~9T?{V)ux|3Nfp4gkFkkYdC5AB2(X ze^9*-$2O>KfGit^|2ftW4DS2eFoNs<JR64p`PL8&?)yXA0HAswhCzLQ5C+x%u)aT- zwnnZ0E3KLSgK&)v!~Ys<#{YGe4FBtFnEwAqUJvl^&;LdnW^kPkY6mod+X2k~n`}Vy z01RmLKB(?z{NH8G1jU&3e~%5r|6XfU466S@7}f@uWCN=I8U9bPhG1CT52BIle^9?4 zTip-t`x8_DgW3SrpfLc3|4XbH!FZ`P<9`SS)%{HWS6D+ZsP2bhP`@99L2UpKhRp%2 zvw@8J!`c9#x*vo=^*?C5AG!Vq)%#m)5cNNZ55l1OABJIle-I6-|Myxm{)b>#{m=CO zfHeps+5n(>ABG|0|DZVl5QdEZBiH|+v42n-07QfO|0iu&{+|HV|DbFS#*lenP}|^~ z4fFpq)=d9lZGa1)HUMZWzy{Liht>Na`ieEfe+Wj@|Dd}6sx`y^Yc>!J>-Qtmp!)xo z4a0vJMs5cn*Zm+isQ!oHht`b$(J`do&-nj|H51M@0I2`}!kY0vG6vQAFbu2zVKjOh z05%8k&W7PX3?tY5$bElMy$`DEQ7}^f|BDU7e-Or2_k+aX^}h|n{~u6{T-Re`<E#5Y za{sIu|AR4T%n!u2VE~W+gXewz{R0gHf$IWLz0YLB2wnpK8Up~02Y}iEATb1H_|Ig+ z@Snwo;XkV_1cTTh4CAxeF#N}cVdDXuHjMva7}oDcr5XNn*)aU)wuN9G8;1Wd46FC~ zY#9FY+d?p?&yT<i{{?J7bw0y?VH;Eos`HVts4e4vF&hS~Skji^KRO2W{n4?sEyI6V z8%8LG)cv3~fV?f^e+3&%466G<V*tvw4F6#mROiDmsLofnVf+uqwhaH(Z5iNwf5;dB z!+$LsR1B*7VOZCO@xPu80}3_-)%j3tWX<#+)CK@yaMlMCkojK|TZaFjI^WEO;lH^p z2s48F|DZO2g$=`h5Vp2q_>YclY#9E7u$>L#e+XvyZ)d~sAJqQ`VNjnR8H3vZpuWE? z!+%#>hW~Ch2n?$GJ!}~M!!W4d55nHI4F5sc$A;lQ4Ex$L{s&=yXuluS_lMyi8;1Wd z46gfa8UKgcGX4*<fnkRKpng9HN7^v_2VqdZABIute;bDXaZns@%kV$J1{EjUF#ZQ) zTZaEBHmDfX4uIGF)(rna>`WWR|DbvwhI4Hg|HCk-?+>c`kuh@LAH)XL|Db+91T*|E zw?W0A{yz*?+A{nHu|Z=1RW^+OL3FJx1DFQoe{l3e8I86K{~K)>|2Nq{=vGj_-xkvE z2lxGL82-1}F#K<~h4lMDeSZ+{wqg7a!#y^P|3SFdmg#?=4G1&*@3VnmP~8v06Kxs) zgX;cCHVpqkc(N_S|EV?zJk5sTKMc>bVf;VSh5?Lc*)aS^#&c{K{)6y*8^-_hZ5hBA z)aOUXi)|SH!!WG>52BaZF#JcxpfP}zwhaGa7}Wm<;k7ml|6v$Z_oL$tHVpqkc#{nS zr2lWr@P9KDBiH@gZ5aN8Fs$AO(K~G!|AYGdFbuB$Z5jUWg<??O9~pzj0S?+Q{s&=1 z{STS@KVrl1ABK_Ze^6Zy5(m+zY#9EZuwndv(iXY@|NlQ|W5`)s$hiMmTL$p>KZw2n zt@~m0MO()IAbiP&@jnDJfN4<w|Edkce;9_<{~#Jx_usH#{13vgdLKmJwq^Ja>hmLG zaJ_HK@c%v%2KD*T@gp0C{~!$O`@?Bye;?H6N5`Q4|4SQ&|6pv(@c*SPr0)-_`$06Q z{(ob`@E?X@bv`l;>gPi+1Gvxs!3IPl@JCyQ|DSCzF{tiG#$Rn2|9`W=#IXMVPa7sg zJHVFV|4&<n|G#XoV^CcW!hdZT|0Cl+pthbh<Nv?54F7-IGJ@y-LG1z9xDU7t`2YVu zsLlsrP+gBsgTxRRvkgF~?gzC8u+{&ZwhaG47*yZGFs$AOjsL^yeGm<=`;q4W;B5d% zy$`DUK^QdN55vgq0Oa}~#zt=gfX4ihF{mAYUhjkY`!FnP18M^x>V8oDkBk*;82%$; zQ2h_W*y?{!I{;kwBeelEY(Q-Q1jeZUZ5aOR*f9LpwS{2x`X9tMv}O1YYX^Ypeh`Mm zJB&85VfYWip#DFk4FIbDLG?a_wgQd&+c5lx(V#jX8Dp#aLG{0*EyI80`X9u0L8||e z+W@e7ADM>N|JI1QAJhf__5VQ_wf<-L4;lx6)%`FU)&_vo{|x`bY#<m{{SRsf#Mm(W zhhbR#52BIle^CD)SKXgx!|)%5LG^xy4a0vB&a`DfssG{qf26)Yto|>sVfYWipn4w} zm)J1;hhfmzKL~@`0ie1b8CQY&{5A~#L3KZ<{|~PFZ9)BiEc5@M`rnoTT>pdW`(|6l z|1Ct+|FH3YP#XZ$?}uSny$_>7bw3DCw1w3Bpt>K1Vf8<(-iOh!x*tR%*ZrXJe^A{I z!l3bgQ2js8274O-TiuUd|AXp&5MF7+2(JG@^*#*4>V6OntNYj6GW-XzLG?ZigX(|e zdLLBx!!W4c2le|wGzf$0ei(+;{kx!J{-AMx5Js-|L2Ovv52kGy{vWbIV9?k<sE&tW z<oX{p_J7<KRPQr@>wQq&55ll~52pY9|9{$+;XkO(KWD@E|C|j23dUalgX(?=hKvK? zsQ+yt^**TXzhT4hAA~{mKCJ!+v61V45S!S#A5{OtFmnC>)D|-4kGKAZwgW(QJ~Do7 zi>UiyZ2%CBT>rnfg^cwh+5m{U{}ZUck5>01*ZIh7NZrry|C<dehV}hnG^pN(Vf6YR zROiFQ!1cZ@!+%hn55k~2ABO*d#{7{mINp&6P@RvALH&GC{~v@wY-U@A|L7Q2?<3Qo zx*mktZ5jV#Vn}@ts`HUCmmQ?953l>7eSZ)iRQL1RGX95PhX1^_5De@8Bh!Mm4FAzF zO8sxg@L$vxI|j7_#BCY=!!W4cN5`Q4K01cg{~#LF??=Umx?j;2!UoZ>x*tTV+Cs+t zLA0tZ!+#J4_xtT2{eMkchX3do)CSPDW&97quzDXx>)A2<*SE#Qp!(m)mhr!l9m9VR zjTH4@rYUILABsV300?IIZ(+yq-_jO=LH&OlTSo9WfUPa#e+XvyZ)*$b_k;TWAZ%~T z@E=t7!!W4cceZ8t55u5(ABNrR82-E4BCv-o!+%dZ1P1l}LD<KR5#0X=_4`2>RQH3i zEyMo+JBI&(wg?QX`-5#6|ATO-EyI5p2G#%JwhaG47}WQN;V4_i|IxM#C^*)Z;Xeq2 z`u@l`(U##q3@6(%{0HF_JBI(Mwg?QW|I_Ul{(~^6-bcpSwv7Kl7}odCwPpAZ!uhrg z|B-Q_EhD%M0HTX+8UDjCsQxdtMeX~8+5n(FKQacj0jlg6{v+4_pmqQ_(vgUIX#EeW z_d&SHj`4ppsQ!oIRy#=FAJqQ`;Z9q||1jKb%kUqDd+Zqg_u4`*tnLTV{dNrhL3KY2 zgZll*7~Tf3WB5Pa7J)%^KM2pVW%xfE34`kXxwZ`dVHnf~0O198jQ<zfBJg5chW{|U z)Ry5tG6wbkm)kP_2Vq#hA4IRRWB9+?7J@<bJ_xU~W&FR+j^RJ3?nlO;`hTM>!+#Kl z)&C%Riyg!Nt+ogZuJ>&jA!7ixjQ>G>e-H-M`yjmAmf=4P!}|aGZ5jXXvt#@Zq9K^! z|3OgQZwH|d+cNw|#-RHDs4c^PWDKhNVHi~J!!T0RgPCXSAoV|J901Y|fV2V5+cN$K zVNkyxf*Jl_vSavv*%lSU`u-sLnl0o1>$VI~3}J)n{hPK7|6v$Z@5AsNJ4Wz0z+GF0 z|1b<|13a)}_z%MmZ5jR}V^H1y*p}fx41?-@bo|_w;Xg74_x+)DKe+#I$M7Fi=VQa5 zdjG90<9`?i)%)*l8U7<<P+uP#M(_WBv1R-Z>hFKGW%!Sdk?a5OwhaGa7*^+Fqkq{k zg2w}XgZuTMzC8oDj}NNvVPYUQGX7`B@E?RhV&F(eA{gx%{xjJz{b#ac_|FKXL2P7< zT>rD!G5$x!Y<7(QA(-Jmn;imk*fIRag+cW`2y@#r{s++@3}S;Yj~(NG2xj=tV+X18 zL3KZ$9m9WQEMUj*9~leUGyWH{L&gmMh3pvqi$JlcJ;Q$(7PDjckBmWezl0s*e=xRZ z_%C74@L$Rf6-(PQ{+F@C#Bz2F|3O&Zp5Z?TE7&poN5`PLU&)T~KQdOaWB3oks`d>3 z)$A~_h8@Fy5Z1J3{I6vP!VLel>=0PTj^RHHgX(@5*0*Q;55fj^jQ<Uwbv~%>H@0W| z55h=M4`!O!G5iO$0nF@}{+ro@>U}0~-4Cw+?HR#s04qDj|6pv-@ZZJ`f^F>?{@d9h zFsR-KVFx?L{~+vS$M7E+yVx=Ohhb2?55n&DjQ>6CK$zjbhaCcY*)#r!VQ}3Ks{id6 z|NGiA{P(kiU{Jje!h!aT|3Ns&j`2S-4z^?XA7T%|VRj7vVHi~RN7ym`hv6tYhX2v_ z5FBI2@E?Xjbw3El*)jf4uwy{Mp!z?_j^RHDgX(?|PPJ$JpK8zWKg|w;L3KX}XV^3T z2jMI`#{Uq^@ITv@;eU=D0_WK={0HHDd&d6-b`V@>$M7G7i|iTxgK&u*!+&I4X2<v+ zjO`izSJ**tr9H!cP@NCL)wU2eh_10?{13u)b`0P+M<yEV82^Lnd=PH2WBA`}&-5Qe zgD|M>2jMn*#{V65FwF43%MKNT>V6RJwP*a_X9vR!|3P&>2v4wQ_&>=Gfv4Cp{)c0G zhX2#-5O{_i!+&Hv+m7-7Y<mVUo@2-GABN}IG5$x!p!$D-9mD^H_6+|Q*&*-}JBI%t zywslYKL{_gWB3okE9@BlBV$nA55lYM8UL@b17U{$YwRExT>slM{9kX+@PC6H0&lWo z{13+V4F5s(J`8WQXZ*j-4i)bJ)&2Gi|99Fm{NH7Vz<cZ%|0Cmlb`1Yvc)vZv|NXWM z{}0$9@F6>f{~&zCj^RHtK57rC|Bu-*{D<Kab`1YP_>>*ve;7uNdk`C3|JyVEKWB%E zFW52t2V;AN{}=3`b-z6$xD9Z{j`2S_zGlbp|GGT{->_r&kBo2HGlJ{?TXu~9K^R=` z+cEsV1I2gk8UEk1Ltt3F52GL2GyZ>M$AE$#+e7OACw2_~k?}J-hW{}9+@A6O3p)l3 z{K}5uKM23JXZ#PtZ|oTVBjdOB4FBKSG5mjLkBUFoG5klzpX?a_qvJ1j4F8ewS9^y4 zApFga;XgJEs{4P~G5*KE_6+}j*<s>8b`1Z2+e0vjjf_EcJqUxuKr}K2#W^wt)&H=1 zA4VhB{pf5KwECaL9#Q8b*Z(j!yFKA{0CN4$Z4asUL3KYehSmM(Z2{yq0Ei8$^RZz< z?ErB*hW{W8s{4^KdOHB#2C!%NF9XG(`X7ctZ2%BPZv(*VetU-hO7@VtA5{OtFnSvR zRQH3hrahz`fL!;3*r2*!+ZMA8pl{FcAJi5A)%`F`TKx}d1E6A9-EU>j@E?S6wE;lw z0ed@!{|@#Lj9mYN*s%H^Mnl>Fh<YD?8-M{^|NB7ee{AglNd3?7KgbS(akT-!b-z8s z{|G3?+Xk>>_#bBv!N~0ZP~8v1p!y$#LG?cf<8A{m{Liw3VC4EA#D>-XFuK5w;Xeq2 z+5jMo-UcYMXZVkdL2Up~{STw7?V$BPXbixf;eU-i!+%`$Kco%70Iv6u>wnBP0K@+d zI|PQc13+~@2!rbXUVDcBeRc>8s{cV4y$t|r4@|LV_z%OdHo$ay)cSvx9m9VRMsEXv z`v0i)Kf`}m{STsHZ2(Z+55r6CA$32f{s-aZw%FSMpmqSP?uXIHZ2;tUz$SZ!|Hv43 z8vs)G@34c=$ZY@+8{7u4XZXLz9#Q|p+5yP*KZp&g{}0<U{0Cv=HUNkXtNTGTsO|^h zllF}NPueqp+W^RAKZuRJ{%81q&W-_G@1KX#ur>f_3;>1^Z2*S<SL_)6gW3QfjH?|0 zs{3!*GyI2P<oX}PMs5Ru*s%H^L_f4gt^Z-|0Z`o!8V3N;Fbu2zVf1r*+-(5lb^xUQ zXZZid4uL`SKYBX=z5WOBKib3E01W>>*tHUO@60H_V{-Hzcu2>-BW_>Yc}+X0}u z9mWT-(J`pb|6>p7_k-9l42pAP46gsdV*m{QL2PDw#{VD;s`o)OI%dIA|Fb$U{0G(Z zxG-!SfYYAwKQadO_c1ZUe_m)C07N5WSQ`LF^V>822le}rF>>86Y|ro?hGBhwWLn&w z@jn7X`u)gtzoY}>e^9?486(&KvJMRYK^Rouqhnb8uV~NsAB55Ce^9?48N=#-b$iDD zAPnmFLomaCP#Zwo9@6&*(I5<}|B*4M&kw;2|3Pg4Slw@E&-fpNL4AJ^Mvi+B+ti-n zKL~^R{xEC_>h~jISp9G9!0;c0L4AK12G{xajQ{PS7*_YgXlHwd|1b=z_d&F)J>!2+ z|KHsnwf^_CXZ#Psu>L=Y_O)jM*ZrXWKL~^Bet&yL@K^w-?+?Sl_DtZqKiHn(KM2G6 z{~#LF{|~ok{13vg`ajYE(guL_|3P%DJtKGw07QfO{;;|qL?_xa{D)y!-JcBZ_e1*r zpt>J~LG^#SJ>!262KD`6INP4#KMaHFd=SpHXZ#PspuRscF0^O(55k~&ABIcq8Np)! zAR1Qpmpd^02Vqd%kBmX}eYHI!xZVe`LAc%?a{db_-eI`Wp6NfR{%^L2)&C6tTkRRa zZ2=Gs>iffRy92}jPJ0A~)&Jf0jQ=5ZKZr)E`|TP2gX(=4p6I~%f3iIcL+bvi4h;W6 z7*y}WFs%PS(;m_HN3Q?p+B5zKVOae?-=69Jd<RJ1AJqQ`VOagY7~1a#_5G3S|K;`! z|3Mfw2C&ke@js~V55ur}f2}>ke-H-M`7pe}f${%Fdk99Z`$23_-ya!+#sRk5GyUHV z?fZlJ{~!#i^LN`b{zt~3x*vqW{eDp2ABsVBJ_sMQXZ#PshwT}`bw8;72le|w^*)FO zVNksf!?1cEMxVwK|7YzP|DUx7)%T45&x2_OFb!gZFsR<Y=)eeW3tYBm{Ev=7ZGfxx zkoq51?<3QoaR6}t-yYKUht>VJ9T@(DFsSbj!}skO!Q%iR8iqmjJ~D>Y`{4e+J!;?o zsXZfjECAH+2i5t=7<nAvB~rg1*8hjmpt>L2_XqX=(fa=H9T>sm0ie1b8-|PlK<fU_ z_6+|)7*y9|!^mR*-|ZRy!!UZCkIaYl_d)eOj18jE>wXabzdhsszYYxlLG*un5Dmq! zj1Q$jbv`nN)%zeZ^tvC!ht>a}Iv*M1s{3K$$n`!l8&Ur={0H^@K^VEtM`wfTeo(!S zj3M<u!+$}02nMwQVD&zXMy~fkY%vGM{~#=G&+s3H(d&Lt{SU&(^*@LWY6F1keHccs z`$2qAosWtk{eEQ!hW{XpT=#?6Y7UIxc>qw|55k~29~o;oF#HGA`!Ecv`*rOZ!SevR z4v=~uRQH20xc;|i0N4G74h;W67+?L5+y=0;XZVlY1_0IhpngAy24Ps;529i9K7?lY zZx8MJJ327@2Vq#<52Hc#J{UVN{0G(jFbwMZgX(=42G#rC4ou*A08pKejA8XZs0{$Z zu=+p90ow0}*8i|JK&S)be-H-M{o&9)KdA19VNksf!!Ztw|3P(sEVR!Ls`o)S-T_hf zgW3R~`X5yHgD|MhN5<Id|4avl{~%1b{%81~53Tz_^*;#1>i=Q~#{ZzYAB2gi|3UKr zpn4yMvDN<#_6+|)7*zkmFsR;#VOZVYX3y}SaQ)BlAJqTvw`ced!?3y^L__L-hX0f8 z5g1hW!!WG=2i5yC?HT^VFs$we(V%)C8H3sYpt>J~LG?ZigX(=4hSmMx`riRk?}O@o z5Js;5A#DJL|Er;OKBx@<s{270RQH4GeHgvbp5Z?TgX(-3-t55mAB17`|279E@H_yh z?uTJe-4DXZ^*)3R>HF_>VEB(-|AXp$T=oAE2ZsNkdLJ2s>wkNO|HteZ{vUT>0QdbN z{eR5)A4L5RsrNzseo(y+!?5}v)CK@y%=(|<|5bYgMydN982`iSeh3Ze`-AFz7>3pT zAo`vI<9}Gaf8T-OKL{h&{UA21-bbck{eD9AKd9b^VOV{Spc($ZabWn5T=&D+pfLat z#$W%V*88BkABJ(&|FAkALNomTj@IY@>A>(Ggh6cp5Dmhh`W_vF>ifU;jNthI7#qX~ z_5VS2KcpRiz5Zu%VEhlk3}BiWG!_6CgNy~RI57POiL*E`{0CuBy$_>7Y;2grf$={& z=5%2AkBqq-8UFJ);KqCojNq{VP#XZm=5u8D&+mX83pp_SN5-&vA4ZFS>wAX(Vh*Sn zUiUjN{+B?)pn4w}%Q!InN5-(aA4V%UF#boy4F47F5m*UY?}O@o7>3vTpt|3I@xQtQ z0~~8OLi+undLM>Cb-#`SBe)%)<H+zIROiF6o+D`9pW(lO10xbft^Z9Nn4qmb1O=-1 zVc5)(;lH^9<9|^7Z|=bG-wF+b>V6Qmab)}t!gdaf|3Mg3=fkjr1H*q12G#u_4665C z92oyYFvEXW2LyI=Wc=^pfWYv&-;v?Jmm|Y}ZwFND=fL<MhC%f{2nRSY{Rh|kpt>K5 zLG?Zehd}FnP~9Ku!0;bj_k;TU4h;Wcbw7xXa%B7us`nw7;eU(+!+&u7@4)aMRPQ5W zaNX~~@IT3c;eRp`PH|-XpXPwT;J&{D6S&ULgx38a8dU%1I57SPVNkyxjvW~O7a(C! zy$`}g4vhan^*#hM{4aK3_+JVd`-k@XL4AK1u5w`fU**66#x+oOwLQas5UzD#{Ew~v zZ**Yz55p}`cB=zq3;^5)aDdeNpt>J~LH++O2gd&}4C?!LJ23q3ab)=4=YYVl`X5At z>ivlh4F5qGRQFGDVE7Niu(}^agX;eo4h;Wc7*zkya$x*F2My1)XZSzQ0fIsGJ~Ce9 z!1y1A!S%lb!~Z3Y4F8uoATYSzcVPU#!h!KWsLlst2ZsME9T@(vLBgPVABNXCF#g}* zz<`1`IWYbQVNjiqjJG&4{NLsP!LWKCMDK85{J#qcgX;Y~4h;Wc7*zKo;{y(i|B>-Q z2ZsM3e8`dEKd9bE#>X5O|082iy${3Sy5E8E|0xH|@gLBbz&Qto|1b=%_d$Jr2gd)P zIv<8FIWqmf4C?DUF#Nv)#mII4H3!E3H_$Ms-oNF*@c$-g+#lNKht>Tc8dmRv>i&Ds zIv-T;!|($~hX0QoF!2)y#{Zx;0Eh<Rrw$DNk?{)$#{cLTR`-MGSB?z-K^Ro$W5e$p z7{P4;5Dmhhx*ruY{Qqdr@c)woCWh7fF#3xF<Nt3MnBo672S}X{s`o+ohXccZ7zWk# z`0yVG#{b9|RLB2uVE7NhAT~A(Y6~Dreh3Rx_cJ(x+5imyVKkEis4W1&pn4w}gX(=` zjIHhmi9zaqhW{K6s2IKehw-ts1$Z48{=+b+?uTJ)Z2(Z;AG!XAv4tHN{==|{BWm3b zYYSj&14ueB{71&ppt*j6Z2*S<3J$0k)&>C8{~!#j`(d=21H*qvJAmOoh>hF^0I^|p zKa2*o0YDg3|AR2B{)f@%^}hkM?{DPD@ZZRR33~1WB<?|^nFAwu{2$Z?fYtw?x*vos z96{p%h;{&|?nlOU4h;W67*_X#Xi(h`!l1ezh9PYLhW{=O5RBXgK(7Bi92ow4IzZ}v zQ2h_W$ZY^v-S6kX@ZTQ|V`~FI>VJm+pt>K1akl{=^**TX2VqeC55jS1Z2(aH55l1O zAB2(H0EqgZ;eWaV1ZOxx`u(7~ABIud01gcQbD<bl{a@q=srNy3KMa>SF#HE$Slthz zVRb)<hS&cN4F9Vg82*F!pf&&~&XI8gw9W^$0bun%hz4PBJHUbAf14w=HUPu_E(eDH zpt>K1v9<vm82(Rigw*|@`X7Xm+W???9~r~yeh>|-{}F8fhW~RM82%&I|DbjNX8q6b ze~|;j|HVicXB)r~QtyN6ei+7R12{1JU+0Kg_k-F3;Qqe@q|Xnj{~7*oc3}9AT>pdG z0ie1cghBN`2=8)W_z%Odx*tX(*Z=z*8Np)#2OJpwgD|M>hhgNpAH+W9$ngKD1H*q1 z4a2bd|AZsse-Or2|DSPS`hUg|QU8P50T&z~a{(Y4gdz1m!~cs85DcsPVKl4_0IL75 zIxzgdfrdeKKL~@`0U!*j_mMHE-bco;x*ta4Y6CoWVEF&U5rL8Ge;6CJ4Z!gKr2{I) z*9HLf|3P&>7&|ijfA4^aiEaZpLh5@^osW(|bw3Ql>VFW8zy4={^!K54KB(S@VOZS{ z;=|Z58aeNS*bI&g|Ct>b{xdo;{bzK7ut9uW7*zMOIx_x8$83&_|4}i+e>O)5=5%EE zj}3$Bd>H0-V*C%nAU>}n<9}X91`G_Z|D72A^Fy(KBg21W46pYc8U70+VNl(Vj76Oo z|BE}KVwC>B6T^Q=Cx-u0j;I(m1|aLm_#cMl92x$@u)Gt)e-Ku5WcZJaL3KX}D?2j& z2VoUQhX2S|-I3uxG6wbkk+HTT<9}^O1~>-Q{UEIC#P}bCLH&PZ46gSbnf@C(GJr9t z{s*zq8vv$`4F63X8UKUY0pR-IiQ&Jw6T^Q{-4Daoj*S1o*ooo4wG+dC8%G4TcVzgF zjKOukBjbNZ5O!kt@8pQUu8xfVk+GX2<9`tLbY%MP>BxYB!F9hA<9}}_#{WK!FwF4Z z$C2T`KN1dbWcUxm!H$go5t!kBh$F-QP$viub7c4r!;y}R|B-Q&Bg20fj&)@C55u6k zAB5u_8UM#SG5k+(MBrpc#{V!3>ia`5!~aw#hX3h~2n?$KK{(Ti@qd;h3^V-Cb!7OT z1FH8OA?!RyhX46ajQ?SDp(Eq}LPv)Gpt>J~i=7z$mpCGDxg#T_{&!^jU+%>4zrqoL zE1eksS35#5sNM(RS|^78APma$a11*C-;wcuqZ7mbCP&8qO^zU%;Xk<UcVzhA>IkX( z!S%lr<NtOi#{V6TAk6T;!x38lJ2L$5c7*i*LG^#H6XXAWM;M0G{owlFiQ)f5Cx-u% z91(b`BjbNCc4GKH%@KiTIx_x;VNl%<#*PgCXFD<cpX-Rg^Boz%;{YHUgcmq6{D<Mi zjtu`{7*zLz@KPtn|H~agnBo6&M+ja4s{frB{;zam_`k{#f!8`R{$K0J0LP&Ef4vhU zxE%nZH##!@2Vrpk-;wG6W+w(P2G#vAyw!>E|8_?N-r>mbAB1;0G5p`{h>1aMfW3~4 z|MxjE{0G(j5SrotK}S>!>i@&=QAfuAM?rNz6d!kDgtq}eY*4*_+K~ZT|6`8-gX(?| zKI_Ez|GXn62G{>i4F4}WG5o*eh>9;eG5){m2*pke|F1bh@O3AK|1f;hk>NiK-*#mD z53c_m8UKUWx1AXN-*H6X`;H9%(J`p*hvA1#jQ<}y!Z5@C$4GTQs2%XsiSa)OKXYXK zkBS-ozjQ>!pn4w}zjk8$55jL98UI5t!~eIA4FBID;rC7q|3UbJBg21e__HJ9e>iqx z`2X37;r|y$RQ%P6;Xep}cVzgF4TI`^82;(V_#cd&82<lsV)*~d5j+0t$oL<GLG?Wd zgV~M@U@;K;pCjXc2*!+mQ2h_VjQ>G2tlr1f7QkQsL+X22y$_?=ov_#cpf&-hz6W7Y z-4DVbHm>>~)FuG60bq4Mj7F~iL2OVP0J-i5v61V35F1qggD`R%K*EvXKMaHFei+8q z1_0OnP7MELoe*_Ds0{$B`#~7F?uW7Q)&Hta`0Ia7Cq&&3Y6pPoeh>!L{V<GN|LZw2 z{MUDa)cv4(AAkMNK(+cG)E0o%{f=n$zq1qe`rq9NweAPC1&FQx{gLYbKqpxJ&+tFk z5rSd$KZwR!|2rY-eoz}A+6hbj@5Jz*8udS<4Z!d}3tH#num2gq^*^i)0IL5%7}f@W z*Z)oo*z12MhX2)04F78!p?!aB_5c6>{~JlJ{~>ih{`#Ncf4?IHgX(?|2G#u_j9mXu zc4GWL)rkR)VQm0d-4CN@IWqhQVf6Zco)hWy|57JNy^pQ_M{WZk*Zm+i-ufR}_oKG~ z(Ch#0PDIrIPN2FU72~V_4?8iS)c?mwtp7o61JwGT;s1F@5Qek`E;vH!eo*}n!pLm^ z^!ooQv<(2O`$06U?g!DgoS^l;6T^Q{-4DXZ_5WQbLiInS&Ii@|$QV@jgD|M>2Vq3r z&+z}5BLtIM|0A~nKy^O|W2^f?V(_{j)DD2w|LAQ1P~8v0*y?_e7_9CG(V#jX9b;<) zfa-V<2Fc;8|NlB+*8iY-9)ua3L1O?6|CyW_!Q%iRF%V{PV*HPeL4ALa7>EXACx-v5 zPKdf6RNtdxP+gCXxuAW1P`%IX#PA;-^EpAr06;Vh!|HrwTF{B{zn~KX3I^5rFf8K4 z_#cEp^*uTU)&CMs4FAzFtnLTV(oT&3(J`pr2Vps9hW{W8s`Jq?sNPp{Vg!!^fM`&^ zAB>$C{wq5{`v0JMABI8we+?%_@Hl{mGsAySosW#c^}ZA1e;p`>)%ze?&za#rtj-73 z`!H<e#P}bMozc$!{Qv*InG*vXgZlk2Y~jrK-_i+&8U9;>`u)z({=YNBe;a3p|F%vL z465^C*ujb6Kd9b^VNm}cRPVzuO8?)P;XkPEhhcEN@5K1u3yMK~e-QR@X87;z#PHu2 z34`i=5Dsu+{12-4AsABUgX;beCx-tZ4665G7*zj<J2CtR;YcTj|1cco%<vyn?<3<l zC&vGA&X9T^RQH2$f-~d)L?;AJhK&I@G5k+)hV=bG{eKY7aAN!q!k{`If*Jm2Ix+mu zM#7*m02t15Vg&d9^PNEB01W?&oFMf-hz8aBAY9_i_#agNmpU>2FNN0opuRr{S2#2N z2le}57+m)|GyJb{X82$0$OP{DWAy+3|Nmd_1nvJjG5v3LVt`{%-yekAp#A=KCx-tZ z-08&d9~p!C{vh1r#Q4A0i2;t`^*^-V532h?7*yv&FvI`JNOeD`9WdRA@jo)2<;?IO zghBN_41@ar;Cdfa_d7BE2le~sJ2CuU;0)>eFLYw~55n-izZ2vCB~Fb0LG?ZigX;bj zP7MD+7*yxO@G57<|ErxC;22!*gZlhX4C?nI<4sNs|3Mg5?}O+q&W!&-^*#)P`u{te z8UBOoerJaNpuRs0gT?^%I5GZ*V21yDogjFhGsAxn-tWZl9~mEVVg!!`fM`&?55u7T zKe*lp)%{R>+=<~o2%m6f`hU`i;XjB5)%EbPA1LFD6XSnS-~X%=q|QI*45AtSUvPq8 zP@NCMmz){@gX(-_46gH?8UDj)P@RvA;q^YK?nkQk!F9hgr0)-^_hA^h|Np>=@jnPZ zbYl3Aj-NO&{zt~3dLJ1-cVhUDj*;5{ubdeFgD|MikBJ%nzjH#xpn4w}gX;T_PK^H% znBo6NCkO`B`7r#&nc+VOgX(;27+mK&G5-I7f+78V^tvCJ|J#Z2KQac@|1ds?4XW$^ zIWheQ(f^&8{{MGk`2P=7{zKy(MuF;h5JuGhkTw9Q9RR|hdLDuq{<DDUd1r?ItVo#6 znc+V+46FY+oEiTkV=iZg|JX3M3&Vd9=5c2DkBs5<zBA*0erLx2AijVz<9`8X1{4gd z|Am|x|082iy^oB=oEiS3W8}JD(wXr;2unFL{zt~rP7MD+SjL&*KQac@{V=TH%=jM@ zGyGQq)%VT}|COOw#hKwhG6vQEYR-)RA(-JmsP2bhO&3ORJ3z~s@jncM>VI7qhW|Rw z4F5qixb6ql|IQ5m^<5aj{eF!4-<jdR5h(tl=f1<@AG!Vqu|f5|g)_r{7zWk*R?ZCn zVHi~J!?2w*<9`?i)%!5)=*;-v2?@jMeivtk{~+w<%<vzEJ)9Z;BV%~o@51ok+lApj zsP2bhUl&Gj8^F(*@js~Ehht}k|3PRNT=zRO{ttC#{2vC!4FAKNA$5O*GsAxn2G#p8 z9PPsRKgJn^8UDvOGl1)UaQ*MX_&>oJ6@%IUNzM%aK^Ro;!*Hq#<Nq{g2nN;tVC>BB zKMM_m+5kDujQ>FxRPTeaGsFLU7l!`@&JYZ$_d&SWnejgegX?~0hW{l{T;|O9AA~{m zJ`7j7F#WG|V)$PLt@lB7KMaHF{yJyO^<SX+zsZ^5KMcd#04>gp|3P(sn=`|I5bkhh z_z%Od`oGJW@js~E?{Q}M55m1J4FCI_5qN?V!+#i_<jnYgk~0GsgX(<{p5n~-AB3kl zGyaF+8O{v<VHjNZyD<Kr4aIYu8UKSYr2c34Ki?UG!F4~V{&!~hztDvdT>md}hSd8@ zoEiRu@KP6s|I3^a7*zLz@JeUK|Dbw*l{3SC7zVWg);Kf%2jO+lx*tTZcVYOy!5M+U zb-y#?|IN;f|3URWGT!FQ@E?Xj^*;#jbYc7tqIWqn{)gc`P7MD+c&{_Ve-H-M`^Xqn z{~vH>{13ql{|`As@DXRm|Hv3t{~vc|`VYoV4F8WgL+X7<{m%ey2f*?@jE2?!XPg=S zpL1sV532v+b-yzsxE%nh_Ys)k|79nJ|5uz5_?k1re-OUz!U(2sI5Yl7#<!dp{)6ys zXNLbEd<RtTBjJ0_jQ>IP|2=1h{~-Lpnc+V=e&o#fA0310|EJDO;C8@M7l!{J{LGo* zKQacj0bV#W{)b^uosWW@8UDY)fkAD6_s)#qwg89*;SbJ?{~?&+{|9FX2G#qYoEiQj zV^E!sj=woG{>Q`&|9?0k@K0yP|H$~4Gvj}3_>VIaSR7R6gV=wZ8UDjCsGk1~t?xl> zWDJXU7|rMcsqYzG82>XlgV-R9%m(ohn3OgEs9gYR2XHtu{Ktlo+X0}uAB>%_*Z+LZ z4F6%6--Y2n2;*u4fZ77^Hh>Gme-UR)jIRv<Y7a=dF#MNtM#Z4|ABJIV09f4*qvc%~ z{)4cBGsAym466H)+X2Y+KZvd7%<vx>!|Hz+4XgWMG^p+eVNm@K!pLm^5Zl0+@jn>5 zF#I=gfz<sV8W!&`8dT?-I77w&%w0hBJ|n#D2ekq4)&HP&fSohLe;7ut|54ij4F8>= zbw8;7hhb0~z}*G8{%82_;S9lEpguoZ{SRsffW`no^}nAB!~XzhRE)I^-~y@lL3KY2 zgX(@5hSmQt8dUegFsS|q;dpo(fZ>0FGsFKxCrI6oUjKvI0kHZ%&6(kU1{7zyF#HE$ z<aPk4?gwKRhW~la5DcpSL2UFkK#?=U|6&(J-4AL5fa-qG7yyWd)c*|sE1V%1RR4o8 ztnLTVwJr?*vDN<#$aTL9r2h}9`&*nD{(~^6?g!y^7exIJY6o;WGyDhPE*D7M532t` z7`grjvBCAfGsFLhE|9t()&>C4pt>J~A$32)|7p$;46FY^G^h;#!k{+59A}3AFg(u* zQuo7X<Te0^y~vs2KL~^Bei+8u25@HhztRPQVf8<V2G#vAyv~{7KL~^Be-K7)1Ayv& z7~bN{@E;k&>VFsws{270)DGC?%<vzELG?cjBiH>PHl+S%_<z6|f?@UlVHd{#p#DF4 z8{oJLq}~V7Abi4^;r}UThW{sB82_Kb(*8T^!T_%GVKk`zhhgM)z(p5^|CgLmF>)IK z#0IqiK=`@~!+#LI;mq(K8H4J6{Otfp{ZCvQfZ_imXNLbzpcqv5gD`U44`ZXY0T}+j zaAx@b3Jt$@!QKu4wE;l*y$i#C5Qf$H=rplyfUhnL|Gzn7$H?sf5F2|tfZ_iyXNLcv z`W-}rFs$AOiNV+)8dUGYXb>BOVdXxI2G##C%;d`OpV<Y1L1Lix0E`c#k^BD0Y<3sM z|LiUdI5DjL=X7ECkBq@}KD6%-W5fFYye<s?(J`prN5%rKjQ<5)P%*gfcVYN1<ihY@ z*cF0BT^Rmj!{RQC|6v$Z=c8jOSBC%6E~pq*_shC6{0CuBeUFY|b-$tu!+#hCwE<vQ z)rH|dItJDM>Mo4`K^WZc2lf5onBl*cGsAyv7YGK``N&w$l@ZeS2lfA582=l(GJxxU z5Dmh{E(~BXSiFO1&`^N6Gvj|#7X~l})&C%D>B8_I8N>Si)~*cyLD<%X;Xe$+>V6Py z@51;Wgh6$`qYJ}-5O#K9_>YWXb-$|%<9|@y55bT+A5`~yx-k3)VNl;6hQa-QP~YE$ z;lHm7!+%iS@9&DB16>&Y!!W1~5bVP6ABIC+82-a>xC_I75Qf$LkuHq?BU~8%N26g- z{U7VX_#ag7Lombtco&BMiAWe!_rox#-w(kI|5IHU{)6iNbQgyIAPlPaVK~c`@qe}p z0~qJHF#HGMTvvwwAPlPek#V65!+#hC)%_q`;>rl_|ChQz`u?E0zs!Z<KL}U4F#Jcx z)h>+x!Pu4If2|ASe^C8j?}EAiv(bg|f1@kI|7I7)|IMKK--Y3Ss|%#=2hpH<9~pPL zF#LyMP~8v1puRs0gX(<{?stLI`=GiXh9|o){zt}BTp0dOb%o&RE)4%c7*y|r@JtuR z{~$cuh2cL8&vjw=kBs4C0HA)q3#k7O!JxW-u?xe05C+xz$QU#Zu-t{=KM2F>eh|IN zmGS>-7YJVC%<vzC*SawL2VqdXkBm3EF#ZQ&aNY01@P9KDZ*gV#ztshSL3RIj7smf! z?8@+erwasw>i*p>4F8casQ<s$h2j5xGz_cz54te^2VrpC532uN82%r2VfcT<nc@FY z7X${^`>u@tVf0BC{PjPm?g!!XE{y-tF{s{$;Y+Rz|1Z0sVo<$*)rIl@RaXWu2G#q> z7*zk?bYb`p!=N_6Z5M|BAbiJ_;s0G1R1B*7@4GPmhvA1VjQ<fBQs;x}{l_j0|6v$Z z?<3>qE{y*nnBo6(7YGK``N$Yl-($nDv4FQO4F6#mRPQ6>k1h=Vv0>!?|0frQ|DRnU z7*yw@V^|yDy9?ugWQ<(r|8!yakBoo0GW`GT0<HgDAZ!pHRL6rbGW)L!<9`_b@51;W zg0am1yD<C*)%6Un4FA#Ve~>t=-bbcE^*)FXqQTgO;XkVjVjcinI{;SyBh#RE0Ibf( zMuX~pP+I^*!!UB)4`V~>e}?~pE(i>&`(YSg8vry8AnwBO9~~pN1JLV#5MRcH;Xeq2 z>VFVMum3@OP#XYL_rqvd-LLGz@E?Rh{eI*&0IdE8)2<BvHC<3Ka{Ui#2cXvf4F5s> zetj3v8~~)Q2eCnQKQac@`!I~F{<m;t_z%L!Z2%A(RQFrCK-vHxHr6(PE2Q2B)%_q0 z>i1)-|3U2lS67Dr?k)(7T>m4t0eoB`a{-{bABI6~01yVX17LMOhz8aFAdId42lf9! z^*;!M>U|iFbj54~fa?EPS4h1Ns{27W!4*dvz=h#|vMZ$S2i5-|466G<7*_YgXjuIZ zqCxdP45POJKy^Q88~{Xv>V6PLuK!D+^**TX2jOy8EcL%D!~be<{SRsbF#NA~!OZ`# z`XAB;0JQ@U^*^ZpkKP7=)%`FUR{wXqGW>_t{~#Jv|AR1k8vs%FGyI?I!tftd|HCk- z?nlNmT^as^Fs$we(V+f6M*Z)?@PC0TWDUSVXd3`j|AR27{s&>=>wkv-t6d-%x&FuA z24MKV5nAu#t^Zva{%><(_`e;g{s*-KP}%^l4F5rOKM3!0W%v)m=<NVd-4ALDfM`&? z55ws7Kd3Em0<HcB@j>GNu)GhU|NaNn`!Ecu`$2tw5PjZ-;Xeq&>V6Q7wf=X3)caSU zG;-Y!Vx!dmu8?{kRQH20sQw4d1t7NpK=nTiBiaBA{~x-bVp!b|qmk=>5F1wSBh$$B z|4SE!{~(O54FD2@)%`FUx&8;SLH&PhZ2*uMsP2bhd~E<wn*h`fK(7D6Y**BJAGr+x zV}t5?WDKkSL1G~GUsnc5{STsD8UFtV<$Vx_L_C}X)%hR{tN%f4P~8rqL72sr@jq7V z#_*rb6*uN^W%!SdLG?W{=5l5H55hdI4F9oVK37I~{~yGLVNjnR6*K%7a>c~3dLKlK zxH0}0b4A7s|HWJ(7*zL5xH9}l#-M&bGL~^={EvzueSc8hFXzVaU%?eSR&r$o_y0k( zk{iQ+6<1WO=F0dV8H4)%AgtlW@L%1P;lCCd)^TP0kBmY6emz%)|N3qW|3S0?sNWC8 z#MJ+$E{OiW8MNL9)%_rB<;wUUf*Jl>LHquodf@jnRLxibC-VNjnRj9nT2JGeox zlPkl27<O@G{13yRem|(*2VplihW{R}s2Ei5d$}_H2Voyq#{Uq^@E_C$@B{Vvp%_%} zgK&Tw<NqL65N7xv<O;!{x<AB~;Xeq6xib7m#u2Uz|3Mg3=fiN68{_{NS5zG5#_%76 zL3KVdPI6`Z55vhWjQ_#dmEnJi8^ixJR|L**W&97rpniXrE5m;f2G{$p4F7YW7*y|r zaGo3E{{mMAI4*K!1o!_zG`QXe_5Go^%$4Ck41?-@7_M?<{13x5ZjibkM%TF#uK!zH z5%oW)-Us0}SH}MxV9fBp!xhr^?{a1M55u5(AB20{82<OUA~2}l2jK~>jQ=MgVNm@) z#g*Yd48!{VAbOe`<Nq11Fbt{tXSp%_2jMxc4F6$xo-5;jWDKtRLG`~Y!~aD{7*y|r z@Df+X|I1t%Q1A*@#{V!3>i0u1!~Zp|sCb<#Be?$$qBpoQ{)b?O{~KHx{%?X}P@f+e zZ*^n*zs(haLG?Ze?{H)IzsnVYL4E%{u8jY|*p1=;9ydt6532h?_<$?pe`E}*_d)oO z8^ix2uBiB!E8~A;465%>xH9|)(WhJ){-1PX_<tIs{Qvv^oGT+3pK)UV)1W&4f-A#+ zWDKhJLHM#8Be?&6#g*|t1T*}<0`2#M`v2G582;aI#l*K<8UNpOW%z%~jp0AI&UZzn z@3}JmhhcD?@5=E1J`_K2WBC8b6%#*kWd!&CK{O0Mb7lMw!_VCq{=aZV#i05ghF`fd z{s-YVu8jW?nBo5$R|tOR3hDoYXc+$B%J3f@e{yB~|H+jB1H<Zl5dFoC@&7kh>=<0% zyD<L$;mY*?hZ_SNgZldT@E=#k|Hv5B*N5>zZ1nmc#0R$l;5GmM|De6#3~rEqKd7!p zW`p=33~CF2F=%eUmEk{&8!9HX4FGBraJn-5N5@=l4F5qGy&VAS_rvOb5DlsO8U72n zqGD`q0FW4{{s&=D8vul1^*)RS)&C%jul@(M1!P<q{-a}1{SU&RHUJ1?YX>O0GW-YC z{V<H&22gcl1kVGYv;kZpbw8;72ekvx+W?@xzm6Nje;5YU`!Eb@2OzfrV10ihH^%=U zj2!(Swy7J#e-JivWB89=|AX29pngB7?uTJe{SU*)Z2&u0hX3|ZjK2-Q@E=t7!!X`9 zfE%RV2i5%`?CZwxAJzr{)&0mAR`<hbTx|ew-yd%qfZ>0PE5m<K-yejrwE;l$0FX8S zq~8zf`-3og8vxY*&v0Y-55l0jABK_J0HC@bhV$GI^*^ZJ55l1OAA})o0EYi1t`Ll^ z{;zNY)&C6tt6U+t+Ku5qsQ!mxP#XXg=b(HKrvLx{-{8vdA2bHg<i_wHgh6cp7zWk< zt*#9J+uR@+RR4o8yzdWf2Y~8-5XRRAfV2Y`{!em+_WN<P0cN-|{D)ys-yc->!!WG= zhxPyGxib6*VdVOMp&MEoz?I?uVpoR$OWYtBxg7u+|3|a|82+zvg<w$sAJz^4_4{FX zog1Xy2i5&B3~K{`Xyi5kr2c34zs(iW?}yd@=xqQ{djM4L!!W4cN5-Hr07M&r;r~Hb z2u82}L4AG@hPMISKy^OTe^46$RR4o8s11M|_aOFZcZUCGplyJ2t_=UrgWCa+zCWl9 z0BR3_>V9MlngamU`!Ecu`#~5~|AR1k8vs=IgD|N62VwL!0I2Q<jRAn@d(e6xR{z6j zY;6Eg-yc@@KXGID55mt}8UCYVeC+^GdjMAFqtl?iKdkPD(dhL*h!5`bqqPA*^*%BN zwE;jFdpm&P|94kJ-A_zA094n5+6UnNKDaHw@c)l11cT~&2piN!VEF&fjp6@aHwX>O z_b?h%=ObfgH%9P00J!dVWBAXEhSBSPR(FQ~Ak6N@@E;cj)%hUI>BjIM8H4J3Y?#-L z@jp7|b7T0AjQQOe{==}K8^eEO46gIt82<~yusg$l5jRvU>dx>VgvH$${=+bG{V(ax z@E?Yy-5CBOV^AAF){Wsm41?-@bgT#+69Ca546FN<-5J4c0dTz!s{6s1;lH{Y!+$kU zy$|a5yD|I+)%(a;+l}!*GKSUtFd9_vBV$+_z|f8HKZtGQ#z0j4Z|=tU-`t(yzoi=j z!|Q%G#{bsPzCWn$2Vr|RhX2SIR`-KwM|Z~m&TcTw@ZZ^u;lGP3!+%#d2nN;tFbo?9 z@N{GN55it<4F6#mRPQ5WP#eJCjq$&~JH!6~Hv|rLgZBU382*FUp#FcTJHvkv4tHbt z55u7TKL|&<G5!Z(Q2#&5jp08C$GSo5e`x<7RR4o;ygTFnL^lRFPI6`V55mcAkiI{t z?uTK}I6%4^!+#J4)%`G>>CW&!+YN%@{eO3c|GDlA|3P&>GA?vu{13vQy1⪼XeqM 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�HH8fM{5~527zZ`~9%~ zKZw5E#qb}5uXZy0hvDm84FAzFsP7NMx4Ibr-|hrq26(?8RR4qU-7bdz_d8KBa^3&1 zlkq<YgZll*7&Hd(w3FdKGDhzAgV@hI8UH`;V)*~E6M;c}e;9t<$?zYBVSRoO4XXD+ z_<bkCe;7vZ_rv%fyC8KvsJ@3_hX0>CA^1xt!~d^cs2EhwqhoNr-^uv@XD8$TA6*Rp ze|F-=p!yw#e|Itb2VqcO9~uAaU;>N(>tgs169<j^BCow<=wblZ{h)CG7zWk#AU23b z$IM;W+W_FYAF0j<)&HP+ABOSO|Jd39Je>^xkuj|PN3Qo_Y*5_~!jSqO)COS0sQW?V z|KPeG)&_vm$n`&n4XOJ<^*;iG#{NMVSN#vF`#~7F{s-0h$QYykht~U`x*vp9yCD63 zSp5&L`#TxIbw7Ijk6iD=*r@eC!+%iyZ`cW{`w<va?jvJR-4ALXn0GRQ>wZ}M52HbC z07U)I@ZTD#|8LvH@E?Rh^*#)v*8dFuL3KX}gX(_}Ms5Ru*r2)}jJwe4|1O6Apt>K1 zLH&PF-4CLX>wgd%R{vvb1HkHj5DlvPK^Rg0GyIS2gkVtpkBnh$0Yn>s;eR}|?+<DN zBz9re|DbvwghBN_3?tY5nO%tS|J+W7|Hv3r_vd#qg4+Qgy0DYsKL{6fA?klnI{;Mo zgD|A-XZT;<3BjOxzp@K54gjJd^*`hPnl4b?55f%KHUM(mgV>-tAB4eue^CFwivgwn z2ekv*I~o6jaTlcC@90FW`(bSWP`wYr{hbW|k@3V%hW{`Os{3Jhau;U(532h?7}W2F zVO;e;dK&;#?=S3P_z%J;^*?CLA5{N$G5lZJ#qfVwCj>9=Le%@PHUOgjht&I^x*vpb z)&Cp27*XneP&)ur|8MPL_z%J;^?w(`e^?s;R`(;*@cO@#;s4%FNWH%gO2g`Y5Dl6G zINZhXABI8W{4flv|3Mhk1_0p`9Sr}$^*@LP^#MVVj)XyNg0r0r|3Ua%C&Pbae7=j} zKdA0U#>jO)di{T`i{byZPSiF4tnLTV$n`(G9ni_}A5{0>fzs%001zKk?}Kp{!~cg} z4F5rWe;9t!g<AK++5yix8UBMXsNM%*<hmcm2G#$tdLNkv)%`I1t_xB3!`c8K8dmSa zXi)tR!jQTj)E0o${h&4gw)!8`9zd`ELHr+Gkoq6g20&oUb^xfpht>bEx*a42!Z7~7 z4oJQKzmpMM|AX2ANKp@Fg6n@!8vu%#x*7f>V^DpM4YPDJ{s&>UF2?^5%<!MB3xQ$v zK8)t*X8aGrTwRR+abfN*hW{YU)6MW7gkg0)IxWz}_#YiZ>V8PyA2bFa)Xnf8ghfDo zeIyKP1Bi7o{)b_SF2?^7T?{B#s*B-2GDfcZL2Q|B#{Y6%3@8}6{#WQ`{13vQdLJ39 zbTR#hV21xHT@3$0^*#uzbu)t58eNS45g5|%2i5&r-3<Rh7}V!S#(G_h;4uIY4Z@(l zKL{IiGyDf(BhVNC5(Y;)5@FWG@ZY2x)bD5f4`PGreNcUG(Z%>5gh6Z=w&`N{kBmWe zzg;)ue^8x|iW&Ypbs;dQ-iKkAZpQy^T?h=T``x=3{)4br7sG#K466Tqx)}fabTj-1 z)&DRY(8cf{8H4Knpf1M$LEQ{s4C?!Xa99`Pe`E}*`$0IOo8f;{7b*tT|1sT+|3Mhk z|A%34z2C*~KcS1^Kd9b^;iPWH|0!KC4C(iS>i@KEhW{B|2n=ciWOXtA&+29X<LoYm z|1g}_#rPkFLG?ZucQO12)%(a8T=#b|{x5;z(k_PoAY1{e^Pw12@53;t-Us*pk?Q|C zEag9_?r-X1{NDts_o4NFOE=?x5C)9}z;H(w)Blcc1~3No`(YSV_xE%${)ge-E{6Yo z-4HyXi{U>EPwHa)55u6oKd9~p;b~nA|B*4M?g!x+-HiWdb%8L$|5;r~{r@h8|Dbvw z887H!{J)@!0gOR)KL{`CX8aH8_akF)-QUgde_1!fe^A{I!>hU&|0CnoT@3%%bTj-1 z(d)Vx{=+b=|G%M&@jnQI>i&&gXnp@KhW}fjbw8;72jLxEjQ@9l>V7DOj{$Tu{@>k& ziuZLf{71&1zW;%4M(`K_xZe-z`*$%S>i%wq|3|tR{)6g#WDM%>AM0iW*Zn8EAZ-8; zjg<Al%rjk(x*t^kpYLM)55WxoL3KY2U+QA`kBmX}J~9T^`=GiXieX~_H@X@BgD|Mx zM_`8kce+q9sQw4xd)<uSw!nif#{cLTRPTfEqi%-(Fbt~uk@2%G#{Y2K&G7$OHv_oe z532t`_(eCv|5sg@7*_Yc>0<m3$K4G7L3KYe{?NtvA0310d<16r|FH{#zjQJDN5`N# zABMkmGyaERP@Rtr|LS7+55k~v01%CgLG?T`{?p9}?(2iZ{&g|_M_>jh8$?6Lf50&h zAsD+E{(~@bosZ0B?qU3oj6roiOE<%RWQ<bpcQgKHN5Y^w9~b8CX8I4o4F9>i5g1hW zgD`Io<9`t5>t_6q3xnDLf;|lXVHi~Bqhrx-#{Za@;lEfn0!wx?{KtktZ2;+R#{V!3 zs`q8O8U7<<`EJJl=onP@gRo)`6Sy6q+|BSG8H4J65LN}%``wKHLG?c}*6e2ZkBmWe zKL~60F#ZQ&-EPMJ$XLIJ;Xg74)%_q$sQx$aW`xxL-HiW1Y*3wV(aiv<`@5O`TXr-3 zx9VnqV^IBX+s*hNhC%f|0yF$~>_%W%8^F1n@jnQI>V9PG-p%kIggv?${v%`09>)LP z-7w4muKU6De-Fcdziw0<*v<GKjC&yUKCJ!^?qU2N+Ks@lHb8g}!+%iSkBp<c8UMpD zsO|^h*dC_;@!bq?466G<II)}YKL~^Beh6mxpW2PUpt>J~(|Z{IXLiFd!~aZJ-QUCb zKf8zVe@-_7gX;hMZl?eFJq%!6(9Q6_u!r$Kh%WAC{13z6y1$#@e`ycH|FUib2DJey zyBYt(a8)<7-`~yfzZQ&{{?~Og{Kr=RH*_=n2jON=o!`auzonZ2T=#?Oe-Li(X8PaW z%>c%r`oFV>@jnQ6bu<2lVNl)Q+r#i5gkg0*jGoxd_#cKr_5b7^hW{`;rJLbD48z(0 z)4Lh}gX;bn-3<Rhcy>3#e`GudRR4D~{+|cO4FBhKGyGrJ&4_|Q^*;!M>i?zP4F6#m zRQH4M@*c+jE4oqf>K=ywFbt~yVHi~ZukU9355WxoH*`br#vX?Mo4QdkxbE*}{J*uE z@&7h3X86CY8-jOsGyaF+UEPfTL3no$(|-`&)6MW7hC%iJeo&nc#i05hgb(&G{XYci z_jfb=KMcj7x*vp(_AvejVNjiqj8Akk{6E#r@E=t7gJ?*pk03$y|G6&4|L3|HQ1JO4 zhW{73QSs$&#{bCpN;kuQWPH7w@jo&K)%_rRvxn*b%^rsTx4Tg>tQ~L{RPT2){s-0n zFnqs<;s3*KR1B;4LG<Gu#{VGvw43oiItJJKJq-V!Louk{N5`+b8ULeVhW~H65%_Hn z<9`r--_7_R9V52^K6W$x|JcLu|5G=1{I#3$KQ;`j`(gC=9)|xvyK!S!-T%9r5!@yK z*Y}`0znk$th>eOF{{QKQ)b}9ze>c;AaNoZhcl{4)1Hdq-{s*x^G&*MPL9P2??EvI9 z0Ems;1^}@+x*7hXW6mCi|6E-Vj9mYN*r56!8H3sZAk5dz@E;uubTj-1VSH@>&^Ul- zH^YB)jNAqQjR9b719UU|m+EHtFWm#d$aO!64I2kQZUZQEGyF%!iaogNe{egXhvC0k zHv(&PG5iN%Y;6EgJ3zOa;XgXo>qfKzKy^Q;JpiIX*szD;KY0Ehk@dkW(;n3NAKV52 z)&EG?vIkNBgW3Y1HUJ2N+5nKcpW(k<Hw4@FAnJcmTL7gE(8KWGr5l0WKz)83Z2<3X zhX2SIR{w)&<TikR55xa}ZifGXJrE45|3Nfr8-U?|ST_Wtw*f%o0O0z+hv9#855xbM zZUn~G1^~4KlDZlGBV%lB08l#sRPQ5W*cbqE{h!m#@IS8`Quiab0YLRXs2u>Q{~7)l zcQgDifnwzPAH)W?0eTqzS3+@BH^YBW|G&Bi+6L$$T>pdG0L?wH`X59y{BP@m)cwe9 z09ZQ!QvWmj@9Jjw-_s4L|Iyn3p#DFk{%80<v76!lBqR)K2f*ro5IwD%;s5j=2nN;t zAUv}Nt^V(3_&=wc;s4wo2nN;tFbo<4fVBe_bu;{j;U%DPf3!9LsQw3GNE?9R|B7x1 zUIps+_dxppu=*cFL)rig|JQdzFsu!LUjKvmTe=zkZ|#9#SlthzxA#EC0YGg4P~8u~ z4F7lcKrnLs4{HO!=mXsh|6v$g8vs=I!`cCm`k&!Hhz8aFCwmzF!!S70BN3qb|7<to z|FdZIKd3!`tqpLgo8kZE9t1|N|F8Bi{s)Z(ptb=R{@>_^U|ekgQ2h^T3*7Bt_<ye( z6+Zxt`6IOhKy^O|gX(?=&G7$eH!23z|1gZJ4FDSlc-_tL9~r~i0HC@b#0Jr*^*_V^ z58ap;)CK@yZ0!KhH~_p2(8KWmYY)T!Z{652zBT|%4%8L^wFAJo2U6FA>iOS24F5qG z#0Ftdoe!e_gX(=4Mv8k7lc^Wd|7YxB_zz+;^)P~I5Fb?6W5b|2pS6eaKRO20^Kjh5 z@ShzCgX(&07*yAzV;*R~A5`D-_AvZM#-O^NzlY&JGKSUr$h2?|!+&&)QTO*S{1?Z8 zrFt0t!!WGgN2X<a82=+<c-`N_@L#@%;lDyJ!+%hnkBmY6f0Z7_|6tt9@L#nD6@%)3 z^&W=*FpN_7L;L;OJq-V07*zl3^+4JIAR1KP!?0lw<9~x*#{ZytAH)XH#-KC+igY9l zuK#-=eSgy)hX3Z>4F5s(y+sd%2C+dHRPS5&F#d;O+a8AhAZ*vm@E=s?BV%yA-^2Ld zsRz>UckW^M55ulK4F8casQ(YcpfLc?9)|xg46FZrdKmuuqG3?I55w@fzZWw8532WJ zI22Up_b~hq>tXm0s`p_yvWM|M0z>M3aNXa_@IR)P;eTuo1jFk8gdWEK3B3&e6MGOi zxrgCD48!aH9)|y^Jq-WTp%_;8XZ0}t2Vqd(AA%YFgX;a<9)|xg46FM=G^pN(U`V|W zuKRl+eSc8@AA~{met8e$|MDINFoxCrAR1Kf!!T$JpsttUe_apS{@?%q|2Ot9!ZE!5 z?_v7i+QR_H@VXz`_XqX=J9`-ZgD|M>@9tsv55l0jAB6jQ8UOe9z%ZoV2iN^beSc8h z55iM>82?Z0VE|)T-4CKc^*#)P`~RSJ0JP4B)%_qERQJ#CVf+um;JUwu;s3%OhX0Gv zFuecY!}uRm?=SCR_z%LcdVggP!+#Kl_y2nt!E*p>dl>%1Fud;XVfYW~`@`@iq%nZa z(0U)a{s-0jFub#e;Xe$+>U|gus{i-)F#d;O@EAZ3!~X-lkh=e155s>LhWG!W{r;mp z4F8ew@g9c%$9fsy^**TnKh=xb|2y5o@cGEl`%VfYWK^N}%V4B%o9!+#h?uKPi3 zQ2h_8_aT_!|MeaOzR}A7?)QW0eHaFf0o>_f{13yRx*t^UgYdmxNZk+W`y*rIaeznA ze*fbhhW{`OtN)+%K-vKy8dmQk(=U4%{-a}*y1$3<{~IU<)%y_4@c(@`1b^s3(4e{= z8-~^YpL-bpLombt&(Jy_RPQ6>Z@movLH&Mg7*yB)>S6p3!pQ7jJq-Ur7*x+A<G;|l zA0!51<HATqKbXnT%kUqB!F7Kxv<-knv-C3l$A@8U0Jc7c|Hzo5m*GD)%+<^I9~b87 zW%!Sb`Fa`tW5dXGzd$eJe-IYxW&AJH%YcDJdKvyBW3e8F|L9nvm+`+uF9QmO*ZsYW z|D}5w|I1*(vONs{<$4hqROh2(rC!GW$QWGrgW3SS4F6Sn8UCxGVU1o!aQzRWHF_ET zYoTGCUWWh37*y|ruzoM&e-H-M`4G(T-=LQPT>pb;qh7}UAPkOlB*Lth>Az_o!+#KM z)(fH;{)6lOUdI2Hy^Q~@kg!cJ!++}@hW{WMgh6#b2*c`rhhE125X|u3sTYEs`xySa z^rB)|{qNSx_}`<4@xMne0~~wxGW<uz;JUw;@xM<m!+$>{9MH@7A5{N?Xb=tp)%{@1 z@ISbZ;eSXk1cT~*WE|1U_#c89{zvsP{EzH`&>%Lb-iP71UdI104664*II)l6e^M_h z2G##5y^Q};dKvzwA>oW(#{V!3s`o)SyN}^N2<P-N{D)y!-JjRX_`d*-8U7dbg604q zG>BaSs{4Bx|HJ6AUWWf546FMqdKvy#p<z({U(?I@AB6GN|9wpV8$td49;W|Iy$t_b zpt!A<@jncA^f3PK=w<ld*~jp|s~3Sm^*#vq^fLYj;l5sm|1dnEm*GDQPwHX#55kjs z8UIfKV}}1zdLi{btp1<Y%kX~&5}wt|_<vR}0~pWgW%v)n^LiQoBV$nAzo3`lKL{`C zW%v)npf<pgUdI10ysVeuKMb$vW%v)npn4yKSM@Uf2jMln4F6$xT`$9b7~ass@E;j( z>Sg@Dsh8nDsLqGsExnBYL3mp)<9`_5(aZFIdk@3^9la2|tC!(F4Dab>{Ev+H_Avb4 z*Ned5x*t^k_cHuH)XNCRM|v6lBV$lqj}3#`0Vnzx{-5e){Ew~vKhq1T|6w$!EpV=v z;r|6B46FMu^)mhk;VZq2|B>;vUWWfydl>$MXb=X~`^flKFXMj%X83=n2ZHbRLTGTk z532j27*zK^=w<wmj34zf{71%*`xyQ|=|#n$dLM+J_cH!}-p2sOFM1jNBV$<o|Eibq zKMcd_d}R7<AH)B5y{H&e|AX+yUdI10`cp6Ce*|Xu|EU*(L3RF@UWWh37*yY5!#{c% z|6{|TdL9}7?q&E7!XU9fy$t_xVNl%<l0&Bd^)meb*NfTy2i5)P7`ZLL+{gGI8AI9v z4F6er5ty}?;Xeo?*Z(j!wl)A~A0xPJfM^FW{O9ULU|1V~w~ygJ2xDslz{Egp0f9b- z|1eBU8vxuM=wtXV){DUC^*@XcY6pPoe;9_e0~r3x^dc~F8vw?JwF4CU82^K?QZK`Q zWDKhNL0Gkq;XeptwgVXcgX(`6hP4B<`xyR%Fmf9J#MbX)_>YW1bv}p>qCpr`_k%D} z)emNZ>U~K452^b>Z2(aH55l1OAB3%X8UDjCa{Z6o1^~AM`WXH@^dc~F8vt87z^#|z zKL{h&{~)$!A6grrmjPV=`}U!>0YL2mP~8v4eGLDDdJ!184FGBjz}f)eeGLC2dLcLx z$_CZ_Fbu2zWBWk$Kg0jHUI+%&{~!!%1As7cI{;Mo!!WE3klu%=|1)|S{)2E<FQop* z)&>C8|9O23|3SC_RQLBW{0GsXx*vu?b$>}O!~fDgNZk*r|3Mhk1_0InFpS&|sP1C` z*Z(!3{y(S;fFJ%3j($krzmEZ2|AXp&5Qf$NAR1EtGyHGsWq{ZJ*xCR+eGLCW7*_Yg zXjuIZqQUilAH)C2Pz<X7VHnf~0M-8>jM@f()c?rsfVq9h^*_V^dC<BaRR6;;Y8!yz z|B_w^hSmSe`w;a%tR1kbkKsQI!|MOFeUSb?tPQZPkKzA@UI^aU#{jPXL2UpS2DJk~ z^*;zh>VJm++j=1wR{w)&SpC1dkMTbU@9Aau55u_H00;XR!TtY3;I;s$J%DHf9PMNH z55nkefaARk|3UZ!wEjol`vpn?XZoP^KZu651wi%x`99P(0H{3xs{4`gm0pJb$QV@j zBV$+_;AS7=|C@ab|8Mo8V&rxJs4alp4!GaP@c%(CDn_sWv9$p}ZGvaLkh&jN8vxWE zfYtqQx{u-in_dJ4)&C%j-Ua~iL3KY2gW3Wg`yh2btnNpqk?VhCHhMeYdmqF9AHBFS zsLlt~{U8itgX(t>8-zh@Y#6itXZVjE|BQW%|3Mhk1_03@465&8G>DDB4F6gB8UC~O zVPaT)k504qGyVr*P@Rv88UAzjA?keYK8F9u7*y{gW4?aI{~*lY$M_$D8UFM4K`^ZD z2hoE44F5q`xR2pKG6vWAy$t_F`xqg(pW(k~Kf{0VK2!{<_a*xn|082q-7nq8@L#4M zf@S*{{=+b=&Ii%*eT@G>7*yvYFvEYPeun?beFzMy^O3PyKjVM(J_Lr<`<i_W|6v$Z z@58WeA0v1i07UEdG5iN%aDCs;_}`$P@xNgof(EgT`kDS4_d(D90%d$CHt%EpZ`RNF zA5`y~_c8tlVNjh9qd{z|eun?neFzMy_d(dUkMTbU+xId4x9?+sW5+&*|1b=y_d(dD zpYcBkyY?~uckN?<WA{FW|1b=y_mQ!8AH#nb2G#vA?BB=u9~pz{|G<8R{~!#i_mOdE zALD-*2G#u_9MRA4A5`}v<LExd|8U&T@IST>f<g6vd>_Mq7zWk-Ae_|C_&>Ri0ggfS ze`+7&e-H-M{V)s~1IX-S_z%ONx*vpd`xyTtV^F=H-w&z(L3Cjs!+#Ji>SqLx1r+x& z{x9x>)cv6Pzr2s(KQac@{gr);|G{)W!~g0&#{b~DzaP~9XZT;+&+xy#53~K>)XVh0 zsh{zGV;{r+=03*%&HW7jTl*MMaC;xae;5YU{V?3!$M_$C8UFY7LvVi|!+&Hvv5)aT z1S9HxP#a)MKg0j2eFzMy`$2emKg0i-eF!|ekMTbYgX(@5p4ZRte|{eVgX;c;eT?97 zfW>``|6v$Z_b=^Z_z%ONx*vvD_A&m4V21xIk?MbNy$`DUp%_&EukUC055u6kAA~pc zGydP)hl)XUKL~H_XZXLp4;6#z{+-Y|A5`xnFvI`7eGm-l|AW{d8ie<Q>U}U~_<yhu zQtuz`WB3olpn4yMkM%SD2jSy=jQ>Fx)b|JBll=_;PxoPt|DWw=_<y#K@js{?0IKtm z@r8ay@HoK5KF0qr46gtC82(@CWB7l$pW*-2K2!{<|F8Ek{)b^m-4Ct*`x*Y<?nA|( zdLM@G^)ddx55^4tLG?cjgW3TP`xySiFsR;#;V1o!|DX23FvI_+eGvQ{+W!a9FZvn( zzwE=ru)6<sKf`}y4665G_+3Ba|Mz{E7*yw@<4^qz|3CL(VpzTZwU6;XGXCDj_#c89 z{)6g&82;JE@ShO=)5i!N3jo#sfBP8!gYchzhW{Y^w~qnL2le?OY=-~;L3tm9q2)e| z0@d@3{S4qX0Gtit_cQ!w?!%5j^*^q507wpmVeJ4=-Ot|7@E?Rh^*uU<_4|?Qeh?eE z?gz2?`WgO%aWACKht>Ts8dUd#FsSYaVdT0W#un*=)cK%#ABHjN|9-~*68)h1pW(k` z9|D8weh|i1|AX2A$aO!Y{%82F*oVNN`XAK)hqVEa>wXYht)Jn)dLIHK*Z&|ks0{$C z`$06Q&kw?&dLM>i^*@X@>|+481CVK0yu)bYeg??+e?J4b?l<oP(GYCe$M7G7vDN>e z_5i5v2Vvy8AH;U($E^P$Z2&~Q4{HO!>V6Q7T=#qRBkF!o8vs=I`}H&a2hoVSpW(lM zAH)BEK1kh<UjK*m!|Hy9|Dk;h|3P&>2xG1P`x*X6^)dX9?uTGl{ST}6!E`^ve^A{I z!b$yzx*ygK0M-34oZiRqAA~{uepuZPqCs^(2qV}1xzK(;sNRRQ13+~@2!rZ>Sly4e z{_kV>U)j&_zXD3v^fQ9_wSA2L;kX~O{0G(hAPlbiLG?cfgWCY0b^ru}`u^DJ|E_+9 z|J{8E4C?=5YXgA#{uBEc{(~^6-iKj~`oE9iKd9~pVXXCkKg0jIeF%)N{$JS7@PBb1 z0>kQl5DlyQK{RsRkGKBsL)87qZ2;8zpW*-JJ_rWY{UD57|L^E$1kVA0>i?bn4F7lc zp<+;-kBmWeKL|tWe@NX=xc+DOf2^P3|M5Nq2G#wrHUKQ&!)Q>O0E9v908rfzqCxdO zhz+7a{eDQ@&+z{uwBCo+{pj`owSGqM9KiK{21xzi&j9ZCgZlm;d<#eY532X?_A&gw z*N<B7<EsBb?Epmm519ji)%!3SRPVzusQw3G)HVRa|5tqwj9mAF*s!`EM1$&oP@f;t z24MLAz7K(s>wi$)55u_H0AKqV{-a}9oe!gb^fUYiVS@F4Kg0jueGm+*<3V*l2*da= z`d>e&eE@0`VCH{NozDQO??K}L{S5z^CO|N#O#otp>Un&at)KBfHjG^FgX(?|=9s|n zpQ|4?2G#o@%+t^KAB4g6J*?hGqCs`OKtIEObPTHZVOVGa<A0$E4F5&?Q8BFE7n{KN zABI8oJvx@^XZVkfVRb)<mYu-(AB5%l8UMqud_Ti~7*?17VT0@aen|fx#8&BN{10ja zfM}Ho4F5s(J_xHr*&6)}|B*4M-Unf=e#ZYGtkci<AA%YF>-0nV{h<0^ub=Th2!s0m z5DcpO8UBO%{YL!=8kX;2w8;cUc>NC=2e9a8_>YW1bw3Q-^fUg4U<NP^s{8FGF#HE$ zP@RvALH&QHe#ZY`Jb~fAOFsg;^)vj3VNksf$NdcdJti>x2i5&B466Hm`WgR&FsS~A zV21wz{iqmJ_Xka21djoLXi(h`!eRXk|B*4M?uX&1e#ZX@45{~HCP3)8eun=r466GR z`WgQxOke<GP~8v1DgBK9kukXb?`Qa*frdeKe^x)^e-O^;XZ#Ptd7wT&6ocx27zWk* z2+RQP`<L`H{D<MPeun=bT+z??AA%wEKd21=!l3%UY67J02eH9z06g_SXbb?}2Iyz_ z-!g&We_KBSgX;f|e#ZYG+||$cA5`~)FsT0T>1X&4!?60lZvx~03H>0<@P9%-r0$>8 z&+s3FLG?ZiPwQv=55Wxor}ZQ1{}~e)|Ig}2U~vDxpW*+U2@L;1^*%CQ(9ifEh8OlR z{s-0lizYDq2jM0C4F6#mRQE6IXZ#PsEBYD#Lombt75xnVS0Ulm{S5!tOkn&EqSy5^ z{$JP60LHL-f5QaE{~!#i`(YR|2Eg!tOFsmI>V6mo*ZZKlABsVBKM3!d!0>-hKPukW z&-fo1@9$&$zrUXWj1ToQ{D)y!-~UKIBX}GDROcgOQ2l?RpW#0UgX(`6hUI%0eWst` zKM2F>{c{r-|AXs&P~RVlFZDA)>i&L)|Cjn9{eDp055wSkA5`~)F~fgw{ol{<|HcFe z8&vNjW6&7DoqopuFbt~qLHPazNE_fmKf`}?465^y@uLY0|DW`u;%DHo0EYh{8iqmj zJ_0lRf7OqPL3KV1znQ@JABMqoe?Q}Y2+i>SLqDYM2hqqFR_`OzU-}vUqhf~tUy$nm zZxa~)BV$mVkB&iYfM5NL@Uehj6Bz!(FsPo#g+cW_ItH}`Kw_|XhtZ%qo)KE-gV@+G z^F+q~AaM}QI)U*&Hq17G;Xg8FpUChZhC%f{Hq1SN@jo^Us{45+F#PA8$nYOTgW3W7 z6Bzzu!>~4h-~`71APlMZA$32f{)b`F35@^IF|7Uv(c%-C{!31PVTS*b6CfDY29Tb> z_#cEpbv`<l2i5gx7*ziwW912q|B*4M?gwGji46Zi7*ziwW6cSS;C29r24SrU4F5q` zdm<y4)}6rk9~tXUU;@|wAR2@XCouenV5a|&`XAH=z-<44>VHtZZ$5$Hzxf0vl)B$? z0^@%Www}QFAA&*kKEr?82?z|T`;oEZ1jhde%<$i70>gjji4g2Mf#E+gcAvobAA~`5 zJ~H;4$oSuT0s@2Teh~JZ$nf8P0xAv!)%j2is`p_ycp}69&<O|(YXgK&VEiA6f*Jlt zgX(-J2G#!{96OQmfBXa(X80cut@{%vGX4kQ<Oz)bVHi~Zr%qt{pE{8NjMFAC{0HIm ziH!d<Cm=AW?$4UQ@IQMZ!~fg~2n=ci<WFGy55ol$82=YeWcpt)f#H8K5{A|Nr4tzc zm%}l`|B8Nw|CJLM;TT-+Phk2FqiZKH{RiQ?37GNUIDz4R;{-<V96<8~CUCtEs{3IW z)COpu!1y1AJ0>vv@0<w1-4hu8!*K5e#{V!3s{8vUF#HE$aNR$F;r~P^2G#$QCouj8 z;i(fC|4*I30LGxYAB3k*VEhlN`(b$Y1g8J9CosS<sQ#Zjk@5fh38)xc|4(4}zi=W1 zgX(@5UOIvCKMXIM!0;c0mrrE)55g-aF#LyMP#a)1sNSEz2(JIvOaQe5pmqNQ#{cV~ z7*zLz@WzQu|2IznVTS*kCqOW${@*%*@jnP}o51)V8Sk9H@E?Xjbw3F2p2+wghWAcj z{J(bs!~cCC+|T%b|3n5bJ}`mdKMaHF|HBg){~w;f0LDiqF#HGMqZ1kagYfYQ4F6#m zRQH4MsR<1KPfcL_529h^K8!v)f$={GgX(=4K0lG+|M`hb|1VAeVTS(~CqVG!35<~X ze*)uw5c|pm#{US+@c%lfzDL5K`X7XEPGkhP1#VAZ{Ev+9OknsA!gnV!{0CuB{f~|x zPGJ0xj34zg{s-0lk0(OtrxO_eqhnCr|9k?|e>k4V@c-omRQ!4Z<9~DvtM@_l+ldVS z-%Mcm{~ilQuKPbuVEhlmpC>T>M_`8kpC>@;{0R*IzoKE}x*x>;K9TW12>+bG_#YD^ z>U~)K|91l8|KAfK7{o@$pt>F;2BQB@VEX^BpW#244U2dv4XXRmF{rKwiGgTzjA#Qe z{AZnjijnJo7@JTV05%@LJ%QmrG6vQA$QaZX0AZYMfC&u$1tu{37n}&euzDYv28{(^ zwgDLai%mda@rexoK^Rv5gJ@VA07Qe@03a+of#E+gmIL+uk=g*rbw7x$I1yI=GyGSc z!0;bb_k%E~?uXIH^*?M3Kyw1ae;5YU|1b=y`@#KxcsqdMzup9f|N0Xl7*hAc+5imy zjV3aJ+X2vMhf^jK82*E>=|oWd55dU&e-PVpBEx^{2?%V{kJ=7EuKz)7#|aGoVHi~Z zgD}oEz(j`s?of=}20*U=y(cjI_nE-(A5{N?X!JG!Xe<ES4w%UBKWG91V{HRWVE7+C zk>P*j1O$!(jrl|Ce^6ThRR6;;sNP4$urUDCHUPu_lnIc!AH59#8V7*10T}*gPGI;C zs{cV4x&8;S;cbA44FB^dGJxxTQ2k#x5qle;d;-INWQ^VhsGi91ziI-*|5`K*k9a5p zUjI*E_}@Gc((i}Sur>gs?q~SlK7rvssQ!mxP&)ut|AXk>i46Z?7*zMeFs$we(UT@H z{D<Mm6Crg!avK0t|AX+12@L;1c;-Yz-4AL9fa-r3MzjMM{?DJl@P7fc{s+;px*tX_ zoxt!PhC%f|48!Vv7`<u&!+#Kl)%`FUGzI{x|3UPI2@L;1c;iG!y$`GZK{RF?fZ_kP z2@L<YPh|MNqaRlrfB{_hgX(_}2Dbq~?SKim+5nLHAJh&2)&DSz(FT~n@c-mQ1cpXC zoC4MTU_6oG|G5ba;I;s${s*x^^o4#%-4AO6fcpO+466S@_{s!^|1f-YBE$b{ps{}} zZ2(9+fZ_k`38)xW|HEkX`X9sxjRicM!0;c2LG?cjgW3Vu>i=gG82-cX^N9@qK^VCW zfIJR>+ztTM`N$a54nS`MAlLse_Q#0~|3Mg3=VQa*zCT(U0MsS`)&0o$`$UHSApCOz z!+%^D)CK_6{U92ILG?TcgTz1>#Qr;h;XgJS9`R5HxSpTH@E=Tr`uUR>{xeNv1oJ_4 zJpwcQXPyYbpn4y~2GJnQHj&{!I)>Hz$Ta6f#{ZlX8Bj2CoeyL4Ooa6PLG?X4My~$_ zCNlhoVOYJ7ObbtB{Ev*mb^k<$|DsSVHi_Xs2!rZ-bPTTdCo=w*f@0~34F8d_%p`{Y zauX34*BF4}M27z`46gSlLhFBMzaLcp!!W4+*O<ugABJJ|K8V(W_WMEoe+XvyuR8&O z^`P}Wto{elpf&)w-k%7q|0iOu{{q$f$k<{c<9{%o#PA<f@53;t{<oRP@E;k&#sTan zGXA%p$bf=D^}o|ZhW{W8tNTGTtpD#ek>NiG!|Hw*4eI+tFvEXPy$`}Z6Crg!sQ!oH zfQgLYu>cSqIFaE$2nS7q)cv4(ABI6=0AUju|A$S2)cc^iAA~{mf7C>V|1b=y_dz&j z62t%Ki46Z^p%_;8Cro7g55k~&AA%YFCr@DbpE41FVRb)<2KD_R7*g+p>;8$5zCWn{ z55nMje<I`mJTQjT`=GiXghBN_48z6%N+vP<FP(_Mp!&aJBIAD;29E(uWcXh>k>NkM z{+|S)L2OVvpbks?H%(;t55u5(ABI~eGX95PNWBlP`=R}QP`wYspnAV&BEx?WhSmKb zx_=_We;5YU`x7TJ{GT+5;XkO(N5<18GX95QP`y8WBEx?W2G#p84665G7*yv&FvI`3 z6QT9~M27zhp#6S$|9=wW|HTtQnBo88iAZ(-M27#%pnZQ({~v@wb^oe~4F5rR^+bmM zAiQQ0Xbgbi|JsR+aJ+sZ!+#LoFp1$m2!rZ=5C+xxFuY|V<9`s|I+5W&2*c`qP~8v0 zu>L=YhV=Ux{_mcM!22dL{D)y!{~tty`u_(fGW>^OP`wYrM<$~7|3URX2!qA|PE2I{ ze*&rQ2ekvB#Xg(@)%~X@GX6gcs{bc3{69Ad)b~eVP`!U?A|rSV07PG&$nYN-gX(@z zy${34V*odx{r;O18UDjCtp2|<k>NiGgZlk2d~XuNe{g+2k>URXBn+$fk!eu955ti9 zpW*+ri46arg6jQ=5H_gJN5-J~|J6js|H%0DM27#!_{}7S{~!#i_hA@T|9_as2p$gr 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%0A~Hq@V{s_r0)-^|3PB_AR1Qx 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
PlPWL0EkW(|-`w1l9LQSbGU0xD5cJL0ES&<9}qV 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%0A4a3s|Dd`bgh6#aGKSUrFq&HR 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 literal 0 HcmV?d00001 diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt index a650411..a987f63 100644 --- a/external/CMakeLists.txt +++ b/external/CMakeLists.txt @@ -22,27 +22,10 @@ target_include_directories( add_subdirectory(DMath) target_link_libraries(${LIB_NAME} INTERFACE DMath::DMath) -# libktx -set(LIBKTX_FOLDER "${CMAKE_CURRENT_SOURCE_DIR}/KTX-Software-master") -target_include_directories( - ${LIB_NAME} - INTERFACE - $<BUILD_INTERFACE:${LIBKTX_FOLDER}/include> - $<INSTALL_INTERFACE:include> -) -target_include_directories( - ${LIB_NAME} - INTERFACE - $<BUILD_INTERFACE:${LIBKTX_FOLDER}/other_include> - $<INSTALL_INTERFACE:include> -) +# DTex +add_subdirectory(DTex) +target_link_libraries(${LIB_NAME} INTERFACE DTex::DTex) -set(LIBKTX_LIB_FOLDER "${LIBKTX_FOLDER}/lib") -set(KTX_SOURCE_FILES - "${LIBKTX_LIB_FOLDER}/texture.c" - "${LIBKTX_LIB_FOLDER}/filestream.c" - "${LIBKTX_LIB_FOLDER}/checkheader.c" - "${LIBKTX_LIB_FOLDER}/hashlist.c" - "${LIBKTX_LIB_FOLDER}/memstream.c" - "${LIBKTX_LIB_FOLDER}/swap.c") -target_sources(${LIB_NAME} INTERFACE ${KTX_SOURCE_FILES}) \ No newline at end of file +# Vulkan-headers +add_subdirectory(Vulkan-Headers) +target_link_libraries(${LIB_NAME} INTERFACE Vulkan::Headers) \ No newline at end of file diff --git a/external/DTex b/external/DTex new file mode 160000 index 0000000..9a0b7e1 --- /dev/null +++ b/external/DTex @@ -0,0 +1 @@ +Subproject commit 9a0b7e18d9d774e85c8a15a7204b4da7815ba082 diff --git a/external/KTX-Software-master/BUILDING.md b/external/KTX-Software-master/BUILDING.md deleted file mode 100644 index dd73a3c..0000000 --- a/external/KTX-Software-master/BUILDING.md +++ /dev/null @@ -1,409 +0,0 @@ - -Building KTX -============ - -This document describes how to build the KTX library `libktx`, the -portable KTX loader tests `ktxtests` and the KTX tools `ktxtools`. - -Status ------- - -You can build `libktx` and `ktxtests`for GNU/Linux, iOS, macOS and -Windows. There are three versions of the tests for the -OpenGL<sup>®</sup> loader: GL3, ES1 and ES3. There are also tests -for the Vulkan<sup>®</sup> loader: VK. GL3 can be built on GNU/Linux, -macOS and Windows. ES1 can be built on iOS and with the PowerVR emulator -on Windows. ES3 can be built on iOS and with any of the major emulators -on Windows. VK can be built on GNU/Linux, iOS, macOS and Windows after -installing a Vulkan SDK. - -Android builds will follow. - -You can build `ktxtools` for GNU/Linux, macOS and Windows. - -Make/Solution/Project Files ---------------------------- - -The project includes separate cmake/make/project/solution files for the -KTX library, `libktx`, the KTX loader tests, `ktxtests`, and the KTX -tools, `ktxtools`. The last 2 have dependencies on the first. - -All these make/solution/project files are generated by GYP and should -not be hand edited. Make changes to the GYP files and regenerate the -projects. - -The current project files include both OpenGL and Vulkan loaders and -tests. The plan is to offer alternatives in future. - -Building --------- - -### GNU/Linux - -```bash -cd build/make/linux -# Build everything -make -# or -make -f [ktxtests|ktxtools|libktx].Makefile -``` - -**Note:** The generated makefiles cannot be used to build `vkloadtests` -due to a problem with the shader compile code generated by GYP. Use the -`cmake` files instead. - -Alternatively you can use cmake: - -```bash -cd build/cmake/linux/Debug # or .../Release -cmake . -make -``` - -You can create an Eclipse project with `cmake`. - -```bash -cd build/cmake/linux/Debug # or .../Release -cmake . -G "Eclipse CDT4 - Unix Makefiles" -``` - -You can import this into Eclipse via "Import->Existing Project". - -### iOS and macOS - -Use the generated projects under `build/xcode/ios` to build the -library and load tests to run on iOS. The OpenGL tests will use -OpenGL ES 1.1 and OpenGL ES 3.0. The Vulkan tests will use MoltenVK. - -Use the generated projects under `build/xcode/mac` to build the -library, load tests and tools to run on macOS. The OpenGL tests -will use OpenGL 3.3. The Vulkan tests will use the macOS Vulkan SDK -and MoltenVK. - -To find the Vulkan validation layers when running the macOS Vulkan -load tests set the environment variable `VK_LAYER_PATH` to -`$(VULKAN_SDK)/macOS/etc/vulkan/explicit_layers.d` when running the -application. Environment variables are set in the Arguments section -of Xcode's Scheme Editor. Validation is only enabled by the debug -configuration. - -#### Xcode Preferences - -You must create the following Custom Path preferences in Xcode: -[`DEVELOPMENT_TEAM`](#development_team) & [`VULKAN_SDK`](#vulkan_sdk). -If building for macOS you must also set [`ASSIMP_HOME`](#assimp_home). - -##### DEVELOPMENT_TEAM -As of Xcode 8.0, Apple, in its wisdom, decided to require selection of a -Development Team for signing. If you set the Development Team via the -Xcode GUI, Xcode will store that selection in the `project.pbxproj` file. -Thereafter `git status` will show the project file as `modified`. -Instead abuse Xcode's _Custom Paths_ preference to store your -development team identifier outside the `project.pbxproj` file by -setting a DEVELOPMENT_TEAM custom path (replace ABCDEFGHIJ with your -team identifier): - - - -(Xcode menu → Preferences… → Locations → Custom Paths) - -Note: if you change anything in the project (update a build setting, -add a new build phase, rename a target etc.) the development team will be -automatically added to the project.pbxproj file. So, as noted above, -changes should be made only to the GYP files. - -Thanks to [0xced@stackoverflow](http://stackoverflow.com/users/21698/0xced) -for this solution. - -The team identifier, formally known as the Organizational Unit, an -alphanumeric code (in the case of the author's "personal team"), can be found -as follows: - -- Open Keychain Access (it's in /Applications/Utilities) -- Select *login* in top left pane -- Select *My Certificates* in bottom left pane -- Right click the certificate of the team you wish to use; choose *Get Info* - from the context menu. -- Click the triangle beside *Details* to expand it, if not already expanded -- Copy the value of the *Organizational Unit* field under *Subject Name* - -If you have already manually selected your team in Xcode, you can find the -Organizational Unit and revert to the original project file by running -the following in the KTX project root: - -```bash -git diff | grep DEVELOPMENT_TEAM -git checkout build/xcode -``` - -##### VULKAN_SDK - -Set this to the location where you have installed the [Vulkan SDK for macOS](#vulkan-sdk). - -##### ASSIMP_HOME - -Set this to the location where [`libassimp`](#libassimp) is installed. If -you use the MacPorts version, this will be `/opt/local`. - -### Windows - -Use the solutions under one of -`build/msvs/{win32,x64}/vs20{10,10e,13,13e,15,17}` to build the library, -load tests and tools for Win32 or x64 plaforms. There are separate -solutions for Win32 and x64 platforms. - -**Note:** Builds of the Vulkan loader tests require vs2015+ because they -use `vulkan.hpp` which needs C++11 & in particular `constexpr`, so solutions -other than vs2015 and vs2017 do not include a `vkloadtests` project -and their `appfwSDL` projects do not include Vulkan app support. - -Dependencies ------------- - -The KTX library, `libktx`, and the KTX loader tests, `ktxtests`, use -the _GL Extension Wrangler_ (GLEW) library when built for -OpenGL on Windows. - -The MSVS `ktxtests` solutions on Windows include OpenGL ES versions. -To build a complete solution and run the OpenGL ES versions you need to -install an OpenGL ES emulator. - -The KTX loader tests in `ktxtests` use libSDL 2.0.8+. You do not -need SDL if you only wish to build `libktx` or `ktxtools`. - -Binaries of these dependencies are included in the KTX Git repo. - -The KTX vulkan loader tests in `ktxtests` require a [Vulkan SDK](#vulkan-sdk) -and the Open Asset Import Library [`libassimp`](#libassimp). You must install -the former. The KTX Git repo has binaries of the latter for iOS and Windows -but you must install it on GNU/Linux and macOS. - -As noted above, the KTX project uses GYP to generate make, project and -solution files. *You do not need GYP unless you want to re-generate -the supplied projects or generate additional projects.* - -### GL Extension Wrangler - -Builds of GLEW are provided in the KTX Git repo. - -#### Building GLEW from source - -If you want to build GLEW from source you need the OpenGL core profile -friendly version, i.e, 1.13.0+. You can either clone -[the master GLEW repo](https://github.com/nigels-com/glew) and, following -the instructions there, generate the code then build it, or you -can download a pre-generated snapshot from https://glew.s3.amazonaws.com/index.html -and build that following the instructions also found in -[the master GLEW repo](https://github.com/nigels-com/glew). -The snapshot used for the binary included in this repo came from -https://glew.s3.amazonaws.com/index.html?prefix=nigels-com/glew/25/25.1/. - -### OpenGL ES Emulator for Windows - -The generated projects work with the -[Imagination Technologies PowerVR](https://community.imgtec.com/developers/powervr/graphics-sdk/). -emulator. Install that before trying to build on Windows. - -Projects can be modified to work with any of the major emulators; -[Qualcomm Adreno](https://developer.qualcomm.com/software/adreno-gpu-sdk/tools), -[Google ANGLE](https://chromium.googlesource.com/angle/angle/)<sup>*</sup>, -[ARM Mali](http://malideveloper.arm.com/resources/tools/opengl-es-emulator/) -or [PowerVR](https://community.imgtec.com/developers/powervr/graphics-sdk/). -To use a different emulator change the selection at the bottom of -`gyp_include/config.gypi` and regenerate the projects. If you want to run -the load tests for OpenGL ES 1.1 you will need to use Imagination -Technologies' PowerVR emulator as that alone supports OpenGL ES 1.1. - -<sup>*</sup>You will need to build ANGLE yourself and copy the libs -and dlls to the appropriate directories under `other_lib/win`. Note -that ANGLE's OpenGL ES 3 support is not yet complete. - -### SDL - -Builds of SDL are provided in the KTX Git repo. These binaries -were built from a post 2.0.8 changeset given below. This changeset -includes a fix for an issue with OpenGL applications on macOS Mojave. -Standard SDL 2.0.8 works fine on all other platforms so you can download -binaries from [libsdl.org](https://libsdl.org), if you prefer. - -#### macOS Notes - -If you wish to use the provided version of SDL in other applications -on your system, you can install the framework. Open a shell and enter -the following command - -```bash -cp -R other_lib/mac/<configuration>/SDL2.framework /Library/Frameworks -``` - -replacing `<configuration>` with your choice of `Debug` or `Release`. -If you do this, you can modify the projects to use this installed -SDL framework instead of copying it into every application bundle. -See`gyp_include/config.gypi` for details. You will have to regenerate -the xcode project if you wish to do this. - -#### Building SDL from source - -As noted above, KTX uses a post SDL 2.0.8 changeset, no. -[12343](https://hg.libsdl.org/SDL/rev/84eaa0636bac) in the canonical -Mercurial repo at https://hg.libsdl.org/SDL or the automated GitHub -mirror at https://github.com/spurious/SDL-mirror. Clone the repo, -checkout changeset [12343](https://hg.libsdl.org/SDL/rev/84eaa0636bac) -and follow the SDL build instructions. - -Copy the results of your build to the appropriate place under the -`other_lib` directory. - -### Vulkan SDK - -For GNU/Linux install the Vulkan SDK using the `.tar.gz` file from -[LunarG](https://vulkan.lunarg.com/). Set the environment variable -`VULKAN_SDK` as instructed by LunarG. - -You will need to build `glslc` whose binary is not included in the -SDK. To do this: - -```bash -cd $VULKAN_SDK -./build_tools.sh --shaderc -``` - -It takes a while. 10 minutes or more! Add a comment to [issue 671 -at LunarG](https://vulkan.lunarg.com/issue/view/58e4e57be46ffe7e73becd83) -to apply pressure on them to include this binary. - -For Ubuntu Xenial (16.04) & Bionic (18.04) you can install the -Vulkan SDK from the Ubuntu distribution. Follow the instructions -give at [LunarG](https://vulkan.lunarg.com/). The `glslc` binary -is included hence use of this distribution is highly recommended. - -For Windows install the Vulkan SDK for Windows from -[LunarG](https://vulkan.lunarg.com/). Set the environment variable -`VULKAN_SDK` as instructed by LunarG. - -For iOS and macOS, install the Vulkan SDK for macOS from -[LunarG](https://vulkan.lunarg.com/). Set a `VULKAN_SDK` Custom -Path in the Xcode preferences to point to the `vulkansdk-macos-*` -folder you extracted from the download. This SDK contains MoltenVK -for both iOS and macOS. - -### libassimp - -Binaries for iOS and Windows are provided in the KTX Git repo. - -#### GNU/Linux - -Install from your package manager. For example on Ubuntu - -```bash -sudo apt-get install libassimp3v5 -``` - -macOS - -Install via [MacPorts](https://www.macports.org/) or -[Homebrew](https://brew.sh/). For example - -```bash -sudo port install assimp -``` - -Set an `ASSIMP_HOME` Custom Path in the Xcode preferences to the -parent of the `include` and `lib` folders where `libassimp` is -installed. For MacPorts this is `/opt/local`. - -### GYP - -All the builds use cmake, make or project files generated with -[GYP](https://gyp.gsrc.io/). A modified version, available in the -`remaster` branch of [this -fork](https://github.com/msc-/gyp/tree/remaster), is needed to -generate makefiles and vs2013+ projects. To install GYP, follow the -[instructions in the -fork](https://github.com/msc-/gyp/tree/remaster#installing-gyp). -These work for either version of GYP. There are no install instructions -at GYP's home. - -*You do not need GYP unless you want to re-generate the supplied projects -or generate additional projects.* - -*You can use the standard version of GYP if you do not need to generate -make projects or Visual Studio 2013 or later projects.* - -### GNU make 3.81+ - -You need this to run the top-level `GNUmakefile` which runs GYP to generate the -various projects. It is possible to type the GYP commands manually, if you -really do not want to install GNU `make`. However, if you want to have GYP -generate makefiles to build the KTX project, you will need GNU `make` and -a Unix-style shell to run them. - -On Linux, GNU make is available through the standard package managers in -most distributions. A suitable shell is standard. - -On OS X, GNU make is included in the Xcode Tools available from -[developer.apple.com](http://developer.apple.com/tools/download/). -A suitable shell is standard. - -On Windows, if you do not intend to generate makefiles to build KTX, you -can install a native Windows version of GNU make from -[GnuWin32](http://gnuwin32.sourceforge.net/packages/make.htm) and run -`make` in a Command Prompt (`cmd.exe`) window. - -To get a Unix-like shell choose one of the following: - -* install [Git for Windows](https://msysgit.github.io/) a.k.a `msysgit` -* install [GitHub for Windows](https://windows.github.com/) -* install [Cygwin](https://www.cygwin.com/) making sure to include `make` from -the *development* section. - -The first two of these options include a copy of [MinGW](http://www.mingw.org/) -(Minimalist GNU for Windows). Sadly it is not the *same* copy; installing both -tools results in two copies of MinGW on your system. Neither copy includes -GNU `make`. You can download a pre-compiled version from the -MinGW project [32-bit](http://sourceforge.net/projects/mingw/files/MinGW/Extension/make/make-3.82.90-cvs/make-3.82.90-2-mingw32-cvs-20120902-bin.tar.lzma/download) or -[64-bit](http://sourceforge.net/projects/mingw-w64/files/External%20binary%20packages%20%28Win64%20hosted%29/make/make-3.82.90-20111115.zip/download). -Unpack the archive and you'll find a file called `mingw32-make.exe` (32-bit) or `make` (64-bit). - -If using the Git for Windows shell (*Git Bash*), copy this to either - -`%SystemDrive%\Program Files (x86)\Git\usr\bin\make.exe` (Windows 8.1 and 10) - -(omit ` (x86)` if using 64-bit) or - -`%USERPROFILE%\AppData\Local\Programs\Git\usr\bin\make.exe` (Windows 7) - -:confused: I do not know if the difference in OS caused the different install locations -or if something else is at play. - -If using the GitHub for Windows shell (*Git Shell*) copy this to - -`%USERPROFILE%\AppData\Local\GitHub\PortableGit*\usr\bin\make.exe` - -### Doxygen - -You need this if you want to generate the _libktx_ and _ktxtools_ -documentation. You need a minimum of version 1.8.14 to generate -the documentation correctly. You can download binaries and -also find instructions for building it from source at [Doxygen -downloads](http://www.stack.nl/~dimitri/doxygen/download.html). Make -sure the directory containing the `doxygen` executable is in your `$PATH`. - - -Generating Projects -------------------- - -To (re-)generate the projects run the following commands in a shell: - -```bash -cd <your KTX clone> -make [cmake|make|msvs|xcode] -``` - -All important configuration options are gathered together in the file -`gyp_include/config.gypi`. Change these as necessary to suit your local -set up. - - -{# vim: set ai ts=4 sts=4 sw=2 expandtab textwidth=75:} diff --git a/external/KTX-Software-master/CODE_OF_CONDUCT.md b/external/KTX-Software-master/CODE_OF_CONDUCT.md deleted file mode 100644 index a11610b..0000000 --- a/external/KTX-Software-master/CODE_OF_CONDUCT.md +++ /dev/null @@ -1 +0,0 @@ -A reminder that this issue tracker is managed by the Khronos Group. Interactions here should follow the Khronos Code of Conduct (https://www.khronos.org/developers/code-of-conduct), which prohibits aggressive or derogatory language. Please keep the discussion friendly and civil. diff --git a/external/KTX-Software-master/CONTRIBUTING.md b/external/KTX-Software-master/CONTRIBUTING.md deleted file mode 100644 index 34ba770..0000000 --- a/external/KTX-Software-master/CONTRIBUTING.md +++ /dev/null @@ -1,12 +0,0 @@ -## How to contribute to the KTX library and tools. - -1. Make sure you have a GitHub account. -2. Fork the repository on GitHub. -3. Make changes to your clone of the repository. -4. Update or supplement the tests as necessary. -5. Submit a pull request against the _incoming_ branch. - -If you will be generating documentation with or preparing -distribution archives, you **must** follow -[these instructions](README.md#kwexpansion) to install a -smudge/clean filter for expanding keywords. diff --git a/external/KTX-Software-master/LICENSE.md b/external/KTX-Software-master/LICENSE.md deleted file mode 100644 index 0a0090d..0000000 --- a/external/KTX-Software-master/LICENSE.md +++ /dev/null @@ -1,228 +0,0 @@ -License and Attribution Notices {#license} -======================= - ------------------ - -This file has two names: LICENSE.md and NOTICE.md. The former to tell GiHub users this -is the license. The latter to tell creators of derived works that they need to distribute this -with or make it available in a display generated by any Derivative Works, except for any -parts that do not pertain to the Derivative Work, in accordance with clause 4d of the -Apache 2.0 license, i.e. this is the "NOTICE" file. - ------------------ - -## Default License - -With the exception of the files listed explicitly below, the source -is made available under the Apache License, Version 2.0 (the "License"); -you may not use these files except in compliance with the License. -You may obtain a copy of the License at - -    http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -libKTX is the work of Mark Callow based on work by Georg Kolling and Jacob -Ström with contributions borrowed from Troy Hanson and Johannes van Waveren. -The source contains code - - © 2010 & © 2013 The Khronos Group Inc. - © 2008 and © 2010 HI Corporation - © 2005 Ericsson AB - © 2003-2010, Troy D. Hanson - © 2015-2018 Mark Callow - © 2016 Oculus VR, LLC. - -The KTX load tests are the work of Mark Callow with a few small portions borrowed -from Sascha Willems' Vulkan examples and use Sam Lantinga's libSDL for portability. -The source contains code - - © 2013 The Khronos Group Inc. - © 2008 and © 2010 HI Corporation - © 1997-2018 Sam Lantinga - © 2016 Sascha Willems - © 2015-2018 Mark Callow - ------------------ - -**IMPORTANT:** Due to GitHub Markdown limitations license text has -been copied into this file from the files named below. In the event -of a discrepancy, the licenses in the files shall be deemed correct. - -## libktx Exceptions -### etcdec.cxx - -etcdec.cxx is made available under the terms and conditions of the following -License Agreement. - -Software License Agreement - -PLEASE REVIEW THE FOLLOWING TERMS AND CONDITIONS PRIOR TO USING THE -ERICSSON TEXTURE COMPRESSION CODEC SOFTWARE (THE "SOFTWARE"). THE USE -OF THE SOFTWARE IS SUBJECT TO THE TERMS AND CONDITIONS OF THE -FOLLOWING SOFTWARE LICENSE AGREEMENT (THE "SLA"). IF YOU DO NOT ACCEPT -SUCH TERMS AND CONDITIONS YOU MAY NOT USE THE SOFTWARE. - -Subject to the terms and conditions of the SLA, the licensee of the -Software (the "Licensee") hereby, receives a non-exclusive, -non-transferable, limited, free-of-charge, perpetual and worldwide -license, to copy, use, distribute and modify the Software, but only -for the purpose of developing, manufacturing, selling, using and -distributing products including the Software in binary form, which -products are used for compression and/or decompression according to -the Khronos standard specifications OpenGL, OpenGL ES and -WebGL. Notwithstanding anything of the above, Licensee may distribute -[etcdec.cxx] in source code form provided (i) it is in unmodified -form; and (ii) it is included in software owned by Licensee. - -If Licensee institutes, or threatens to institute, patent litigation -against Ericsson or Ericsson's affiliates for using the Software for -developing, having developed, manufacturing, having manufactured, -selling, offer for sale, importing, using, leasing, operating, -repairing and/or distributing products (i) within the scope of the -Khronos framework; or (ii) using software or other intellectual -property rights owned by Ericsson or its affiliates and provided under -the Khronos framework, Ericsson shall have the right to terminate this -SLA with immediate effect. Moreover, if Licensee institutes, or -threatens to institute, patent litigation against any other licensee -of the Software for using the Software in products within the scope of -the Khronos framework, Ericsson shall have the right to terminate this -SLA with immediate effect. However, should Licensee institute, or -threaten to institute, patent litigation against any other licensee of -the Software based on such other licensee's use of any other software -together with the Software, then Ericsson shall have no right to -terminate this SLA. - -This SLA does not transfer to Licensee any ownership to any Ericsson -or third party intellectual property rights. All rights not expressly -granted by Ericsson under this SLA are hereby expressly -reserved. Furthermore, nothing in this SLA shall be construed as a -right to use or sell products in a manner which conveys or purports to -convey whether explicitly, by principles of implied license, or -otherwise, any rights to any third party, under any patent of Ericsson -or of Ericsson's affiliates covering or relating to any combination of -the Software with any other software or product (not licensed -hereunder) where the right applies specifically to the combination and -not to the software or product itself. - -THE SOFTWARE IS PROVIDED "AS IS". ERICSSON MAKES NO REPRESENTATIONS OF -ANY KIND, EXTENDS NO WARRANTIES OR CONDITIONS OF ANY KIND, EITHER -EXPRESS, IMPLIED OR STATUTORY; INCLUDING, BUT NOT LIMITED TO, EXPRESS, -IMPLIED OR STATUTORY WARRANTIES OR CONDITIONS OF TITLE, -MERCHANTABILITY, SATISFACTORY QUALITY, SUITABILITY, AND FITNESS FOR A -PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE -OF THE SOFTWARE IS WITH THE LICENSEE. SHOULD THE SOFTWARE PROVE -DEFECTIVE, THE LICENSEE ASSUMES THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. ERICSSON MAKES NO WARRANTY THAT THE MANUFACTURE, -SALE, OFFERING FOR SALE, DISTRIBUTION, LEASE, USE OR IMPORTATION UNDER -THE SLA WILL BE FREE FROM INFRINGEMENT OF PATENTS, COPYRIGHTS OR OTHER -INTELLECTUAL PROPERTY RIGHTS OF OTHERS, AND THE VALIDITY OF THE -LICENSE AND THE SLA ARE SUBJECT TO LICENSEE'S SOLE RESPONSIBILITY TO -MAKE SUCH DETERMINATION AND ACQUIRE SUCH LICENSES AS MAY BE NECESSARY -WITH RESPECT TO PATENTS, COPYRIGHT AND OTHER INTELLECTUAL PROPERTY OF -THIRD PARTIES. - -THE LICENSEE ACKNOWLEDGES AND ACCEPTS THAT THE SOFTWARE (I) IS NOT -LICENSED FOR; (II) IS NOT DESIGNED FOR OR INTENDED FOR; AND (III) MAY -NOT BE USED FOR; ANY MISSION CRITICAL APPLICATIONS SUCH AS, BUT NOT -LIMITED TO OPERATION OF NUCLEAR OR HEALTHCARE COMPUTER SYSTEMS AND/OR -NETWORKS, AIRCRAFT OR TRAIN CONTROL AND/OR COMMUNICATION SYSTEMS OR -ANY OTHER COMPUTER SYSTEMS AND/OR NETWORKS OR CONTROL AND/OR -COMMUNICATION SYSTEMS ALL IN WHICH CASE THE FAILURE OF THE SOFTWARE -COULD LEAD TO DEATH, PERSONAL INJURY, OR SEVERE PHYSICAL, MATERIAL OR -ENVIRONMENTAL DAMAGE. LICENSEE'S RIGHTS UNDER THIS LICENSE WILL -TERMINATE AUTOMATICALLY AND IMMEDIATELY WITHOUT NOTICE IF LICENSEE -FAILS TO COMPLY WITH THIS PARAGRAPH. - -IN NO EVENT SHALL ERICSSON BE LIABLE FOR ANY DAMAGES WHATSOEVER, -INCLUDING BUT NOT LIMITED TO PERSONAL INJURY, ANY GENERAL, SPECIAL, -INDIRECT, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF OR IN -CONNECTION WITH THE USE OR INABILITY TO USE THE SOFTWARE (INCLUDING -BUT NOT LIMITED TO LOSS OF PROFITS, BUSINESS INTERUPTIONS, OR ANY -OTHER COMMERCIAL DAMAGES OR LOSSES, LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY THE LICENSEE OR THIRD -PARTIES OR A FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER -SOFTWARE) REGARDLESS OF THE THEORY OF LIABILITY (CONTRACT, TORT, OR -OTHERWISE), EVEN IF THE LICENSEE OR ANY OTHER PARTY HAS BEEN ADVISED -OF THE POSSIBILITY OF SUCH DAMAGES. - -Licensee acknowledges that "ERICSSON ///" is the corporate trademark -of Telefonaktiebolaget LM Ericsson and that both "Ericsson" and the -figure "///" are important features of the trade names of -Telefonaktiebolaget LM Ericsson. Nothing contained in these terms and -conditions shall be deemed to grant Licensee any right, title or -interest in the word "Ericsson" or the figure "///". No delay or -omission by Ericsson to exercise any right or power shall impair any -such right or power to be construed to be a waiver thereof. Consent by -Ericsson to, or waiver of, a breach by the Licensee shall not -constitute consent to, waiver of, or excuse for any other different or -subsequent breach. - -This SLA shall be governed by the substantive law of Sweden. Any -dispute, controversy or claim arising out of or in connection with -this SLA, or the breach, termination or invalidity thereof, shall be -submitted to the exclusive jurisdiction of the Swedish Courts. - -### uthash.h - -uthash.h is made available under the following revised BSD license. - -Copyright © 2003-2010, Troy D. Hanson http://uthash.sourceforge.net -All rights reserved. - -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. - -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. - -## Load Tests Exceptions - -### icons/{ios/CommonIcons*,mac,win}/ktx_{app,document}.* - -These KTX application and document icons are © & ™ The Khronos Group, Inc. -and may not be used without specific prior written permission from The Khronos Group, -except that the ktx_app icon may be distributed in a Derived Work as the icon for -the `glloadtests` and `vkloadtests` applications. - -### other_include/SDL2/* - -These files are part of the SDL2 source distributed by the [SDL project] -(http://libsdl.org) under the terms of the [zlib license] -(http://www.zlib.net/zlib_license.html). - -### other_include/glm - -OpenGL Mathematics is licensed under the [Happy Bunny (Modified MIT) License](https://github.com/g-truc/glm/blob/master/manual.md#section0) - -### testimages/hi_mark{,_sq}.ktx - -The HI logo textures are © & ™ HI Corporation and are -provided for use only in testing the KTX loader. Any other use requires -specific prior written permission from HI. Furthermore the name HI may -not be used to endorse or promote products derived from this software -without specific prior written permission. - -### {VulkanMeshLoader,vulkantextoverlay}.hpp, vulkandebug.* - -Copyright © 2016 Sascha Willems - www.saschawillems.de - -{VulkanMeshLoader,vulkantextoverlay}.hpp and vulkandebug.* are licensed -under the [MIT license](http://opensource.org/licenses/MIT) - diff --git a/external/KTX-Software-master/NOTICE.md b/external/KTX-Software-master/NOTICE.md deleted file mode 100644 index f0c4298..0000000 --- a/external/KTX-Software-master/NOTICE.md +++ /dev/null @@ -1 +0,0 @@ -LICENSE.md \ No newline at end of file diff --git a/external/KTX-Software-master/README.md b/external/KTX-Software-master/README.md deleted file mode 100644 index 50953d9..0000000 --- a/external/KTX-Software-master/README.md +++ /dev/null @@ -1,72 +0,0 @@ -<img src="https://www.khronos.org/assets/images/api_logos/khronos.svg" width="300"/> - -The Official Khronos KTX Software Repository ---- - -| | master | incoming | -|----------------------| :------: | :--------: | -| GNU/Linux, iOS & OSX | [](https://travis-ci.org/KhronosGroup/KTX-Software) | [](https://travis-ci.org/KhronosGroup/KTX-Software) | -| Windows | [](https://ci.appveyor.com/project/msc-/ktx/branch/master) | [](https://ci.appveyor.com/project/msc-/ktx/branch/incoming) | -| Documentation | [](https://codedocs.xyz/KhronosGroup/KTX-Software/) | - | - -This is the official home of the source code -for the Khronos KTX library and tools. KTX is a lightweight file format -for OpenGL textures, designed around how textures are loaded in OpenGL. - -See the Doxygen generated live documentation for -[`master`](https://github.khronos.org/KTX-Software/) -for API usage information. - -See [CONTRIBUTING](CONTRIBUTING.md) for information about contributing. - -See [LICENSE](LICENSE.md) for information about licensing. - -See [BUILDING](BUILDING.md) for information about building the code. - -More information about KTX and links to tools that support it can be -found on the -[KTX page](http://www.khronos.org/opengles/sdk/tools/KTX/) of -the [OpenGL ES SDK](http://www.khronos.org/opengles/sdk) on -[khronos.org](http://www.khronos.org). - -If you need help with using the KTX library or KTX tools, please use the -[KTX forum](https://forums.khronos.org/forumdisplay.php/103-KTX-file-format-for-OpenGL-OpenGL-ES-and-WebGL-textures). -To report problems use GitHub [issues](https://github.com/KhronosGroup/KTX/issues). - -**IMPORTANT:** you **must** install the [Git LFS](https://github.com/github/git-lfs) -command line extension in order to fully checkout this repository after cloning. You -need at least version 1.1. - -A few files have `$Date$` keywords. If you care about having the proper -dates shown or will be generating the documentation or preparing -distribution archives, you **must** follow the instructions below. - -#### <a id="kwexpansion"></a>$Date$ keyword expansion - -$Date$ keywords are expanded via a smudge & clean filter. To install -the filter, issue the following commands in the root of your clone. - -On Unix (Linux, Mac OS X, etc.) platforms and Windows using Git for Windows' -Git Bash or Cygwin's bash terminal: - -```bash -./install-gitconfig.sh -rm TODO.md include/ktx.h tools/toktx/toktx.cpp -git checkout TODO.md include/ktx.h tools/toktx/toktx.cpp -``` - -On Windows with the Command Prompt (requires `git.exe` in a directory -on your %PATH%): - -```cmd -install-gitconfig.bat -del TODO.md include/ktx.h tools/toktx/toktx.cpp -git checkout TODO.md include/ktx.h tools/toktx/toktx.cpp -``` - -The first command adds an [include] of the repo's `.gitconfig` to the -local git config file `.git/config`, i.e. the one in your clone of the repo. -`.gitconfig` contains the config of the "keyworder" filter. The remaining -commands force a new checkout of the affected files to smudge them with the -date. These two are unnecessary if you plan to edit these files. - diff --git a/external/KTX-Software-master/include/ktx.h b/external/KTX-Software-master/include/ktx.h deleted file mode 100644 index e6c3f2a..0000000 --- a/external/KTX-Software-master/include/ktx.h +++ /dev/null @@ -1,845 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4 expandtab: */ - -#ifndef KTX_H_A55A6F00956F42F3A137C11929827FE1 -#define KTX_H_A55A6F00956F42F3A137C11929827FE1 - -/* - * ©2010-2018 The Khronos Group, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * See the accompanying LICENSE.md for licensing details for all files in - * the KTX library and KTX loader tests. - */ - -/** - * @file - * @~English - * - * @brief Declares the public functions and structures of the - * KTX API. - * - * @author Mark Callow, Edgewise Consulting and while at HI Corporation - * @author Based on original work by Georg Kolling, Imagination Technology - * - * @version 3.0 - * - * @todo Find a way so that applications do not have to define KTX_OPENGL{,_ES*} - * when using the library. - */ - -#include <stdio.h> -#include <stdbool.h> - -/* To avoid including <KHR/khrplatform.h> define our own types. */ -typedef unsigned char ktx_uint8_t; -typedef bool ktx_bool_t; -#ifdef _MSC_VER -typedef unsigned short ktx_uint16_t; -typedef signed short ktx_int16_t; -typedef unsigned int ktx_uint32_t; -typedef signed int ktx_int32_t; -typedef size_t ktx_size_t; -#else -#include <stdint.h> -typedef uint16_t ktx_uint16_t; -typedef int16_t ktx_int16_t; -typedef uint32_t ktx_uint32_t; -typedef int32_t ktx_int32_t; -typedef size_t ktx_size_t; -#endif - -/* This will cause compilation to fail if size of uint32 != 4. */ -typedef unsigned char ktx_uint32_t_SIZE_ASSERT[sizeof(ktx_uint32_t) == 4]; - -/* - * This #if allows libktx to be compiled with strict c99. It avoids - * compiler warnings or even errors when a gl.h is already included. - * "Redefinition of (type) is a c11 feature". Obviously this doesn't help if - * gl.h comes after. However nobody has complained about the unguarded typedefs - * since they were introduced so this is unlikely to be a problem in practice. - * Presumably everybody is using platform default compilers not c99 or else - * they are using C++. - */ -#if !defined(GL_NO_ERROR) - /* - * To avoid having to including gl.h ... - */ - typedef unsigned char GLboolean; - typedef unsigned int GLenum; - typedef int GLint; - typedef int GLsizei; - typedef unsigned int GLuint; - typedef unsigned char GLubyte; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @~English - * @brief Key String for standard orientation value. - */ -#define KTX_ORIENTATION_KEY "KTXorientation" -/** - * @~English - * @brief Standard format for 2D orientation value. - */ -#define KTX_ORIENTATION2_FMT "S=%c,T=%c" -/** - * @~English - * @brief Standard format for 3D orientation value. - */ -#define KTX_ORIENTATION3_FMT "S=%c,T=%c,R=%c" -/** - * @~English - * @brief Required unpack alignment - */ -#define KTX_GL_UNPACK_ALIGNMENT 4 - -#define KTX_TRUE true -#define KTX_FALSE false - -/** - * @~English - * @brief Error codes returned by library functions. - */ -typedef enum KTX_error_code_t { - KTX_SUCCESS = 0, /*!< Operation was successful. */ - KTX_FILE_DATA_ERROR, /*!< The data in the file is inconsistent with the spec. */ - KTX_FILE_OPEN_FAILED, /*!< The target file could not be opened. */ - KTX_FILE_OVERFLOW, /*!< The operation would exceed the max file size. */ - KTX_FILE_READ_ERROR, /*!< An error occurred while reading from the file. */ - KTX_FILE_SEEK_ERROR, /*!< An error occurred while seeking in the file. */ - KTX_FILE_UNEXPECTED_EOF, /*!< File does not have enough data to satisfy request. */ - KTX_FILE_WRITE_ERROR, /*!< An error occurred while writing to the file. */ - KTX_GL_ERROR, /*!< GL operations resulted in an error. */ - KTX_INVALID_OPERATION, /*!< The operation is not allowed in the current state. */ - KTX_INVALID_VALUE, /*!< A parameter value was not valid */ - KTX_NOT_FOUND, /*!< Requested key was not found */ - KTX_OUT_OF_MEMORY, /*!< Not enough memory to complete the operation. */ - KTX_UNKNOWN_FILE_FORMAT, /*!< The file not a KTX file */ - KTX_UNSUPPORTED_TEXTURE_TYPE, /*!< The KTX file specifies an unsupported texture type. */ -} KTX_error_code; - -#define KTX_IDENTIFIER_REF { 0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A } -#define KTX_ENDIAN_REF (0x04030201) -#define KTX_ENDIAN_REF_REV (0x01020304) -#define KTX_HEADER_SIZE (64) - -/** - * @~English - * @brief Result codes returned by library functions. - */ - typedef enum KTX_error_code_t ktxResult; - -/** - * @class ktxHashList - * @~English - * @brief Opaque handle to a ktxHashList. - */ -typedef struct ktxKVListEntry* ktxHashList; - -/** - * @class ktxTexture - * @~English - * @brief Class representing a texture. - * - * ktxTextures should be created only by one of the ktxTexture_Create* - * functions and these fields should be considered read-only. - */ -typedef struct { - ktx_uint32_t glFormat; /*!< Format of the texture data, e.g., GL_RGB. */ - ktx_uint32_t glInternalformat; /*!< Internal format of the texture data, - e.g., GL_RGB8. */ - ktx_uint32_t glBaseInternalformat; /*!< Base format of the texture data, - e.g., GL_RGB. */ - ktx_uint32_t glType; /*!< Type of the texture data, e.g, GL_UNSIGNED_BYTE.*/ - ktx_bool_t isArray; /*!< KTX_TRUE if the texture is an array texture, i.e, - a GL_TEXTURE_*_ARRAY target is to be used. */ - ktx_bool_t isCubemap; /*!< KTX_TRUE if the texture is a cubemap or - cubemap array. */ - ktx_bool_t isCompressed; /*!< KTX_TRUE if @c glInternalFormat is that of - a compressed texture. */ - ktx_bool_t generateMipmaps; /*!< KTX_TRUE if mipmaps should be generated - for the texture by ktxTexture_GLUpload() - or ktx_Texture_VkUpload(). */ - ktx_uint32_t baseWidth; /*!< Width of the base level of the texture. */ - ktx_uint32_t baseHeight; /*!< Height of the base level of the texture. */ - ktx_uint32_t baseDepth; /*!< Depth of the base level of the texture. */ - ktx_uint32_t numDimensions; /*!< Number of dimensions in the texture: 1, 2 - or 3. */ - ktx_uint32_t numLevels; /*!< Number of mip levels in the texture. Should be - 1, if @c generateMipmaps is KTX_TRUE. Can be - less than a full pyramid but always starts at - the base level. */ - ktx_uint32_t numLayers; /*!< Number of array layers in the texture. */ - ktx_uint32_t numFaces; /*!< Number of faces, 6 for cube maps, 1 otherwise.*/ - ktxHashList kvDataHead; /*!< Head of the hash list of metadata. */ - ktx_uint32_t kvDataLen; /*!< Length of the metadata, if it has been - extracted in its raw form, otherwise 0. */ - ktx_uint8_t* kvData; /*!< Pointer to the metadata, if it has been extracted - in its raw form, otherwise NULL. */ - ktx_size_t dataSize; /*!< Length of the image data in bytes. */ - ktx_uint8_t* pData; /*!< Pointer to the image data. */ -} ktxTexture; - - -/** - * @memberof ktxTexture - * @~English - * @brief Structure for passing texture information to ktxTexture_Create(). - * - * @sa ktxTexture_Create() - */ -typedef struct -{ - ktx_uint32_t glInternalformat; /*!< Internal format for the texture, e.g., - GL_RGB8. */ - ktx_uint32_t baseWidth; /*!< Width of the base level of the texture. */ - ktx_uint32_t baseHeight; /*!< Height of the base level of the texture. */ - ktx_uint32_t baseDepth; /*!< Depth of the base level of the texture. */ - ktx_uint32_t numDimensions; /*!< Number of dimensions in the texture, 1, 2 - or 3. */ - ktx_uint32_t numLevels; /*!< Number of mip levels in the texture. Should be - 1 if @c generateMipmaps is KTX_TRUE; */ - ktx_uint32_t numLayers; /*!< Number of array layers in the texture. */ - ktx_uint32_t numFaces; /*!< Number of faces: 6 for cube maps, 1 otherwise. */ - ktx_bool_t isArray; /*!< Set to KTX_TRUE if the texture is to be an - array texture. Means OpenGL will use a - GL_TEXTURE_*_ARRAY target. */ - ktx_bool_t generateMipmaps; /*!< Set to KTX_TRUE if mipmaps should be - generated for the texture when loading - into OpenGL. */ -} ktxTextureCreateInfo; - -/** - * @memberof ktxTexture - * @~English - * @brief Enum for requesting, or not, allocation of storage for images. - * - * @sa ktxTexture_Create() - */ -typedef enum { - KTX_TEXTURE_CREATE_NO_STORAGE = 0, /*!< Don't allocate any image storage. */ - KTX_TEXTURE_CREATE_ALLOC_STORAGE = 1 /*!< Allocate image storage. */ -} ktxTextureCreateStorageEnum; - -/** - * @memberof ktxTexture - * @~English - * @brief Flags for requesting services during creation. - * - * @sa ktxTexture_CreateFrom* - */ -enum ktxTextureCreateFlagBits { - KTX_TEXTURE_CREATE_NO_FLAGS = 0x00, - KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT = 0x01, - /*!< Load the images from the KTX source. */ - KTX_TEXTURE_CREATE_RAW_KVDATA_BIT = 0x02, - /*!< Load the raw key-value data instead of - creating a @c ktxHashList from it. */ - KTX_TEXTURE_CREATE_SKIP_KVDATA_BIT = 0x04 - /*!< Skip any key-value data. This overrides - the RAW_KVDATA_BIT. */ -}; -/** - * @memberof ktxTexture - * @~English - * @brief Type for TextureCreateFlags parameters. - * - * @sa ktxTexture_CreateFrom*() - */ -typedef ktx_uint32_t ktxTextureCreateFlags; - -#define KTXAPIENTRY -#define KTXAPIENTRYP KTXAPIENTRY * -/** - * @memberof ktxTexture - * @~English - * @brief Signature of function called by the <tt>ktxTexture_Iterate*</tt> - * functions to receive image data. - * - * The function parameters are used to pass values which change for each image. - * Obtain values which are uniform across all images from the @c ktxTexture - * object. - * - * @param [in] miplevel MIP level from 0 to the max level which is - * dependent on the texture size. - * @param [in] face usually 0; for cube maps, one of the 6 cube - * faces in the order +X, -X, +Y, -Y, +Z, -Z, - * 0 to 5. - * @param [in] width width of the image. - * @param [in] height height of the image or, for 1D textures - * textures, 1. - * @param [in] depth depth of the image or, for 1D & 2D - * textures, 1. - * @param [in] faceLodSize number of bytes of data pointed at by - * @p pixels. - * @param [in] pixels pointer to the image data. - * @param [in,out] userdata pointer for the application to pass data to and - * from the callback function. - */ -/* Don't use KTXAPIENTRYP to avoid a Doxygen bug. */ -typedef KTX_error_code (KTXAPIENTRY* PFNKTXITERCB)(int miplevel, int face, - int width, int height, int depth, - ktx_uint32_t faceLodSize, - void* pixels, - void* userdata); - -/* - * See the implementation files for the full documentation of the following - * functions. - */ - -/* - * Creates an empty ktxTexture object with the characteristics described - * by createInfo. - */ -KTX_error_code -ktxTexture_Create(ktxTextureCreateInfo* createInfo, - ktxTextureCreateStorageEnum storageAllocation, - ktxTexture** newTex); - -/* - * Creates a ktxTexture from a stdio stream reading from a KTX source. - */ -KTX_error_code -ktxTexture_CreateFromStdioStream(FILE* stdioStream, - ktxTextureCreateFlags createFlags, - ktxTexture** newTex); - -/* - * Creates a ktxTexture from a named file containing KTX data. - */ -KTX_error_code -ktxTexture_CreateFromNamedFile(const char* const filename, - ktxTextureCreateFlags createFlags, - ktxTexture** newTex); - -/* - * Creates a ktxTexture from a block of memory containing KTX-formatted data. - */ -KTX_error_code -ktxTexture_CreateFromMemory(const ktx_uint8_t* bytes, ktx_size_t size, - ktxTextureCreateFlags createFlags, - ktxTexture** newTex); -/* - * Destroys a ktxTexture object. - */ -void -ktxTexture_Destroy(ktxTexture* This); - -/* - * Returns a pointer to the image data of a ktxTexture object. - */ -ktx_uint8_t* -ktxTexture_GetData(ktxTexture* This); - -/* - * Returns the offset of the image for the specified mip level, array layer - * and face or depth slice within the image data of a ktxTexture object. - */ -KTX_error_code -ktxTexture_GetImageOffset(ktxTexture* This, ktx_uint32_t level, - ktx_uint32_t layer, ktx_uint32_t faceSlice, - ktx_size_t* pOffset); - -/* - * Returns the pitch of a row of an image at the specified level. - * Similar to the rowPitch in a VkSubResourceLayout. - */ - ktx_uint32_t - ktxTexture_GetRowPitch(ktxTexture* This, ktx_uint32_t level); - - /* - * Return the element size of the texture's images. - */ - ktx_uint32_t - ktxTexture_GetElementSize(ktxTexture* This); - -/* - * Returns the size of all the image data of a ktxTexture object in bytes. - */ -ktx_size_t -ktxTexture_GetSize(ktxTexture* This); - -/* - * Returns the size of an image at the specified level. - */ - ktx_size_t - ktxTexture_GetImageSize(ktxTexture* This, ktx_uint32_t level); - -/* - * Uploads the image data from a ktxTexture object to an OpenGL {,ES} texture - * object. - */ -KTX_error_code -ktxTexture_GLUpload(ktxTexture* This, GLuint* pTexture, GLenum* pTarget, - GLenum* pGlerror); - -/* - * Loads the image data into a ktxTexture object from the KTX-formatted source. - * Used when the image data was not loaded during ktxTexture_CreateFrom*. - */ -KTX_error_code -ktxTexture_LoadImageData(ktxTexture* This, - ktx_uint8_t* pBuffer, - ktx_size_t bufSize); - -/* - * Iterates over the already loaded level-faces in a ktxTexture object. - * iterCb is called for each level-face. - */ -KTX_error_code -ktxTexture_IterateLevelFaces(ktxTexture* super, PFNKTXITERCB iterCb, - void* userdata); - -/* - * Iterates over the level-faces of a ktxTexture object, loading each from - * the KTX-formatted source then calling iterCb. - */ -KTX_error_code -ktxTexture_IterateLoadLevelFaces(ktxTexture* super, PFNKTXITERCB iterCb, - void* userdata); -/* - * Iterates over the already loaded levels in a ktxTexture object. - * iterCb is called for each level. The data passed to iterCb - * includes all faces for each level. - */ -KTX_error_code -ktxTexture_IterateLevels(ktxTexture* This, PFNKTXITERCB iterCb, - void* userdata); - -/* - * Sets the image for the specified level, layer & faceSlice within a - * ktxTexture object from packed image data in memory. The destination image - * data is padded to the KTX specified row alignment of 4, if necessary. - */ -KTX_error_code -ktxTexture_SetImageFromMemory(ktxTexture* This,ktx_uint32_t level, - ktx_uint32_t layer, ktx_uint32_t faceSlice, - const ktx_uint8_t* src, ktx_size_t srcSize); - -/* - * Sets the image for the specified level, layer & faceSlice within a - * ktxTexture object from a stdio stream reading from a KTX source. The - * destination image data is padded to the KTX specified row alignment of 4, - * if necessary. - */ -KTX_error_code -ktxTexture_SetImageFromStdioStream(ktxTexture* This, ktx_uint32_t level, - ktx_uint32_t layer, ktx_uint32_t faceSlice, - FILE* src, ktx_size_t srcSize); - -/* - * Write a ktxTexture object to a stdio stream in KTX format. - */ -KTX_error_code -ktxTexture_WriteToStdioStream(ktxTexture* This, FILE* dstsstr); - -/* - * Write a ktxTexture object to a named file in KTX format. - */ -KTX_error_code -ktxTexture_WriteToNamedFile(ktxTexture* This, const char* const dstname); - -/* - * Write a ktxTexture object to a block of memory in KTX format. - */ -KTX_error_code -ktxTexture_WriteToMemory(ktxTexture* This, - ktx_uint8_t** bytes, ktx_size_t* size); - -/* - * Returns a string corresponding to a KTX error code. - */ -const char* const ktxErrorString(KTX_error_code error); - -KTX_error_code ktxHashList_Create(ktxHashList** ppHl); -void ktxHashList_Construct(ktxHashList* pHl); -void ktxHashList_Destroy(ktxHashList* head); -void ktxHashList_Destruct(ktxHashList* head); -/* - * Adds a key-value pair to a hash list. - */ -KTX_error_code -ktxHashList_AddKVPair(ktxHashList* pHead, const char* key, - unsigned int valueLen, const void* value); - -/* - * Looks up a key and returns the value. - */ -KTX_error_code -ktxHashList_FindValue(ktxHashList* pHead, const char* key, - unsigned int* pValueLen, void** pValue); - -/* - * Serializes the hash table to a block of memory suitable for - * writing to a KTX file. - */ -KTX_error_code -ktxHashList_Serialize(ktxHashList* pHead, - unsigned int* kvdLen, unsigned char** kvd); - - -/* - * Creates a hash table from the serialized data read from a - * a KTX file. - */ -KTX_error_code -ktxHashList_Deserialize(ktxHashList* pHead, unsigned int kvdLen, void* kvd); - - -/*===========================================================* - * For Versions 1 and 2 compatibility * - *===========================================================*/ - -/** - * @~English - * @deprecated Use struct ktxTexture - * @brief Structure used by load functions to return texture dimensions - */ -typedef struct KTX_dimensions { - GLsizei width; /*!< Width in texels. */ - GLsizei height; /*!< Height in texels. */ - GLsizei depth; /*!< Depth in texels. */ -} KTX_dimensions; - -/** - * @~English - * @brief Structure to pass texture information to ktxWriteKTX. - * @deprecated Use ktxTexture_Create() and @c ktxTextureCreateInfo - * - * Retained for backward compatibility with Versions 1 & 2. - */ -typedef struct KTX_texture_info -{ - ktx_uint32_t glType; - ktx_uint32_t glTypeSize; - ktx_uint32_t glFormat; - ktx_uint32_t glInternalFormat; - ktx_uint32_t glBaseInternalFormat; - ktx_uint32_t pixelWidth; - ktx_uint32_t pixelHeight; - ktx_uint32_t pixelDepth; - ktx_uint32_t numberOfArrayElements; - ktx_uint32_t numberOfFaces; - ktx_uint32_t numberOfMipmapLevels; -} KTX_texture_info; - -/** - * @var KTX_texture_info::glType - * @~English - * @brief The type of the image data. - * - * Values are the same as in the @p type parameter of - * glTexImage*D. Must be 0 for compressed images. - */ -/** - * @var KTX_texture_info::glTypeSize; - * @~English - * @brief The data type size to be used in case of endianness - * conversion. - * - * This value is used in the event conversion is required when the - * KTX file is loaded. It should be the size in bytes corresponding - * to glType. Must be 1 for compressed images. - */ -/** - * @var KTX_texture_info::glFormat; - * @~English - * @brief The format of the image(s). - * - * Values are the same as in the format parameter - * of glTexImage*D. Must be 0 for compressed images. - */ -/** - * @var KTX_texture_info::glInternalFormat; - * @~English - * @brief The internalformat of the image(s). - * - * Values are the same as for the internalformat parameter of - * glTexImage*2D. Note: it will not be used when a KTX file - * containing an uncompressed texture is loaded into OpenGL ES. - */ -/** - * @var KTX_texture_info::glBaseInternalFormat; - * @~English - * @brief The base internalformat of the image(s) - * - * For non-compressed textures, should be the same as glFormat. - * For compressed textures specifies the base internal, e.g. - * GL_RGB, GL_RGBA. - */ -/** - * @var KTX_texture_info::pixelWidth; - * @~English - * @brief Width of the image for texture level 0, in pixels. - */ -/** - * @var KTX_texture_info::pixelHeight; - * @~English - * @brief Height of the texture image for level 0, in pixels. - * - * Must be 0 for 1D textures. - */ -/** - * @var KTX_texture_info::pixelDepth; - * @~English - * @brief Depth of the texture image for level 0, in pixels. - * - * Must be 0 for 1D, 2D and cube textures. - */ -/** - * @var KTX_texture_info::numberOfArrayElements; - * @~English - * @brief The number of array elements. - * - * Must be 0 if not an array texture. - */ -/** - * @var KTX_texture_info::numberOfFaces; - * @~English - * @brief The number of cubemap faces. - * - * Must be 6 for cubemaps and cubemap arrays, 1 otherwise. Cubemap - * faces must be provided in the order: +X, -X, +Y, -Y, +Z, -Z. - */ -/** - * @var KTX_texture_info::numberOfMipmapLevels; - * @~English - * @brief The number of mipmap levels. - * - * 1 for non-mipmapped texture. 0 indicates that a full mipmap pyramid should - * be generated from level 0 at load time (this is usually not allowed for - * compressed formats). Mipmaps must be provided in order from largest size to - * smallest size. The first mipmap level is always level 0. - */ - -/** - * @~English - * @deprecated Use ktxTexture_Create() and @c ktxTexture_SetImageFromMemory() - * or ktxTexture_SetImageFromStdioStream(). - * @brief Structure used to pass image data to ktxWriteKTX. - * - * @sa ktxTextureCreate() - * @sa ktxTexture_SetImageFromMemory() - * @sa ktxTexture_SetImageFromStdioStream() - * - * Retained for backward compatibility with Versions 1 & 2. - */ -typedef struct KTX_image_info { - GLsizei size; /*!< Size of the image data in bytes. */ - GLubyte* data; /*!< Pointer to the image data. */ -} KTX_image_info; - -/* - * Loads a texture from a stdio FILE. - */ -KTX_error_code -ktxLoadTextureF(FILE*, GLuint* pTexture, GLenum* pTarget, - KTX_dimensions* pDimensions, GLboolean* pIsMipmapped, - GLenum* pGlerror, - unsigned int* pKvdLen, unsigned char** ppKvd); - -/* - * Loads a texture from a KTX file on disk. - */ -KTX_error_code -ktxLoadTextureN(const char* const filename, GLuint* pTexture, GLenum* pTarget, - KTX_dimensions* pDimensions, GLboolean* pIsMipmapped, - GLenum* pGlerror, - unsigned int* pKvdLen, unsigned char** ppKvd); - -/* - * Loads a texture from a KTX file in memory. - */ -KTX_error_code -ktxLoadTextureM(const void* bytes, GLsizei size, GLuint* pTexture, - GLenum* pTarget, KTX_dimensions* pDimensions, - GLboolean* pIsMipmapped, GLenum* pGlerror, - unsigned int* pKvdLen, unsigned char** ppKvd); - -/** - * @class KTX_hash_table - * @~English - * @deprecated Use @c ktxHashList. - * @brief Opaque handle to a hash table. - */ -typedef ktxHashList* KTX_hash_table; - -/* - * @deprecated Use ktxHashList_Create(). - */ -KTX_hash_table ktxHashTable_Create(void); - -/** - * @~English - * @deprecated Use ktxHashList_Destroy(). - * @brief Destroy a KTX_hash_table. - * - * Should be documented as a member of KTX_hash_table but a doxygen limitation - * prevents that. - */ -#define ktxHashTable_Destroy(a) ktxHashList_Destroy(a); -/** - * @~English - * @deprecated Use ktxHashList_AddKVPair(). - * @brief Add a key-value pair to a KTX_hash_table. - * - * Should be documented as a member of KTX_hash_table but a doxygen limitation - * prevents that. - */ -#define ktxHashTable_AddKVPair(a, b, c, d) ktxHashList_AddKVPair(a, b, c, d) -/** - * @~English - * @deprecated Use ktxHashList_FindValue(). - * @brief Looks up a key and returns its value. - * - * Should be documented as a member of KTX_hash_table but a doxygen limitation - * prevents that. - */ -#define ktxHashTable_FindValue(a, b, c, d) ktxHashList_FindValue(a, b, c, d) - -/* - * @deprecated Use ktxHashList_Serialize(). - */ -KTX_error_code -ktxHashTable_Serialize(KTX_hash_table This, - unsigned int* kvdLen, unsigned char** kvd); - -/* - * @deprecated Use ktxHashList_Deserialize(). - */ -KTX_error_code -ktxHashTable_Deserialize(unsigned int kvdLen, void* pKvd, KTX_hash_table* pHt); - -/* - * Writes a KTX file using supplied data. - */ -KTX_error_code -ktxWriteKTXF(FILE* dst, const KTX_texture_info* imageInfo, - GLsizei bytesOfKeyValueData, const void* keyValueData, - GLuint numImages, KTX_image_info images[]); - -/** - * Writes a KTX file using supplied data. - */ -KTX_error_code -ktxWriteKTXN(const char* dstname, const KTX_texture_info* imageInfo, - GLsizei bytesOfKeyValueData, const void* keyValueData, - GLuint numImages, KTX_image_info images[]); - -/* - * Writes a KTX file into memory using supplied data. - */ -KTX_error_code -ktxWriteKTXM(unsigned char** dst, GLsizei* size, - const KTX_texture_info* textureInfo, GLsizei bytesOfKeyValueData, - const void* keyValueData, GLuint numImages, - KTX_image_info images[]); - -#ifdef __cplusplus -} -#endif - -/** -@~English -@page libktx_history Revision History - -@section v6 Version 3.0 -Added: -@li new ktxTexture object based API for reading KTX files without an OpenGL context. -@li Vulkan loader. @#include <ktxvulkan.h> to use it. - -Changed: -@li ktx.h to not depend on KHR/khrplatform.h and GL{,ES*}/gl{corearb,}.h. - Applications using OpenGL must now include these files themselves. -@li ktxLoadTexture[FMN], removing the hack of loading 1D textures as 2D textures - when the OpenGL context does not support 1D textures. - KTX_UNSUPPORTED_TEXTURE_TYPE is now returned. - -@section v5 Version 2.0.2 -Added: -@li Support for cubemap arrays. - -Changed: -@li New build system - -Fixed: -@li GitHub issue #40: failure to byte-swap key-value lengths. -@li GitHub issue #33: returning incorrect target when loading cubemaps. -@li GitHub PR #42: loading of texture arrays. -@li GitHub PR #41: compilation error when KTX_OPENGL_ES2=1 defined. -@li GitHub issue #39: stack-buffer-overflow in toktx -@li Don't use GL_EXTENSIONS on recent OpenGL versions. - -@section v4 Version 2.0.1 -Added: -@li CMake build files. Thanks to Pavel Rotjberg for the initial version. - -Changed: -@li ktxWriteKTXF to check the validity of the type & format combinations - passed to it. - -Fixed: -@li Public Bugzilla <a href="http://www.khronos.org/bugzilla/show_bug.cgi?id=999">999</a>: 16-bit luminance texture cannot be written. -@li compile warnings from compilers stricter than MS Visual C++. Thanks to - Pavel Rotjberg. - -@section v3 Version 2.0 -Added: -@li support for decoding ETC2 and EAC formats in the absence of a hardware - decoder. -@li support for converting textures with legacy LUMINANCE, LUMINANCE_ALPHA, - etc. formats to the equivalent R, RG, etc. format with an - appropriate swizzle, when loading in OpenGL Core Profile contexts. -@li ktxErrorString function to return a string corresponding to an error code. -@li tests for ktxLoadTexture[FN] that run under OpenGL ES 3.0 and OpenGL 3.3. - The latter includes an EGL on WGL wrapper that makes porting apps between - OpenGL ES and OpenGL easier on Windows. -@li more texture formats to ktxLoadTexture[FN] and toktx tests. - -Changed: -@li ktxLoadTexture[FMN] to discover the capabilities of the GL context at - run time and load textures, or not, according to those capabilities. - -Fixed: -@li failure of ktxWriteKTXF to pad image rows to 4 bytes as required by the KTX - format. -@li ktxWriteKTXF exiting with KTX_FILE_WRITE_ERROR when attempting to write - more than 1 byte of face-LOD padding. - -Although there is only a very minor API change, the addition of ktxErrorString, -the functional changes are large enough to justify bumping the major revision -number. - -@section v2 Version 1.0.1 -Implemented ktxLoadTextureM. -Fixed the following: -@li Public Bugzilla <a href="http://www.khronos.org/bugzilla/show_bug.cgi?id=571">571</a>: crash when null passed for pIsMipmapped. -@li Public Bugzilla <a href="http://www.khronos.org/bugzilla/show_bug.cgi?id=572">572</a>: memory leak when unpacking ETC textures. -@li Public Bugzilla <a href="http://www.khronos.org/bugzilla/show_bug.cgi?id=573">573</a>: potential crash when unpacking ETC textures with unused padding pixels. -@li Public Bugzilla <a href="http://www.khronos.org/bugzilla/show_bug.cgi?id=576">576</a>: various small fixes. - -Thanks to Krystian Bigaj for the ktxLoadTextureM implementation and these fixes. - -@section v1 Version 1.0 -Initial release. - -*/ - -#endif /* KTX_H_A55A6F00956F42F3A137C11929827FE1 */ diff --git a/external/KTX-Software-master/lib/checkheader.c b/external/KTX-Software-master/lib/checkheader.c deleted file mode 100644 index e46e7b7..0000000 --- a/external/KTX-Software-master/lib/checkheader.c +++ /dev/null @@ -1,172 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4 expandtab: */ - -/* $Id: df002b39ae6b9b3b995e7633ff96acf0d285edcc $ */ - -/* - * ©2010-2018 The khronos Group, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @internal - * @file checkheader.c - * @~English - * - * @brief Function to verify a KTX file header - * - * @author Mark Callow, HI Corporation - */ - -/* - * Author: Georg Kolling, Imagination Technology with modifications - * by Mark Callow, HI Corporation. - */ -#include <assert.h> -#include <string.h> - -#include "ktx.h" -#include "ktxint.h" - -/** - * @internal - * @~English - * @brief Check a KTX file header. - * - * As well as checking that the header identifies a KTX file, the function - * sanity checks the values and returns information about the texture in a - * struct KTX_supplementary_info. - * - * @param pHeader pointer to the KTX header to check - * @param pSuppInfo pointer to a KTX_supplementary_info structure in which to - * return information about the texture. - * - * @author Georg Kolling, Imagination Technology - * @author Mark Callow, HI Corporation - */ -KTX_error_code _ktxCheckHeader(KTX_header* pHeader, - KTX_supplemental_info* pSuppInfo) -{ - ktx_uint8_t identifier_reference[12] = KTX_IDENTIFIER_REF; - ktx_uint32_t max_dim; - - assert(pHeader != NULL && pSuppInfo != NULL); - - /* Compare identifier, is this a KTX file? */ - if (memcmp(pHeader->identifier, identifier_reference, 12) != 0) - { - return KTX_UNKNOWN_FILE_FORMAT; - } - - if (pHeader->endianness == KTX_ENDIAN_REF_REV) - { - /* Convert endianness of pHeader fields. */ - _ktxSwapEndian32(&pHeader->glType, 12); - - if (pHeader->glTypeSize != 1 && - pHeader->glTypeSize != 2 && - pHeader->glTypeSize != 4) - { - /* Only 8-, 16-, and 32-bit types supported so far. */ - return KTX_FILE_DATA_ERROR; - } - } - else if (pHeader->endianness != KTX_ENDIAN_REF) - { - return KTX_FILE_DATA_ERROR; - } - - /* Check glType and glFormat */ - pSuppInfo->compressed = 0; - if (pHeader->glType == 0 || pHeader->glFormat == 0) - { - if (pHeader->glType + pHeader->glFormat != 0) - { - /* either both or none of glType, glFormat must be zero */ - return KTX_FILE_DATA_ERROR; - } - pSuppInfo->compressed = 1; - } - - if (pHeader->glFormat == pHeader->glInternalformat) { - // glInternalFormat is either unsized (which is no longer and should - // never have been supported by libktx) or glFormat is sized. - return KTX_FILE_DATA_ERROR; - } - - /* Check texture dimensions. KTX files can store 8 types of textures: - 1D, 2D, 3D, cube, and array variants of these. There is currently - no GL extension for 3D array textures. */ - if ((pHeader->pixelWidth == 0) || - (pHeader->pixelDepth > 0 && pHeader->pixelHeight == 0)) - { - /* texture must have width */ - /* texture must have height if it has depth */ - return KTX_FILE_DATA_ERROR; - } - - - if (pHeader->pixelDepth > 0) - { - if (pHeader->numberOfArrayElements > 0) - { - /* No 3D array textures yet. */ - return KTX_UNSUPPORTED_TEXTURE_TYPE; - } - pSuppInfo->textureDimension = 3; - } - else if (pHeader->pixelHeight > 0) - { - pSuppInfo->textureDimension = 2; - } - else - { - pSuppInfo->textureDimension = 1; - } - - if (pHeader->numberOfFaces == 6) - { - if (pSuppInfo->textureDimension != 2) - { - /* cube map needs 2D faces */ - return KTX_FILE_DATA_ERROR; - } - } - else if (pHeader->numberOfFaces != 1) - { - /* numberOfFaces must be either 1 or 6 */ - return KTX_FILE_DATA_ERROR; - } - - /* Check number of mipmap levels */ - if (pHeader->numberOfMipmapLevels == 0) - { - pSuppInfo->generateMipmaps = 1; - pHeader->numberOfMipmapLevels = 1; - } - else - { - pSuppInfo->generateMipmaps = 0; - } - - /* This test works for arrays too because height or depth will be 0. */ - max_dim = MAX(MAX(pHeader->pixelWidth, pHeader->pixelHeight), pHeader->pixelDepth); - if (max_dim < ((ktx_uint32_t)1 << (pHeader->numberOfMipmapLevels - 1))) - { - /* Can't have more mip levels than 1 + log2(max(width, height, depth)) */ - return KTX_FILE_DATA_ERROR; - } - - return KTX_SUCCESS; -} diff --git a/external/KTX-Software-master/lib/errstr.c b/external/KTX-Software-master/lib/errstr.c deleted file mode 100644 index bf6a695..0000000 --- a/external/KTX-Software-master/lib/errstr.c +++ /dev/null @@ -1,70 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4 expandtab: */ - -/* $Id: 11f526c2587823b49cde3b437746e95b57e3200e $ */ - -/* - * ©2010-2018 The khronos Group, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @file errstr.c - * @~English - * - * @brief Function to return a string corresponding to a KTX error code. - * - * @author Mark Callow, HI Corporation - */ - -#include "ktx.h" - -static const char* const errorStrings[] = { - "Operation succeeded", /* KTX_SUCCESS */ - "File data is inconsistent with KTX spec.", /* KTX_FILE_DATA_ERROR */ - "File open failed", /* KTX_FILE_OPEN_FAILED */ - "Operation would exceed the max file size", /* KTX_FILE_OVERFLOW */ - "File read error", /* KTX_FILE_READ_ERROR */ - "File seek error", /* KTX_FILE_SEEK_ERROR */ - "File does not have enough data for request", /* KTX_FILE_UNEXPECTED_EOF */ - "File write error", /* KTX_FILE_WRITE_ERROR */ - "GL error occurred", /* KTX_GL_ERROR */ - "Operation not allowed in the current state", /* KTX_INVALID_OPERATION */ - "Invalid parameter value", /* KTX_INVALID_VALUE */ - "Key not found", /* KTX_NOT_FOUND */ - "Out of memory", /* KTX_OUT_OF_MEMORY */ - "Not a KTX file", /* KTX_UNKNOWN_FILE_FORMAT */ - "Texture type not supported by GL context" /* KTX_UNSUPPORTED_TEXTURE_TYPE */ -}; -static const int lastErrorCode = (sizeof(errorStrings) / sizeof(char*)) - 1; - - -/** - * @~English - * @brief Return a string corresponding to a KTX error code. - * - * @param error the error code for which to return a string - * - * @return pointer to the message string. - * - * @internal Use UTF-8 for translated message strings. - * - * @author Mark Callow, HI Corporation - */ -const char* const ktxErrorString(KTX_error_code error) -{ - if (error > lastErrorCode) - return "Unrecognized error code"; - return errorStrings[error]; -} diff --git a/external/KTX-Software-master/lib/etcdec.cxx b/external/KTX-Software-master/lib/etcdec.cxx deleted file mode 100644 index 5731979..0000000 --- a/external/KTX-Software-master/lib/etcdec.cxx +++ /dev/null @@ -1,1845 +0,0 @@ -/* - -@~English -@page license License - -@section etcdec etcdec.cxx License - -etcdec.cxx is made available under the terms and conditions of the following -License Agreement. - -Software License Agreement - -PLEASE REVIEW THE FOLLOWING TERMS AND CONDITIONS PRIOR TO USING THE -ERICSSON TEXTURE COMPRESSION CODEC SOFTWARE (THE "SOFTWARE"). THE USE -OF THE SOFTWARE IS SUBJECT TO THE TERMS AND CONDITIONS OF THE -FOLLOWING SOFTWARE LICENSE AGREEMENT (THE "SLA"). IF YOU DO NOT ACCEPT -SUCH TERMS AND CONDITIONS YOU MAY NOT USE THE SOFTWARE. - -Subject to the terms and conditions of the SLA, the licensee of the -Software (the "Licensee") hereby, receives a non-exclusive, -non-transferable, limited, free-of-charge, perpetual and worldwide -license, to copy, use, distribute and modify the Software, but only -for the purpose of developing, manufacturing, selling, using and -distributing products including the Software in binary form, which -products are used for compression and/or decompression according to -the Khronos standard specifications OpenGL, OpenGL ES and -WebGL. Notwithstanding anything of the above, Licensee may distribute -[etcdec.cxx] in source code form provided (i) it is in unmodified -form; and (ii) it is included in software owned by Licensee. - -If Licensee institutes, or threatens to institute, patent litigation -against Ericsson or Ericsson's affiliates for using the Software for -developing, having developed, manufacturing, having manufactured, -selling, offer for sale, importing, using, leasing, operating, -repairing and/or distributing products (i) within the scope of the -Khronos framework; or (ii) using software or other intellectual -property rights owned by Ericsson or its affiliates and provided under -the Khronos framework, Ericsson shall have the right to terminate this -SLA with immediate effect. Moreover, if Licensee institutes, or -threatens to institute, patent litigation against any other licensee -of the Software for using the Software in products within the scope of -the Khronos framework, Ericsson shall have the right to terminate this -SLA with immediate effect. However, should Licensee institute, or -threaten to institute, patent litigation against any other licensee of -the Software based on such other licensee's use of any other software -together with the Software, then Ericsson shall have no right to -terminate this SLA. - -This SLA does not transfer to Licensee any ownership to any Ericsson -or third party intellectual property rights. All rights not expressly -granted by Ericsson under this SLA are hereby expressly -reserved. Furthermore, nothing in this SLA shall be construed as a -right to use or sell products in a manner which conveys or purports to -convey whether explicitly, by principles of implied license, or -otherwise, any rights to any third party, under any patent of Ericsson -or of Ericsson's affiliates covering or relating to any combination of -the Software with any other software or product (not licensed -hereunder) where the right applies specifically to the combination and -not to the software or product itself. - -THE SOFTWARE IS PROVIDED "AS IS". ERICSSON MAKES NO REPRESENTATIONS OF -ANY KIND, EXTENDS NO WARRANTIES OR CONDITIONS OF ANY KIND, EITHER -EXPRESS, IMPLIED OR STATUTORY; INCLUDING, BUT NOT LIMITED TO, EXPRESS, -IMPLIED OR STATUTORY WARRANTIES OR CONDITIONS OF TITLE, -MERCHANTABILITY, SATISFACTORY QUALITY, SUITABILITY, AND FITNESS FOR A -PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE -OF THE SOFTWARE IS WITH THE LICENSEE. SHOULD THE SOFTWARE PROVE -DEFECTIVE, THE LICENSEE ASSUMES THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. ERICSSON MAKES NO WARRANTY THAT THE MANUFACTURE, -SALE, OFFERING FOR SALE, DISTRIBUTION, LEASE, USE OR IMPORTATION UNDER -THE SLA WILL BE FREE FROM INFRINGEMENT OF PATENTS, COPYRIGHTS OR OTHER -INTELLECTUAL PROPERTY RIGHTS OF OTHERS, AND THE VALIDITY OF THE -LICENSE AND THE SLA ARE SUBJECT TO LICENSEE'S SOLE RESPONSIBILITY TO -MAKE SUCH DETERMINATION AND ACQUIRE SUCH LICENSES AS MAY BE NECESSARY -WITH RESPECT TO PATENTS, COPYRIGHT AND OTHER INTELLECTUAL PROPERTY OF -THIRD PARTIES. - -THE LICENSEE ACKNOWLEDGES AND ACCEPTS THAT THE SOFTWARE (I) IS NOT -LICENSED FOR; (II) IS NOT DESIGNED FOR OR INTENDED FOR; AND (III) MAY -NOT BE USED FOR; ANY MISSION CRITICAL APPLICATIONS SUCH AS, BUT NOT -LIMITED TO OPERATION OF NUCLEAR OR HEALTHCARE COMPUTER SYSTEMS AND/OR -NETWORKS, AIRCRAFT OR TRAIN CONTROL AND/OR COMMUNICATION SYSTEMS OR -ANY OTHER COMPUTER SYSTEMS AND/OR NETWORKS OR CONTROL AND/OR -COMMUNICATION SYSTEMS ALL IN WHICH CASE THE FAILURE OF THE SOFTWARE -COULD LEAD TO DEATH, PERSONAL INJURY, OR SEVERE PHYSICAL, MATERIAL OR -ENVIRONMENTAL DAMAGE. LICENSEE'S RIGHTS UNDER THIS LICENSE WILL -TERMINATE AUTOMATICALLY AND IMMEDIATELY WITHOUT NOTICE IF LICENSEE -FAILS TO COMPLY WITH THIS PARAGRAPH. - -IN NO EVENT SHALL ERICSSON BE LIABLE FOR ANY DAMAGES WHATSOEVER, -INCLUDING BUT NOT LIMITED TO PERSONAL INJURY, ANY GENERAL, SPECIAL, -INDIRECT, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF OR IN -CONNECTION WITH THE USE OR INABILITY TO USE THE SOFTWARE (INCLUDING -BUT NOT LIMITED TO LOSS OF PROFITS, BUSINESS INTERUPTIONS, OR ANY -OTHER COMMERCIAL DAMAGES OR LOSSES, LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY THE LICENSEE OR THIRD -PARTIES OR A FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER -SOFTWARE) REGARDLESS OF THE THEORY OF LIABILITY (CONTRACT, TORT, OR -OTHERWISE), EVEN IF THE LICENSEE OR ANY OTHER PARTY HAS BEEN ADVISED -OF THE POSSIBILITY OF SUCH DAMAGES. - -Licensee acknowledges that "ERICSSON ///" is the corporate trademark -of Telefonaktiebolaget LM Ericsson and that both "Ericsson" and the -figure "///" are important features of the trade names of -Telefonaktiebolaget LM Ericsson. Nothing contained in these terms and -conditions shall be deemed to grant Licensee any right, title or -interest in the word "Ericsson" or the figure "///". No delay or -omission by Ericsson to exercise any right or power shall impair any -such right or power to be construed to be a waiver thereof. Consent by -Ericsson to, or waiver of, a breach by the Licensee shall not -constitute consent to, waiver of, or excuse for any other different or -subsequent breach. - -This SLA shall be governed by the substantive law of Sweden. Any -dispute, controversy or claim arising out of or in connection with -this SLA, or the breach, termination or invalidity thereof, shall be -submitted to the exclusive jurisdiction of the Swedish Courts. - -*/ - -//// etcpack v2.74 -//// -//// NO WARRANTY -//// -//// BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE THE PROGRAM IS PROVIDED -//// "AS IS". ERICSSON MAKES NO REPRESENTATIONS OF ANY KIND, EXTENDS NO -//// WARRANTIES OR CONDITIONS OF ANY KIND; EITHER EXPRESS, IMPLIED OR -//// STATUTORY; INCLUDING, BUT NOT LIMITED TO, EXPRESS, IMPLIED OR -//// STATUTORY WARRANTIES OR CONDITIONS OF TITLE, MERCHANTABILITY, -//// SATISFACTORY QUALITY, SUITABILITY AND FITNESS FOR A PARTICULAR -//// PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -//// PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME -//// THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. ERICSSON -//// MAKES NO WARRANTY THAT THE MANUFACTURE, SALE, OFFERING FOR SALE, -//// DISTRIBUTION, LEASE, USE OR IMPORTATION UNDER THE LICENSE WILL BE FREE -//// FROM INFRINGEMENT OF PATENTS, COPYRIGHTS OR OTHER INTELLECTUAL -//// PROPERTY RIGHTS OF OTHERS, AND THE VALIDITY OF THE LICENSE IS SUBJECT -//// TO YOUR SOLE RESPONSIBILITY TO MAKE SUCH DETERMINATION AND ACQUIRE -//// SUCH LICENSES AS MAY BE NECESSARY WITH RESPECT TO PATENTS, COPYRIGHT -//// AND OTHER INTELLECTUAL PROPERTY OF THIRD PARTIES. -//// -//// FOR THE AVOIDANCE OF DOUBT THE PROGRAM (I) IS NOT LICENSED FOR; (II) -//// IS NOT DESIGNED FOR OR INTENDED FOR; AND (III) MAY NOT BE USED FOR; -//// ANY MISSION CRITICAL APPLICATIONS SUCH AS, BUT NOT LIMITED TO -//// OPERATION OF NUCLEAR OR HEALTHCARE COMPUTER SYSTEMS AND/OR NETWORKS, -//// AIRCRAFT OR TRAIN CONTROL AND/OR COMMUNICATION SYSTEMS OR ANY OTHER -//// COMPUTER SYSTEMS AND/OR NETWORKS OR CONTROL AND/OR COMMUNICATION -//// SYSTEMS ALL IN WHICH CASE THE FAILURE OF THE PROGRAM COULD LEAD TO -//// DEATH, PERSONAL INJURY, OR SEVERE PHYSICAL, MATERIAL OR ENVIRONMENTAL -//// DAMAGE. YOUR RIGHTS UNDER THIS LICENSE WILL TERMINATE AUTOMATICALLY -//// AND IMMEDIATELY WITHOUT NOTICE IF YOU FAIL TO COMPLY WITH THIS -//// PARAGRAPH. -//// -//// IN NO EVENT WILL ERICSSON, BE LIABLE FOR ANY DAMAGES WHATSOEVER, -//// INCLUDING BUT NOT LIMITED TO PERSONAL INJURY, ANY GENERAL, SPECIAL, -//// INDIRECT, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN -//// CONNECTION WITH THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT -//// NOT LIMITED TO LOSS OF PROFITS, BUSINESS INTERUPTIONS, OR ANY OTHER -//// COMMERCIAL DAMAGES OR LOSSES, LOSS OF DATA OR DATA BEING RENDERED -//// INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF -//// THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS) REGARDLESS OF THE -//// THEORY OF LIABILITY (CONTRACT, TORT OR OTHERWISE), EVEN IF SUCH HOLDER -//// OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. -//// -//// (C) Ericsson AB 2013. All Rights Reserved. -//// - -#include <stdio.h> -#include <stdlib.h> - -// Typedefs -typedef unsigned char uint8; -typedef unsigned short uint16; -typedef short int16; - -// Macros to help with bit extraction/insertion -#define SHIFT(size,startpos) ((startpos)-(size)+1) -#define MASK(size, startpos) (((2<<(size-1))-1) << SHIFT(size,startpos)) -#define PUTBITS( dest, data, size, startpos) dest = ((dest & ~MASK(size, startpos)) | ((data << SHIFT(size, startpos)) & MASK(size,startpos))) -#define SHIFTHIGH(size, startpos) (((startpos)-32)-(size)+1) -#define MASKHIGH(size, startpos) (((1<<(size))-1) << SHIFTHIGH(size,startpos)) -#define PUTBITSHIGH(dest, data, size, startpos) dest = ((dest & ~MASKHIGH(size, startpos)) | ((data << SHIFTHIGH(size, startpos)) & MASKHIGH(size,startpos))) -#define GETBITS(source, size, startpos) (( (source) >> ((startpos)-(size)+1) ) & ((1<<(size)) -1)) -#define GETBITSHIGH(source, size, startpos) (( (source) >> (((startpos)-32)-(size)+1) ) & ((1<<(size)) -1)) -#ifndef PGMOUT -#define PGMOUT 0 -#endif -// Thumb macros and definitions -#define R_BITS59T 4 -#define G_BITS59T 4 -#define B_BITS59T 4 -#define R_BITS58H 4 -#define G_BITS58H 4 -#define B_BITS58H 4 -#define MAXIMUM_ERROR (255*255*16*1000) -#define R 0 -#define G 1 -#define B 2 -#define BLOCKHEIGHT 4 -#define BLOCKWIDTH 4 -#define BINPOW(power) (1<<(power)) -#define TABLE_BITS_59T 3 -#define TABLE_BITS_58H 3 - -// Helper Macros -#define CLAMP(ll,x,ul) (((x)<(ll)) ? (ll) : (((x)>(ul)) ? (ul) : (x))) -#define JAS_ROUND(x) (((x) < 0.0 ) ? ((int)((x)-0.5)) : ((int)((x)+0.5))) - -#define RED_CHANNEL(img,width,x,y,channels) img[channels*(y*width+x)+0] -#define GREEN_CHANNEL(img,width,x,y,channels) img[channels*(y*width+x)+1] -#define BLUE_CHANNEL(img,width,x,y,channels) img[channels*(y*width+x)+2] -#define ALPHA_CHANNEL(img,width,x,y,channels) img[channels*(y*width+x)+3] - - -// Global tables -static uint8 table59T[8] = {3,6,11,16,23,32,41,64}; // 3-bit table for the 59 bit T-mode -static uint8 table58H[8] = {3,6,11,16,23,32,41,64}; // 3-bit table for the 58 bit H-mode -static int compressParams[16][4] = {{-8, -2, 2, 8}, {-8, -2, 2, 8}, {-17, -5, 5, 17}, {-17, -5, 5, 17}, {-29, -9, 9, 29}, {-29, -9, 9, 29}, {-42, -13, 13, 42}, {-42, -13, 13, 42}, {-60, -18, 18, 60}, {-60, -18, 18, 60}, {-80, -24, 24, 80}, {-80, -24, 24, 80}, {-106, -33, 33, 106}, {-106, -33, 33, 106}, {-183, -47, 47, 183}, {-183, -47, 47, 183}}; -static int unscramble[4] = {2, 3, 1, 0}; -int alphaTableInitialized = 0; -int alphaTable[256][8]; -int alphaBase[16][4] = { - {-15,-9,-6,-3}, - {-13,-10,-7,-3}, - {-13,-8,-5,-2}, - {-13,-6,-4,-2}, - {-12,-8,-6,-3}, - {-11,-9,-7,-3}, - {-11,-8,-7,-4}, - {-11,-8,-5,-3}, - { -10,-8,-6,-2}, - { -10,-8,-5,-2}, - { -10,-8,-4,-2}, - { -10,-7,-5,-2}, - { -10,-7,-4,-3}, - { -10,-3,-2, -1}, - { -9,-8,-6,-4}, - { -9,-7,-5,-3} - }; - -// Global variables -int formatSigned = 0; - -// Enums - enum{PATTERN_H = 0, - PATTERN_T = 1}; - - -// Code used to create the valtab -// NO WARRANTY --- SEE STATEMENT IN TOP OF FILE (C) Ericsson AB 2013. All Rights Reserved. -void setupAlphaTable() -{ - if(alphaTableInitialized) - return; - alphaTableInitialized = 1; - - //read table used for alpha compression - int buf; - for(int i = 16; i<32; i++) - { - for(int j=0; j<8; j++) - { - buf=alphaBase[i-16][3-j%4]; - if(j<4) - alphaTable[i][j]=buf; - else - alphaTable[i][j]=(-buf-1); - } - } - - //beyond the first 16 values, the rest of the table is implicit.. so calculate that! - for(int i=0; i<256; i++) - { - //fill remaining slots in table with multiples of the first ones. - int mul = i/16; - int old = 16+i%16; - for(int j = 0; j<8; j++) - { - alphaTable[i][j]=alphaTable[old][j]*mul; - //note: we don't do clamping here, though we could, because we'll be clamped afterwards anyway. - } - } -} - -// Read a word in big endian style -// NO WARRANTY --- SEE STATEMENT IN TOP OF FILE (C) Ericsson AB 2013. All Rights Reserved. -void read_big_endian_2byte_word(unsigned short *blockadr, FILE *f) -{ - uint8 bytes[2]; - unsigned short block; - // This is to silence -Wunused-result from GCC 4.8+. - size_t numitems; - - numitems = fread(&bytes[0], 1, 1, f); - numitems = fread(&bytes[1], 1, 1, f); - - block = 0; - block |= bytes[0]; - block = block << 8; - block |= bytes[1]; - - blockadr[0] = block; -} - -// Read a word in big endian style -// NO WARRANTY --- SEE STATEMENT IN TOP OF FILE (C) Ericsson AB 2013. All Rights Reserved. -void read_big_endian_4byte_word(unsigned int *blockadr, FILE *f) -{ - uint8 bytes[4]; - unsigned int block; - // This is to silence -Wunused-result from GCC 4.8+. - size_t numitems; - - numitems = fread(&bytes[0], 1, 1, f); - numitems = fread(&bytes[1], 1, 1, f); - numitems = fread(&bytes[2], 1, 1, f); - numitems = fread(&bytes[3], 1, 1, f); - - block = 0; - block |= bytes[0]; - block = block << 8; - block |= bytes[1]; - block = block << 8; - block |= bytes[2]; - block = block << 8; - block |= bytes[3]; - - blockadr[0] = block; -} - -// The format stores the bits for the three extra modes in a roundabout way to be able to -// fit them without increasing the bit rate. This function converts them into something -// that is easier to work with. -// NO WARRANTY --- SEE STATEMENT IN TOP OF FILE (C) Ericsson AB 2013. All Rights Reserved. -void unstuff57bits(unsigned int planar_word1, unsigned int planar_word2, unsigned int &planar57_word1, unsigned int &planar57_word2) -{ - // Get bits from twotimer configuration for 57 bits - // - // Go to this bit layout: - // - // 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 - // ----------------------------------------------------------------------------------------------- - // |R0 |G01G02 |B01B02 ;B03 |RH1 |RH2|GH | - // ----------------------------------------------------------------------------------------------- - // - // 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - // ----------------------------------------------------------------------------------------------- - // |BH |RV |GV |BV | not used | - // ----------------------------------------------------------------------------------------------- - // - // From this: - // - // 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 - // ------------------------------------------------------------------------------------------------ - // |//|R0 |G01|/|G02 |B01|/ // //|B02 |//|B03 |RH1 |df|RH2| - // ------------------------------------------------------------------------------------------------ - // - // 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - // ----------------------------------------------------------------------------------------------- - // |GH |BH |RV |GV |BV | - // ----------------------------------------------------------------------------------------------- - // - // 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 - // --------------------------------------------------------------------------------------------------- - // | base col1 | dcol 2 | base col1 | dcol 2 | base col 1 | dcol 2 | table | table |diff|flip| - // | R1' (5 bits) | dR2 | G1' (5 bits) | dG2 | B1' (5 bits) | dB2 | cw 1 | cw 2 |bit |bit | - // --------------------------------------------------------------------------------------------------- - - uint8 RO, GO1, GO2, BO1, BO2, BO3, RH1, RH2, GH, BH, RV, GV, BV; - - RO = GETBITSHIGH( planar_word1, 6, 62); - GO1 = GETBITSHIGH( planar_word1, 1, 56); - GO2 = GETBITSHIGH( planar_word1, 6, 54); - BO1 = GETBITSHIGH( planar_word1, 1, 48); - BO2 = GETBITSHIGH( planar_word1, 2, 44); - BO3 = GETBITSHIGH( planar_word1, 3, 41); - RH1 = GETBITSHIGH( planar_word1, 5, 38); - RH2 = GETBITSHIGH( planar_word1, 1, 32); - GH = GETBITS( planar_word2, 7, 31); - BH = GETBITS( planar_word2, 6, 24); - RV = GETBITS( planar_word2, 6, 18); - GV = GETBITS( planar_word2, 7, 12); - BV = GETBITS( planar_word2, 6, 5); - - planar57_word1 = 0; planar57_word2 = 0; - PUTBITSHIGH( planar57_word1, RO, 6, 63); - PUTBITSHIGH( planar57_word1, GO1, 1, 57); - PUTBITSHIGH( planar57_word1, GO2, 6, 56); - PUTBITSHIGH( planar57_word1, BO1, 1, 50); - PUTBITSHIGH( planar57_word1, BO2, 2, 49); - PUTBITSHIGH( planar57_word1, BO3, 3, 47); - PUTBITSHIGH( planar57_word1, RH1, 5, 44); - PUTBITSHIGH( planar57_word1, RH2, 1, 39); - PUTBITSHIGH( planar57_word1, GH, 7, 38); - PUTBITS( planar57_word2, BH, 6, 31); - PUTBITS( planar57_word2, RV, 6, 25); - PUTBITS( planar57_word2, GV, 7, 19); - PUTBITS( planar57_word2, BV, 6, 12); -} - -// The format stores the bits for the three extra modes in a roundabout way to be able to -// fit them without increasing the bit rate. This function converts them into something -// that is easier to work with. -// NO WARRANTY --- SEE STATEMENT IN TOP OF FILE (C) Ericsson AB 2013. All Rights Reserved. -void unstuff58bits(unsigned int thumbH_word1, unsigned int thumbH_word2, unsigned int &thumbH58_word1, unsigned int &thumbH58_word2) -{ - // Go to this layout: - // - // |63 62 61 60 59 58|57 56 55 54 53 52 51|50 49|48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33|32 | - // |-------empty-----|part0---------------|part1|part2------------------------------------------|part3| - // - // from this: - // - // 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 - // --------------------------------------------------------------------------------------------------| - // |//|part0 |// // //|part1|//|part2 |df|part3| - // --------------------------------------------------------------------------------------------------| - - unsigned int part0, part1, part2, part3; - - // move parts - part0 = GETBITSHIGH( thumbH_word1, 7, 62); - part1 = GETBITSHIGH( thumbH_word1, 2, 52); - part2 = GETBITSHIGH( thumbH_word1,16, 49); - part3 = GETBITSHIGH( thumbH_word1, 1, 32); - thumbH58_word1 = 0; - PUTBITSHIGH( thumbH58_word1, part0, 7, 57); - PUTBITSHIGH( thumbH58_word1, part1, 2, 50); - PUTBITSHIGH( thumbH58_word1, part2, 16, 48); - PUTBITSHIGH( thumbH58_word1, part3, 1, 32); - - thumbH58_word2 = thumbH_word2; -} - -// The format stores the bits for the three extra modes in a roundabout way to be able to -// fit them without increasing the bit rate. This function converts them into something -// that is easier to work with. -// NO WARRANTY --- SEE STATEMENT IN TOP OF FILE (C) Ericsson AB 2013. All Rights Reserved. -void unstuff59bits(unsigned int thumbT_word1, unsigned int thumbT_word2, unsigned int &thumbT59_word1, unsigned int &thumbT59_word2) -{ - // Get bits from twotimer configuration 59 bits. - // - // Go to this bit layout: - // - // |63 62 61 60 59|58 57 56 55|54 53 52 51|50 49 48 47|46 45 44 43|42 41 40 39|38 37 36 35|34 33 32| - // |----empty-----|---red 0---|--green 0--|--blue 0---|---red 1---|--green 1--|--blue 1---|--dist--| - // - // |31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00| - // |----------------------------------------index bits---------------------------------------------| - // - // - // From this: - // - // 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 - // ----------------------------------------------------------------------------------------------- - // |// // //|R0a |//|R0b |G0 |B0 |R1 |G1 |B1 |da |df|db| - // ----------------------------------------------------------------------------------------------- - // - // |31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00| - // |----------------------------------------index bits---------------------------------------------| - // - // 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 - // ----------------------------------------------------------------------------------------------- - // | base col1 | dcol 2 | base col1 | dcol 2 | base col 1 | dcol 2 | table | table |df|fp| - // | R1' (5 bits) | dR2 | G1' (5 bits) | dG2 | B1' (5 bits) | dB2 | cw 1 | cw 2 |bt|bt| - // ------------------------------------------------------------------------------------------------ - - uint8 R0a; - - // Fix middle part - thumbT59_word1 = thumbT_word1 >> 1; - // Fix db (lowest bit of d) - PUTBITSHIGH( thumbT59_word1, thumbT_word1, 1, 32); - // Fix R0a (top two bits of R0) - R0a = GETBITSHIGH( thumbT_word1, 2, 60); - PUTBITSHIGH( thumbT59_word1, R0a, 2, 58); - - // Zero top part (not needed) - PUTBITSHIGH( thumbT59_word1, 0, 5, 63); - - thumbT59_word2 = thumbT_word2; -} - -// The color bits are expanded to the full color -// NO WARRANTY --- SEE STATEMENT IN TOP OF FILE (C) Ericsson AB 2013. All Rights Reserved. -void decompressColor(int R_B, int G_B, int B_B, uint8 (colors_RGB444)[2][3], uint8 (colors)[2][3]) -{ - // The color should be retrieved as: - // - // c = round(255/(r_bits^2-1))*comp_color - // - // This is similar to bit replication - // - // Note -- this code only work for bit replication from 4 bits and up --- 3 bits needs - // two copy operations. - - colors[0][R] = (colors_RGB444[0][R] << (8 - R_B)) | (colors_RGB444[0][R] >> (R_B - (8-R_B)) ); - colors[0][G] = (colors_RGB444[0][G] << (8 - G_B)) | (colors_RGB444[0][G] >> (G_B - (8-G_B)) ); - colors[0][B] = (colors_RGB444[0][B] << (8 - B_B)) | (colors_RGB444[0][B] >> (B_B - (8-B_B)) ); - colors[1][R] = (colors_RGB444[1][R] << (8 - R_B)) | (colors_RGB444[1][R] >> (R_B - (8-R_B)) ); - colors[1][G] = (colors_RGB444[1][G] << (8 - G_B)) | (colors_RGB444[1][G] >> (G_B - (8-G_B)) ); - colors[1][B] = (colors_RGB444[1][B] << (8 - B_B)) | (colors_RGB444[1][B] >> (B_B - (8-B_B)) ); -} - -void calculatePaintColors59T(uint8 d, uint8 p, uint8 (colors)[2][3], uint8 (possible_colors)[4][3]) -{ - ////////////////////////////////////////////// - // - // C3 C1 C4----C1---C2 - // | | | - // | | | - // |-------| | - // | | | - // | | | - // C4 C2 C3 - // - ////////////////////////////////////////////// - - // C4 - possible_colors[3][R] = CLAMP(0,colors[1][R] - table59T[d],255); - possible_colors[3][G] = CLAMP(0,colors[1][G] - table59T[d],255); - possible_colors[3][B] = CLAMP(0,colors[1][B] - table59T[d],255); - - if (p == PATTERN_T) - { - // C3 - possible_colors[0][R] = colors[0][R]; - possible_colors[0][G] = colors[0][G]; - possible_colors[0][B] = colors[0][B]; - // C2 - possible_colors[1][R] = CLAMP(0,colors[1][R] + table59T[d],255); - possible_colors[1][G] = CLAMP(0,colors[1][G] + table59T[d],255); - possible_colors[1][B] = CLAMP(0,colors[1][B] + table59T[d],255); - // C1 - possible_colors[2][R] = colors[1][R]; - possible_colors[2][G] = colors[1][G]; - possible_colors[2][B] = colors[1][B]; - - } - else - { - printf("Invalid pattern. Terminating"); - exit(1); - } -} -// Decompress a T-mode block (simple packing) -// Simple 59T packing: -//|63 62 61 60 59|58 57 56 55|54 53 52 51|50 49 48 47|46 45 44 43|42 41 40 39|38 37 36 35|34 33 32| -//|----empty-----|---red 0---|--green 0--|--blue 0---|---red 1---|--green 1--|--blue 1---|--dist--| -// -//|31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00| -//|----------------------------------------index bits---------------------------------------------| -// NO WARRANTY --- SEE STATEMENT IN TOP OF FILE (C) Ericsson AB 2013. All Rights Reserved. -void decompressBlockTHUMB59Tc(unsigned int block_part1, unsigned int block_part2, uint8 *img,int width,int height,int startx,int starty, int channels) -{ - uint8 colorsRGB444[2][3]; - uint8 colors[2][3]; - uint8 paint_colors[4][3]; - uint8 distance; - uint8 block_mask[4][4]; - - // First decode left part of block. - colorsRGB444[0][R]= GETBITSHIGH(block_part1, 4, 58); - colorsRGB444[0][G]= GETBITSHIGH(block_part1, 4, 54); - colorsRGB444[0][B]= GETBITSHIGH(block_part1, 4, 50); - - colorsRGB444[1][R]= GETBITSHIGH(block_part1, 4, 46); - colorsRGB444[1][G]= GETBITSHIGH(block_part1, 4, 42); - colorsRGB444[1][B]= GETBITSHIGH(block_part1, 4, 38); - - distance = GETBITSHIGH(block_part1, TABLE_BITS_59T, 34); - - // Extend the two colors to RGB888 - decompressColor(R_BITS59T, G_BITS59T, B_BITS59T, colorsRGB444, colors); - calculatePaintColors59T(distance, PATTERN_T, colors, paint_colors); - - // Choose one of the four paint colors for each texel - for (uint8 x = 0; x < BLOCKWIDTH; ++x) - { - for (uint8 y = 0; y < BLOCKHEIGHT; ++y) - { - //block_mask[x][y] = GETBITS(block_part2,2,31-(y*4+x)*2); - block_mask[x][y] = GETBITS(block_part2,1,(y+x*4)+16)<<1; - block_mask[x][y] |= GETBITS(block_part2,1,(y+x*4)); - img[channels*((starty+y)*width+startx+x)+R] = - CLAMP(0,paint_colors[block_mask[x][y]][R],255); // RED - img[channels*((starty+y)*width+startx+x)+G] = - CLAMP(0,paint_colors[block_mask[x][y]][G],255); // GREEN - img[channels*((starty+y)*width+startx+x)+B] = - CLAMP(0,paint_colors[block_mask[x][y]][B],255); // BLUE - } - } -} - -void decompressBlockTHUMB59T(unsigned int block_part1, unsigned int block_part2, uint8 *img, int width, int height, int startx, int starty) -{ - decompressBlockTHUMB59Tc(block_part1, block_part2, img, width, height, startx, starty, 3); -} - -// Calculate the paint colors from the block colors -// using a distance d and one of the H- or T-patterns. -// NO WARRANTY --- SEE STATEMENT IN TOP OF FILE (C) Ericsson AB 2013. All Rights Reserved. -void calculatePaintColors58H(uint8 d, uint8 p, uint8 (colors)[2][3], uint8 (possible_colors)[4][3]) -{ - - ////////////////////////////////////////////// - // - // C3 C1 C4----C1---C2 - // | | | - // | | | - // |-------| | - // | | | - // | | | - // C4 C2 C3 - // - ////////////////////////////////////////////// - - // C4 - possible_colors[3][R] = CLAMP(0,colors[1][R] - table58H[d],255); - possible_colors[3][G] = CLAMP(0,colors[1][G] - table58H[d],255); - possible_colors[3][B] = CLAMP(0,colors[1][B] - table58H[d],255); - - if (p == PATTERN_H) - { - // C1 - possible_colors[0][R] = CLAMP(0,colors[0][R] + table58H[d],255); - possible_colors[0][G] = CLAMP(0,colors[0][G] + table58H[d],255); - possible_colors[0][B] = CLAMP(0,colors[0][B] + table58H[d],255); - // C2 - possible_colors[1][R] = CLAMP(0,colors[0][R] - table58H[d],255); - possible_colors[1][G] = CLAMP(0,colors[0][G] - table58H[d],255); - possible_colors[1][B] = CLAMP(0,colors[0][B] - table58H[d],255); - // C3 - possible_colors[2][R] = CLAMP(0,colors[1][R] + table58H[d],255); - possible_colors[2][G] = CLAMP(0,colors[1][G] + table58H[d],255); - possible_colors[2][B] = CLAMP(0,colors[1][B] + table58H[d],255); - } - else - { - printf("Invalid pattern. Terminating"); - exit(1); - } -} - -// Decompress an H-mode block -// NO WARRANTY --- SEE STATEMENT IN TOP OF FILE (C) Ericsson AB 2013. All Rights Reserved. -void decompressBlockTHUMB58Hc(unsigned int block_part1, unsigned int block_part2, uint8 *img, int width, int height, int startx, int starty, int channels) -{ - unsigned int col0, col1; - uint8 colors[2][3]; - uint8 colorsRGB444[2][3]; - uint8 paint_colors[4][3]; - uint8 distance; - uint8 block_mask[4][4]; - - // First decode left part of block. - colorsRGB444[0][R]= GETBITSHIGH(block_part1, 4, 57); - colorsRGB444[0][G]= GETBITSHIGH(block_part1, 4, 53); - colorsRGB444[0][B]= GETBITSHIGH(block_part1, 4, 49); - - colorsRGB444[1][R]= GETBITSHIGH(block_part1, 4, 45); - colorsRGB444[1][G]= GETBITSHIGH(block_part1, 4, 41); - colorsRGB444[1][B]= GETBITSHIGH(block_part1, 4, 37); - - distance = 0; - distance = (GETBITSHIGH(block_part1, 2, 33)) << 1; - - col0 = GETBITSHIGH(block_part1, 12, 57); - col1 = GETBITSHIGH(block_part1, 12, 45); - - if(col0 >= col1) - { - distance |= 1; - } - - // Extend the two colors to RGB888 - decompressColor(R_BITS58H, G_BITS58H, B_BITS58H, colorsRGB444, colors); - - calculatePaintColors58H(distance, PATTERN_H, colors, paint_colors); - - // Choose one of the four paint colors for each texel - for (uint8 x = 0; x < BLOCKWIDTH; ++x) - { - for (uint8 y = 0; y < BLOCKHEIGHT; ++y) - { - //block_mask[x][y] = GETBITS(block_part2,2,31-(y*4+x)*2); - block_mask[x][y] = GETBITS(block_part2,1,(y+x*4)+16)<<1; - block_mask[x][y] |= GETBITS(block_part2,1,(y+x*4)); - img[channels*((starty+y)*width+startx+x)+R] = - CLAMP(0,paint_colors[block_mask[x][y]][R],255); // RED - img[channels*((starty+y)*width+startx+x)+G] = - CLAMP(0,paint_colors[block_mask[x][y]][G],255); // GREEN - img[channels*((starty+y)*width+startx+x)+B] = - CLAMP(0,paint_colors[block_mask[x][y]][B],255); // BLUE - } - } -} -void decompressBlockTHUMB58H(unsigned int block_part1, unsigned int block_part2, uint8 *img, int width, int height, int startx, int starty) -{ - decompressBlockTHUMB58Hc(block_part1, block_part2, img, width, height, startx, starty, 3); -} - -// Decompress the planar mode. -// NO WARRANTY --- SEE STATEMENT IN TOP OF FILE (C) Ericsson AB 2013. All Rights Reserved. -void decompressBlockPlanar57c(unsigned int compressed57_1, unsigned int compressed57_2, uint8 *img, int width, int height, int startx, int starty, int channels) -{ - uint8 colorO[3], colorH[3], colorV[3]; - - colorO[0] = GETBITSHIGH( compressed57_1, 6, 63); - colorO[1] = GETBITSHIGH( compressed57_1, 7, 57); - colorO[2] = GETBITSHIGH( compressed57_1, 6, 50); - colorH[0] = GETBITSHIGH( compressed57_1, 6, 44); - colorH[1] = GETBITSHIGH( compressed57_1, 7, 38); - colorH[2] = GETBITS( compressed57_2, 6, 31); - colorV[0] = GETBITS( compressed57_2, 6, 25); - colorV[1] = GETBITS( compressed57_2, 7, 19); - colorV[2] = GETBITS( compressed57_2, 6, 12); - - colorO[0] = (colorO[0] << 2) | (colorO[0] >> 4); - colorO[1] = (colorO[1] << 1) | (colorO[1] >> 6); - colorO[2] = (colorO[2] << 2) | (colorO[2] >> 4); - - colorH[0] = (colorH[0] << 2) | (colorH[0] >> 4); - colorH[1] = (colorH[1] << 1) | (colorH[1] >> 6); - colorH[2] = (colorH[2] << 2) | (colorH[2] >> 4); - - colorV[0] = (colorV[0] << 2) | (colorV[0] >> 4); - colorV[1] = (colorV[1] << 1) | (colorV[1] >> 6); - colorV[2] = (colorV[2] << 2) | (colorV[2] >> 4); - - int xx, yy; - - for( xx=0; xx<4; xx++) - { - for( yy=0; yy<4; yy++) - { - img[channels*width*(starty+yy) + channels*(startx+xx) + 0] = CLAMP(0, ((xx*(colorH[0]-colorO[0]) + yy*(colorV[0]-colorO[0]) + 4*colorO[0] + 2) >> 2),255); - img[channels*width*(starty+yy) + channels*(startx+xx) + 1] = CLAMP(0, ((xx*(colorH[1]-colorO[1]) + yy*(colorV[1]-colorO[1]) + 4*colorO[1] + 2) >> 2),255); - img[channels*width*(starty+yy) + channels*(startx+xx) + 2] = CLAMP(0, ((xx*(colorH[2]-colorO[2]) + yy*(colorV[2]-colorO[2]) + 4*colorO[2] + 2) >> 2),255); - - //Equivalent method - /*img[channels*width*(starty+yy) + channels*(startx+xx) + 0] = (int)CLAMP(0, JAS_ROUND((xx*(colorH[0]-colorO[0])/4.0 + yy*(colorV[0]-colorO[0])/4.0 + colorO[0])), 255); - img[channels*width*(starty+yy) + channels*(startx+xx) + 1] = (int)CLAMP(0, JAS_ROUND((xx*(colorH[1]-colorO[1])/4.0 + yy*(colorV[1]-colorO[1])/4.0 + colorO[1])), 255); - img[channels*width*(starty+yy) + channels*(startx+xx) + 2] = (int)CLAMP(0, JAS_ROUND((xx*(colorH[2]-colorO[2])/4.0 + yy*(colorV[2]-colorO[2])/4.0 + colorO[2])), 255);*/ - - } - } -} -void decompressBlockPlanar57(unsigned int compressed57_1, unsigned int compressed57_2, uint8 *img, int width, int height, int startx, int starty) -{ - decompressBlockPlanar57c(compressed57_1, compressed57_2, img, width, height, startx, starty, 3); -} -// Decompress an ETC1 block (or ETC2 using individual or differential mode). -// NO WARRANTY --- SEE STATEMENT IN TOP OF FILE (C) Ericsson AB 2013. All Rights Reserved. -void decompressBlockDiffFlipC(unsigned int block_part1, unsigned int block_part2, uint8 *img, int width, int height, int startx, int starty, int channels) -{ - uint8 avg_color[3], enc_color1[3], enc_color2[3]; - signed char diff[3]; - int table; - int index,shift; - int r,g,b; - int diffbit; - int flipbit; - - diffbit = (GETBITSHIGH(block_part1, 1, 33)); - flipbit = (GETBITSHIGH(block_part1, 1, 32)); - - if( !diffbit ) - { - // We have diffbit = 0. - - // First decode left part of block. - avg_color[0]= GETBITSHIGH(block_part1, 4, 63); - avg_color[1]= GETBITSHIGH(block_part1, 4, 55); - avg_color[2]= GETBITSHIGH(block_part1, 4, 47); - - // Here, we should really multiply by 17 instead of 16. This can - // be done by just copying the four lower bits to the upper ones - // while keeping the lower bits. - avg_color[0] |= (avg_color[0] <<4); - avg_color[1] |= (avg_color[1] <<4); - avg_color[2] |= (avg_color[2] <<4); - - table = GETBITSHIGH(block_part1, 3, 39) << 1; - - unsigned int pixel_indices_MSB, pixel_indices_LSB; - - pixel_indices_MSB = GETBITS(block_part2, 16, 31); - pixel_indices_LSB = GETBITS(block_part2, 16, 15); - - if( (flipbit) == 0 ) - { - // We should not flip - shift = 0; - for(int x=startx; x<startx+2; x++) - { - for(int y=starty; y<starty+4; y++) - { - index = ((pixel_indices_MSB >> shift) & 1) << 1; - index |= ((pixel_indices_LSB >> shift) & 1); - shift++; - index=unscramble[index]; - - r=RED_CHANNEL(img,width,x,y,channels) =CLAMP(0,avg_color[0]+compressParams[table][index],255); - g=GREEN_CHANNEL(img,width,x,y,channels)=CLAMP(0,avg_color[1]+compressParams[table][index],255); - b=BLUE_CHANNEL(img,width,x,y,channels) =CLAMP(0,avg_color[2]+compressParams[table][index],255); - } - } - } - else - { - // We should flip - shift = 0; - for(int x=startx; x<startx+4; x++) - { - for(int y=starty; y<starty+2; y++) - { - index = ((pixel_indices_MSB >> shift) & 1) << 1; - index |= ((pixel_indices_LSB >> shift) & 1); - shift++; - index=unscramble[index]; - - r=RED_CHANNEL(img,width,x,y,channels) =CLAMP(0,avg_color[0]+compressParams[table][index],255); - g=GREEN_CHANNEL(img,width,x,y,channels)=CLAMP(0,avg_color[1]+compressParams[table][index],255); - b=BLUE_CHANNEL(img,width,x,y,channels) =CLAMP(0,avg_color[2]+compressParams[table][index],255); - } - shift+=2; - } - } - - // Now decode other part of block. - avg_color[0]= GETBITSHIGH(block_part1, 4, 59); - avg_color[1]= GETBITSHIGH(block_part1, 4, 51); - avg_color[2]= GETBITSHIGH(block_part1, 4, 43); - - // Here, we should really multiply by 17 instead of 16. This can - // be done by just copying the four lower bits to the upper ones - // while keeping the lower bits. - avg_color[0] |= (avg_color[0] <<4); - avg_color[1] |= (avg_color[1] <<4); - avg_color[2] |= (avg_color[2] <<4); - - table = GETBITSHIGH(block_part1, 3, 36) << 1; - pixel_indices_MSB = GETBITS(block_part2, 16, 31); - pixel_indices_LSB = GETBITS(block_part2, 16, 15); - - if( (flipbit) == 0 ) - { - // We should not flip - shift=8; - for(int x=startx+2; x<startx+4; x++) - { - for(int y=starty; y<starty+4; y++) - { - index = ((pixel_indices_MSB >> shift) & 1) << 1; - index |= ((pixel_indices_LSB >> shift) & 1); - shift++; - index=unscramble[index]; - - r=RED_CHANNEL(img,width,x,y,channels) =CLAMP(0,avg_color[0]+compressParams[table][index],255); - g=GREEN_CHANNEL(img,width,x,y,channels)=CLAMP(0,avg_color[1]+compressParams[table][index],255); - b=BLUE_CHANNEL(img,width,x,y,channels) =CLAMP(0,avg_color[2]+compressParams[table][index],255); - } - } - } - else - { - // We should flip - shift=2; - for(int x=startx; x<startx+4; x++) - { - for(int y=starty+2; y<starty+4; y++) - { - index = ((pixel_indices_MSB >> shift) & 1) << 1; - index |= ((pixel_indices_LSB >> shift) & 1); - shift++; - index=unscramble[index]; - - r=RED_CHANNEL(img,width,x,y,channels) =CLAMP(0,avg_color[0]+compressParams[table][index],255); - g=GREEN_CHANNEL(img,width,x,y,channels)=CLAMP(0,avg_color[1]+compressParams[table][index],255); - b=BLUE_CHANNEL(img,width,x,y,channels) =CLAMP(0,avg_color[2]+compressParams[table][index],255); - } - shift += 2; - } - } - } - else - { - // We have diffbit = 1. - -// 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 -// --------------------------------------------------------------------------------------------------- -// | base col1 | dcol 2 | base col1 | dcol 2 | base col 1 | dcol 2 | table | table |diff|flip| -// | R1' (5 bits) | dR2 | G1' (5 bits) | dG2 | B1' (5 bits) | dB2 | cw 1 | cw 2 |bit |bit | -// --------------------------------------------------------------------------------------------------- -// -// -// c) bit layout in bits 31 through 0 (in both cases) -// -// 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 -// -------------------------------------------------------------------------------------------------- -// | most significant pixel index bits | least significant pixel index bits | -// | p| o| n| m| l| k| j| i| h| g| f| e| d| c| b| a| p| o| n| m| l| k| j| i| h| g| f| e| d| c | b | a | -// -------------------------------------------------------------------------------------------------- - - // First decode left part of block. - enc_color1[0]= GETBITSHIGH(block_part1, 5, 63); - enc_color1[1]= GETBITSHIGH(block_part1, 5, 55); - enc_color1[2]= GETBITSHIGH(block_part1, 5, 47); - - // Expand from 5 to 8 bits - avg_color[0] = (enc_color1[0] <<3) | (enc_color1[0] >> 2); - avg_color[1] = (enc_color1[1] <<3) | (enc_color1[1] >> 2); - avg_color[2] = (enc_color1[2] <<3) | (enc_color1[2] >> 2); - - table = GETBITSHIGH(block_part1, 3, 39) << 1; - - unsigned int pixel_indices_MSB, pixel_indices_LSB; - - pixel_indices_MSB = GETBITS(block_part2, 16, 31); - pixel_indices_LSB = GETBITS(block_part2, 16, 15); - - if( (flipbit) == 0 ) - { - // We should not flip - shift = 0; - for(int x=startx; x<startx+2; x++) - { - for(int y=starty; y<starty+4; y++) - { - index = ((pixel_indices_MSB >> shift) & 1) << 1; - index |= ((pixel_indices_LSB >> shift) & 1); - shift++; - index=unscramble[index]; - - r=RED_CHANNEL(img,width,x,y,channels) =CLAMP(0,avg_color[0]+compressParams[table][index],255); - g=GREEN_CHANNEL(img,width,x,y,channels)=CLAMP(0,avg_color[1]+compressParams[table][index],255); - b=BLUE_CHANNEL(img,width,x,y,channels) =CLAMP(0,avg_color[2]+compressParams[table][index],255); - } - } - } - else - { - // We should flip - shift = 0; - for(int x=startx; x<startx+4; x++) - { - for(int y=starty; y<starty+2; y++) - { - index = ((pixel_indices_MSB >> shift) & 1) << 1; - index |= ((pixel_indices_LSB >> shift) & 1); - shift++; - index=unscramble[index]; - - r=RED_CHANNEL(img,width,x,y,channels) =CLAMP(0,avg_color[0]+compressParams[table][index],255); - g=GREEN_CHANNEL(img,width,x,y,channels)=CLAMP(0,avg_color[1]+compressParams[table][index],255); - b=BLUE_CHANNEL(img,width,x,y,channels) =CLAMP(0,avg_color[2]+compressParams[table][index],255); - } - shift+=2; - } - } - - // Now decode right part of block. - diff[0]= GETBITSHIGH(block_part1, 3, 58); - diff[1]= GETBITSHIGH(block_part1, 3, 50); - diff[2]= GETBITSHIGH(block_part1, 3, 42); - - // Extend sign bit to entire byte. - diff[0] = (diff[0] << 5); - diff[1] = (diff[1] << 5); - diff[2] = (diff[2] << 5); - diff[0] = diff[0] >> 5; - diff[1] = diff[1] >> 5; - diff[2] = diff[2] >> 5; - - // Calculale second color - enc_color2[0]= enc_color1[0] + diff[0]; - enc_color2[1]= enc_color1[1] + diff[1]; - enc_color2[2]= enc_color1[2] + diff[2]; - - // Expand from 5 to 8 bits - avg_color[0] = (enc_color2[0] <<3) | (enc_color2[0] >> 2); - avg_color[1] = (enc_color2[1] <<3) | (enc_color2[1] >> 2); - avg_color[2] = (enc_color2[2] <<3) | (enc_color2[2] >> 2); - - table = GETBITSHIGH(block_part1, 3, 36) << 1; - pixel_indices_MSB = GETBITS(block_part2, 16, 31); - pixel_indices_LSB = GETBITS(block_part2, 16, 15); - - if( (flipbit) == 0 ) - { - // We should not flip - shift=8; - for(int x=startx+2; x<startx+4; x++) - { - for(int y=starty; y<starty+4; y++) - { - index = ((pixel_indices_MSB >> shift) & 1) << 1; - index |= ((pixel_indices_LSB >> shift) & 1); - shift++; - index=unscramble[index]; - - r=RED_CHANNEL(img,width,x,y,channels) =CLAMP(0,avg_color[0]+compressParams[table][index],255); - g=GREEN_CHANNEL(img,width,x,y,channels)=CLAMP(0,avg_color[1]+compressParams[table][index],255); - b=BLUE_CHANNEL(img,width,x,y,channels) =CLAMP(0,avg_color[2]+compressParams[table][index],255); - } - } - } - else - { - // We should flip - shift=2; - for(int x=startx; x<startx+4; x++) - { - for(int y=starty+2; y<starty+4; y++) - { - index = ((pixel_indices_MSB >> shift) & 1) << 1; - index |= ((pixel_indices_LSB >> shift) & 1); - shift++; - index=unscramble[index]; - - r=RED_CHANNEL(img,width,x,y,channels) =CLAMP(0,avg_color[0]+compressParams[table][index],255); - g=GREEN_CHANNEL(img,width,x,y,channels)=CLAMP(0,avg_color[1]+compressParams[table][index],255); - b=BLUE_CHANNEL(img,width,x,y,channels) =CLAMP(0,avg_color[2]+compressParams[table][index],255); - } - shift += 2; - } - } - } -} -void decompressBlockDiffFlip(unsigned int block_part1, unsigned int block_part2, uint8 *img, int width, int height, int startx, int starty) -{ - decompressBlockDiffFlipC(block_part1, block_part2, img, width, height, startx, starty, 3); -} - -// Decompress an ETC2 RGB block -// NO WARRANTY --- SEE STATEMENT IN TOP OF FILE (C) Ericsson AB 2013. All Rights Reserved. -void decompressBlockETC2c(unsigned int block_part1, unsigned int block_part2, uint8 *img, int width, int height, int startx, int starty, int channels) -{ - int diffbit; - signed char color1[3]; - signed char diff[3]; - signed char red, green, blue; - - diffbit = (GETBITSHIGH(block_part1, 1, 33)); - - if( diffbit ) - { - // We have diffbit = 1; - - // Base color - color1[0]= GETBITSHIGH(block_part1, 5, 63); - color1[1]= GETBITSHIGH(block_part1, 5, 55); - color1[2]= GETBITSHIGH(block_part1, 5, 47); - - // Diff color - diff[0]= GETBITSHIGH(block_part1, 3, 58); - diff[1]= GETBITSHIGH(block_part1, 3, 50); - diff[2]= GETBITSHIGH(block_part1, 3, 42); - - // Extend sign bit to entire byte. - diff[0] = (diff[0] << 5); - diff[1] = (diff[1] << 5); - diff[2] = (diff[2] << 5); - diff[0] = diff[0] >> 5; - diff[1] = diff[1] >> 5; - diff[2] = diff[2] >> 5; - - red = color1[0] + diff[0]; - green = color1[1] + diff[1]; - blue = color1[2] + diff[2]; - - if(red < 0 || red > 31) - { - unsigned int block59_part1, block59_part2; - unstuff59bits(block_part1, block_part2, block59_part1, block59_part2); - decompressBlockTHUMB59Tc(block59_part1, block59_part2, img, width, height, startx, starty, channels); - } - else if (green < 0 || green > 31) - { - unsigned int block58_part1, block58_part2; - unstuff58bits(block_part1, block_part2, block58_part1, block58_part2); - decompressBlockTHUMB58Hc(block58_part1, block58_part2, img, width, height, startx, starty, channels); - } - else if(blue < 0 || blue > 31) - { - unsigned int block57_part1, block57_part2; - - unstuff57bits(block_part1, block_part2, block57_part1, block57_part2); - decompressBlockPlanar57c(block57_part1, block57_part2, img, width, height, startx, starty, channels); - } - else - { - decompressBlockDiffFlipC(block_part1, block_part2, img, width, height, startx, starty, channels); - } - } - else - { - // We have diffbit = 0; - decompressBlockDiffFlipC(block_part1, block_part2, img, width, height, startx, starty, channels); - } -} -void decompressBlockETC2(unsigned int block_part1, unsigned int block_part2, uint8 *img, int width, int height, int startx, int starty) -{ - decompressBlockETC2c(block_part1, block_part2, img, width, height, startx, starty, 3); -} -// Decompress an ETC2 block with punchthrough alpha -// NO WARRANTY --- SEE STATEMENT IN TOP OF FILE (C) Ericsson AB 2013. All Rights Reserved. -void decompressBlockDifferentialWithAlphaC(unsigned int block_part1, unsigned int block_part2, uint8* img, uint8* alpha, int width, int height, int startx, int starty, int channelsRGB) -{ - - uint8 avg_color[3], enc_color1[3], enc_color2[3]; - signed char diff[3]; - int table; - int index,shift; - int r,g,b; - int diffbit; - int flipbit; - int channelsA; - - if(channelsRGB == 3) - { - // We will decode the alpha data to a separate memory area. - channelsA = 1; - } - else - { - // We will decode the RGB data and the alpha data to the same memory area, - // interleaved as RGBA. - channelsA = 4; - alpha = &img[0+3]; - } - - //the diffbit now encodes whether or not the entire alpha channel is 255. - diffbit = (GETBITSHIGH(block_part1, 1, 33)); - flipbit = (GETBITSHIGH(block_part1, 1, 32)); - - // First decode left part of block. - enc_color1[0]= GETBITSHIGH(block_part1, 5, 63); - enc_color1[1]= GETBITSHIGH(block_part1, 5, 55); - enc_color1[2]= GETBITSHIGH(block_part1, 5, 47); - - // Expand from 5 to 8 bits - avg_color[0] = (enc_color1[0] <<3) | (enc_color1[0] >> 2); - avg_color[1] = (enc_color1[1] <<3) | (enc_color1[1] >> 2); - avg_color[2] = (enc_color1[2] <<3) | (enc_color1[2] >> 2); - - table = GETBITSHIGH(block_part1, 3, 39) << 1; - - unsigned int pixel_indices_MSB, pixel_indices_LSB; - - pixel_indices_MSB = GETBITS(block_part2, 16, 31); - pixel_indices_LSB = GETBITS(block_part2, 16, 15); - - if( (flipbit) == 0 ) - { - // We should not flip - shift = 0; - for(int x=startx; x<startx+2; x++) - { - for(int y=starty; y<starty+4; y++) - { - index = ((pixel_indices_MSB >> shift) & 1) << 1; - index |= ((pixel_indices_LSB >> shift) & 1); - shift++; - index=unscramble[index]; - - int mod = compressParams[table][index]; - if(diffbit==0&&(index==1||index==2)) - { - mod=0; - } - - r=RED_CHANNEL(img,width,x,y,channelsRGB) =CLAMP(0,avg_color[0]+mod,255); - g=GREEN_CHANNEL(img,width,x,y,channelsRGB)=CLAMP(0,avg_color[1]+mod,255); - b=BLUE_CHANNEL(img,width,x,y,channelsRGB) =CLAMP(0,avg_color[2]+mod,255); - if(diffbit==0&&index==1) - { - alpha[(y*width+x)*channelsA]=0; - r=RED_CHANNEL(img,width,x,y,channelsRGB)=0; - g=GREEN_CHANNEL(img,width,x,y,channelsRGB)=0; - b=BLUE_CHANNEL(img,width,x,y,channelsRGB)=0; - } - else - { - alpha[(y*width+x)*channelsA]=255; - } - - } - } - } - else - { - // We should flip - shift = 0; - for(int x=startx; x<startx+4; x++) - { - for(int y=starty; y<starty+2; y++) - { - index = ((pixel_indices_MSB >> shift) & 1) << 1; - index |= ((pixel_indices_LSB >> shift) & 1); - shift++; - index=unscramble[index]; - int mod = compressParams[table][index]; - if(diffbit==0&&(index==1||index==2)) - { - mod=0; - } - r=RED_CHANNEL(img,width,x,y,channelsRGB) =CLAMP(0,avg_color[0]+mod,255); - g=GREEN_CHANNEL(img,width,x,y,channelsRGB)=CLAMP(0,avg_color[1]+mod,255); - b=BLUE_CHANNEL(img,width,x,y,channelsRGB) =CLAMP(0,avg_color[2]+mod,255); - if(diffbit==0&&index==1) - { - alpha[(y*width+x)*channelsA]=0; - r=RED_CHANNEL(img,width,x,y,channelsRGB)=0; - g=GREEN_CHANNEL(img,width,x,y,channelsRGB)=0; - b=BLUE_CHANNEL(img,width,x,y,channelsRGB)=0; - } - else - { - alpha[(y*width+x)*channelsA]=255; - } - } - shift+=2; - } - } - // Now decode right part of block. - diff[0]= GETBITSHIGH(block_part1, 3, 58); - diff[1]= GETBITSHIGH(block_part1, 3, 50); - diff[2]= GETBITSHIGH(block_part1, 3, 42); - - // Extend sign bit to entire byte. - diff[0] = (diff[0] << 5); - diff[1] = (diff[1] << 5); - diff[2] = (diff[2] << 5); - diff[0] = diff[0] >> 5; - diff[1] = diff[1] >> 5; - diff[2] = diff[2] >> 5; - - // Calculate second color - enc_color2[0]= enc_color1[0] + diff[0]; - enc_color2[1]= enc_color1[1] + diff[1]; - enc_color2[2]= enc_color1[2] + diff[2]; - - // Expand from 5 to 8 bits - avg_color[0] = (enc_color2[0] <<3) | (enc_color2[0] >> 2); - avg_color[1] = (enc_color2[1] <<3) | (enc_color2[1] >> 2); - avg_color[2] = (enc_color2[2] <<3) | (enc_color2[2] >> 2); - - table = GETBITSHIGH(block_part1, 3, 36) << 1; - pixel_indices_MSB = GETBITS(block_part2, 16, 31); - pixel_indices_LSB = GETBITS(block_part2, 16, 15); - - if( (flipbit) == 0 ) - { - // We should not flip - shift=8; - for(int x=startx+2; x<startx+4; x++) - { - for(int y=starty; y<starty+4; y++) - { - index = ((pixel_indices_MSB >> shift) & 1) << 1; - index |= ((pixel_indices_LSB >> shift) & 1); - shift++; - index=unscramble[index]; - int mod = compressParams[table][index]; - if(diffbit==0&&(index==1||index==2)) - { - mod=0; - } - - r=RED_CHANNEL(img,width,x,y,channelsRGB) =CLAMP(0,avg_color[0]+mod,255); - g=GREEN_CHANNEL(img,width,x,y,channelsRGB)=CLAMP(0,avg_color[1]+mod,255); - b=BLUE_CHANNEL(img,width,x,y,channelsRGB) =CLAMP(0,avg_color[2]+mod,255); - if(diffbit==0&&index==1) - { - alpha[(y*width+x)*channelsA]=0; - r=RED_CHANNEL(img,width,x,y,channelsRGB)=0; - g=GREEN_CHANNEL(img,width,x,y,channelsRGB)=0; - b=BLUE_CHANNEL(img,width,x,y,channelsRGB)=0; - } - else - { - alpha[(y*width+x)*channelsA]=255; - } - } - } - } - else - { - // We should flip - shift=2; - for(int x=startx; x<startx+4; x++) - { - for(int y=starty+2; y<starty+4; y++) - { - index = ((pixel_indices_MSB >> shift) & 1) << 1; - index |= ((pixel_indices_LSB >> shift) & 1); - shift++; - index=unscramble[index]; - int mod = compressParams[table][index]; - if(diffbit==0&&(index==1||index==2)) - { - mod=0; - } - - r=RED_CHANNEL(img,width,x,y,channelsRGB) =CLAMP(0,avg_color[0]+mod,255); - g=GREEN_CHANNEL(img,width,x,y,channelsRGB)=CLAMP(0,avg_color[1]+mod,255); - b=BLUE_CHANNEL(img,width,x,y,channelsRGB) =CLAMP(0,avg_color[2]+mod,255); - if(diffbit==0&&index==1) - { - alpha[(y*width+x)*channelsA]=0; - r=RED_CHANNEL(img,width,x,y,channelsRGB)=0; - g=GREEN_CHANNEL(img,width,x,y,channelsRGB)=0; - b=BLUE_CHANNEL(img,width,x,y,channelsRGB)=0; - } - else - { - alpha[(y*width+x)*channelsA]=255; - } - } - shift += 2; - } - } -} -void decompressBlockDifferentialWithAlpha(unsigned int block_part1, unsigned int block_part2, uint8* img, uint8* alpha, int width, int height, int startx, int starty) -{ - decompressBlockDifferentialWithAlphaC(block_part1, block_part2, img, alpha, width, height, startx, starty, 3); -} - - -// similar to regular decompression, but alpha channel is set to 0 if pixel index is 2, otherwise 255. -// NO WARRANTY --- SEE STATEMENT IN TOP OF FILE (C) Ericsson AB 2013. All Rights Reserved. -void decompressBlockTHUMB59TAlphaC(unsigned int block_part1, unsigned int block_part2, uint8 *img, uint8* alpha, int width, int height, int startx, int starty, int channelsRGB) -{ - - uint8 colorsRGB444[2][3]; - uint8 colors[2][3]; - uint8 paint_colors[4][3]; - uint8 distance; - uint8 block_mask[4][4]; - int channelsA; - - if(channelsRGB == 3) - { - // We will decode the alpha data to a separate memory area. - channelsA = 1; - } - else - { - // We will decode the RGB data and the alpha data to the same memory area, - // interleaved as RGBA. - channelsA = 4; - alpha = &img[0+3]; - } - - // First decode left part of block. - colorsRGB444[0][R]= GETBITSHIGH(block_part1, 4, 58); - colorsRGB444[0][G]= GETBITSHIGH(block_part1, 4, 54); - colorsRGB444[0][B]= GETBITSHIGH(block_part1, 4, 50); - - colorsRGB444[1][R]= GETBITSHIGH(block_part1, 4, 46); - colorsRGB444[1][G]= GETBITSHIGH(block_part1, 4, 42); - colorsRGB444[1][B]= GETBITSHIGH(block_part1, 4, 38); - - distance = GETBITSHIGH(block_part1, TABLE_BITS_59T, 34); - - // Extend the two colors to RGB888 - decompressColor(R_BITS59T, G_BITS59T, B_BITS59T, colorsRGB444, colors); - calculatePaintColors59T(distance, PATTERN_T, colors, paint_colors); - - // Choose one of the four paint colors for each texel - for (uint8 x = 0; x < BLOCKWIDTH; ++x) - { - for (uint8 y = 0; y < BLOCKHEIGHT; ++y) - { - //block_mask[x][y] = GETBITS(block_part2,2,31-(y*4+x)*2); - block_mask[x][y] = GETBITS(block_part2,1,(y+x*4)+16)<<1; - block_mask[x][y] |= GETBITS(block_part2,1,(y+x*4)); - img[channelsRGB*((starty+y)*width+startx+x)+R] = - CLAMP(0,paint_colors[block_mask[x][y]][R],255); // RED - img[channelsRGB*((starty+y)*width+startx+x)+G] = - CLAMP(0,paint_colors[block_mask[x][y]][G],255); // GREEN - img[channelsRGB*((starty+y)*width+startx+x)+B] = - CLAMP(0,paint_colors[block_mask[x][y]][B],255); // BLUE - if(block_mask[x][y]==2) - { - alpha[channelsA*(x+startx+(y+starty)*width)]=0; - img[channelsRGB*((starty+y)*width+startx+x)+R] =0; - img[channelsRGB*((starty+y)*width+startx+x)+G] =0; - img[channelsRGB*((starty+y)*width+startx+x)+B] =0; - } - else - alpha[channelsA*(x+startx+(y+starty)*width)]=255; - } - } -} -void decompressBlockTHUMB59TAlpha(unsigned int block_part1, unsigned int block_part2, uint8 *img, uint8* alpha, int width, int height, int startx, int starty) -{ - decompressBlockTHUMB59TAlphaC(block_part1, block_part2, img, alpha, width, height, startx, starty, 3); -} - - -// Decompress an H-mode block with alpha -// NO WARRANTY --- SEE STATEMENT IN TOP OF FILE (C) Ericsson AB 2013. All Rights Reserved. -void decompressBlockTHUMB58HAlphaC(unsigned int block_part1, unsigned int block_part2, uint8 *img, uint8* alpha, int width, int height, int startx, int starty, int channelsRGB) -{ - unsigned int col0, col1; - uint8 colors[2][3]; - uint8 colorsRGB444[2][3]; - uint8 paint_colors[4][3]; - uint8 distance; - uint8 block_mask[4][4]; - int channelsA; - - if(channelsRGB == 3) - { - // We will decode the alpha data to a separate memory area. - channelsA = 1; - } - else - { - // We will decode the RGB data and the alpha data to the same memory area, - // interleaved as RGBA. - channelsA = 4; - alpha = &img[0+3]; - } - - // First decode left part of block. - colorsRGB444[0][R]= GETBITSHIGH(block_part1, 4, 57); - colorsRGB444[0][G]= GETBITSHIGH(block_part1, 4, 53); - colorsRGB444[0][B]= GETBITSHIGH(block_part1, 4, 49); - - colorsRGB444[1][R]= GETBITSHIGH(block_part1, 4, 45); - colorsRGB444[1][G]= GETBITSHIGH(block_part1, 4, 41); - colorsRGB444[1][B]= GETBITSHIGH(block_part1, 4, 37); - - distance = 0; - distance = (GETBITSHIGH(block_part1, 2, 33)) << 1; - - col0 = GETBITSHIGH(block_part1, 12, 57); - col1 = GETBITSHIGH(block_part1, 12, 45); - - if(col0 >= col1) - { - distance |= 1; - } - - // Extend the two colors to RGB888 - decompressColor(R_BITS58H, G_BITS58H, B_BITS58H, colorsRGB444, colors); - - calculatePaintColors58H(distance, PATTERN_H, colors, paint_colors); - - // Choose one of the four paint colors for each texel - for (uint8 x = 0; x < BLOCKWIDTH; ++x) - { - for (uint8 y = 0; y < BLOCKHEIGHT; ++y) - { - //block_mask[x][y] = GETBITS(block_part2,2,31-(y*4+x)*2); - block_mask[x][y] = GETBITS(block_part2,1,(y+x*4)+16)<<1; - block_mask[x][y] |= GETBITS(block_part2,1,(y+x*4)); - img[channelsRGB*((starty+y)*width+startx+x)+R] = - CLAMP(0,paint_colors[block_mask[x][y]][R],255); // RED - img[channelsRGB*((starty+y)*width+startx+x)+G] = - CLAMP(0,paint_colors[block_mask[x][y]][G],255); // GREEN - img[channelsRGB*((starty+y)*width+startx+x)+B] = - CLAMP(0,paint_colors[block_mask[x][y]][B],255); // BLUE - - if(block_mask[x][y]==2) - { - alpha[channelsA*(x+startx+(y+starty)*width)]=0; - img[channelsRGB*((starty+y)*width+startx+x)+R] =0; - img[channelsRGB*((starty+y)*width+startx+x)+G] =0; - img[channelsRGB*((starty+y)*width+startx+x)+B] =0; - } - else - alpha[channelsA*(x+startx+(y+starty)*width)]=255; - } - } -} -void decompressBlockTHUMB58HAlpha(unsigned int block_part1, unsigned int block_part2, uint8 *img, uint8* alpha, int width, int height, int startx, int starty) -{ - decompressBlockTHUMB58HAlphaC(block_part1, block_part2, img, alpha, width, height, startx, starty, 3); -} -// Decompression function for ETC2_RGBA1 format. -// NO WARRANTY --- SEE STATEMENT IN TOP OF FILE (C) Ericsson AB 2013. All Rights Reserved. -void decompressBlockETC21BitAlphaC(unsigned int block_part1, unsigned int block_part2, uint8 *img, uint8* alphaimg, int width, int height, int startx, int starty, int channelsRGB) -{ - int diffbit; - signed char color1[3]; - signed char diff[3]; - signed char red, green, blue; - int channelsA; - - if(channelsRGB == 3) - { - // We will decode the alpha data to a separate memory area. - channelsA = 1; - } - else - { - // We will decode the RGB data and the alpha data to the same memory area, - // interleaved as RGBA. - channelsA = 4; - alphaimg = &img[0+3]; - } - - diffbit = (GETBITSHIGH(block_part1, 1, 33)); - - if( diffbit ) - { - // We have diffbit = 1, meaning no transparent pixels. regular decompression. - - // Base color - color1[0]= GETBITSHIGH(block_part1, 5, 63); - color1[1]= GETBITSHIGH(block_part1, 5, 55); - color1[2]= GETBITSHIGH(block_part1, 5, 47); - - // Diff color - diff[0]= GETBITSHIGH(block_part1, 3, 58); - diff[1]= GETBITSHIGH(block_part1, 3, 50); - diff[2]= GETBITSHIGH(block_part1, 3, 42); - - // Extend sign bit to entire byte. - diff[0] = (diff[0] << 5); - diff[1] = (diff[1] << 5); - diff[2] = (diff[2] << 5); - diff[0] = diff[0] >> 5; - diff[1] = diff[1] >> 5; - diff[2] = diff[2] >> 5; - - red = color1[0] + diff[0]; - green = color1[1] + diff[1]; - blue = color1[2] + diff[2]; - - if(red < 0 || red > 31) - { - unsigned int block59_part1, block59_part2; - unstuff59bits(block_part1, block_part2, block59_part1, block59_part2); - decompressBlockTHUMB59Tc(block59_part1, block59_part2, img, width, height, startx, starty, channelsRGB); - } - else if (green < 0 || green > 31) - { - unsigned int block58_part1, block58_part2; - unstuff58bits(block_part1, block_part2, block58_part1, block58_part2); - decompressBlockTHUMB58Hc(block58_part1, block58_part2, img, width, height, startx, starty, channelsRGB); - } - else if(blue < 0 || blue > 31) - { - unsigned int block57_part1, block57_part2; - - unstuff57bits(block_part1, block_part2, block57_part1, block57_part2); - decompressBlockPlanar57c(block57_part1, block57_part2, img, width, height, startx, starty, channelsRGB); - } - else - { - decompressBlockDifferentialWithAlphaC(block_part1, block_part2, img, alphaimg, width, height, startx, starty, channelsRGB); - } - for(int x=startx; x<startx+4; x++) - { - for(int y=starty; y<starty+4; y++) - { - alphaimg[channelsA*(x+y*width)]=255; - } - } - } - else - { - // We have diffbit = 0, transparent pixels. Only T-, H- or regular diff-mode possible. - - // Base color - color1[0]= GETBITSHIGH(block_part1, 5, 63); - color1[1]= GETBITSHIGH(block_part1, 5, 55); - color1[2]= GETBITSHIGH(block_part1, 5, 47); - - // Diff color - diff[0]= GETBITSHIGH(block_part1, 3, 58); - diff[1]= GETBITSHIGH(block_part1, 3, 50); - diff[2]= GETBITSHIGH(block_part1, 3, 42); - - // Extend sign bit to entire byte. - diff[0] = (diff[0] << 5); - diff[1] = (diff[1] << 5); - diff[2] = (diff[2] << 5); - diff[0] = diff[0] >> 5; - diff[1] = diff[1] >> 5; - diff[2] = diff[2] >> 5; - - red = color1[0] + diff[0]; - green = color1[1] + diff[1]; - blue = color1[2] + diff[2]; - if(red < 0 || red > 31) - { - unsigned int block59_part1, block59_part2; - unstuff59bits(block_part1, block_part2, block59_part1, block59_part2); - decompressBlockTHUMB59TAlphaC(block59_part1, block59_part2, img, alphaimg, width, height, startx, starty, channelsRGB); - } - else if(green < 0 || green > 31) - { - unsigned int block58_part1, block58_part2; - unstuff58bits(block_part1, block_part2, block58_part1, block58_part2); - decompressBlockTHUMB58HAlphaC(block58_part1, block58_part2, img, alphaimg, width, height, startx, starty, channelsRGB); - } - else if(blue < 0 || blue > 31) - { - unsigned int block57_part1, block57_part2; - - unstuff57bits(block_part1, block_part2, block57_part1, block57_part2); - decompressBlockPlanar57c(block57_part1, block57_part2, img, width, height, startx, starty, channelsRGB); - for(int x=startx; x<startx+4; x++) - { - for(int y=starty; y<starty+4; y++) - { - alphaimg[channelsA*(x+y*width)]=255; - } - } - } - else - decompressBlockDifferentialWithAlphaC(block_part1, block_part2, img,alphaimg, width, height, startx, starty, channelsRGB); - } -} -void decompressBlockETC21BitAlpha(unsigned int block_part1, unsigned int block_part2, uint8 *img, uint8* alphaimg, int width, int height, int startx, int starty) -{ - decompressBlockETC21BitAlphaC(block_part1, block_part2, img, alphaimg, width, height, startx, starty, 3); -} -// -// Utility functions used for alpha compression -// - -// bit number frompos is extracted from input, and moved to bit number topos in the return value. -// NO WARRANTY --- SEE STATEMENT IN TOP OF FILE (C) Ericsson AB 2013. All Rights Reserved. -uint8 getbit(uint8 input, int frompos, int topos) -{ - if(frompos>topos) - return ((1<<frompos)&input)>>(frompos-topos); - return ((1<<frompos)&input)<<(topos-frompos); -} - -// takes as input a value, returns the value clamped to the interval [0,255]. -// NO WARRANTY --- SEE STATEMENT IN TOP OF FILE (C) Ericsson AB 2013. All Rights Reserved. -int clamp(int val) -{ - if(val<0) - val=0; - if(val>255) - val=255; - return val; -} - -// Decodes tha alpha component in a block coded with GL_COMPRESSED_RGBA8_ETC2_EAC. -// Note that this decoding is slightly different from that of GL_COMPRESSED_R11_EAC. -// However, a hardware decoder can share gates between the two formats as explained -// in the specification under GL_COMPRESSED_R11_EAC. -// NO WARRANTY --- SEE STATEMENT IN TOP OF FILE (C) Ericsson AB 2013. All Rights Reserved. -void decompressBlockAlphaC(uint8* data, uint8* img, int width, int height, int ix, int iy, int channels) -{ - int alpha = data[0]; - int table = data[1]; - - int bit=0; - int byte=2; - //extract an alpha value for each pixel. - for(int x=0; x<4; x++) - { - for(int y=0; y<4; y++) - { - //Extract table index - int index=0; - for(int bitpos=0; bitpos<3; bitpos++) - { - index|=getbit(data[byte],7-bit,2-bitpos); - bit++; - if(bit>7) - { - bit=0; - byte++; - } - } - img[(ix+x+(iy+y)*width)*channels]=clamp(alpha +alphaTable[table][index]); - } - } -} -void decompressBlockAlpha(uint8* data, uint8* img, int width, int height, int ix, int iy) -{ - decompressBlockAlphaC(data, img, width, height, ix, iy, 1); -} - -// Does decompression and then immediately converts from 11 bit signed to a 16-bit format. -// -// NO WARRANTY --- SEE STATEMENT IN TOP OF FILE (C) Ericsson AB 2013. All Rights Reserved. -int16 get16bits11signed(int base, int table, int mul, int index) -{ - int elevenbase = base-128; - if(elevenbase==-128) - elevenbase=-127; - elevenbase*=8; - //i want the positive value here - int tabVal = -alphaBase[table][3-index%4]-1; - //and the sign, please - int sign = 1-(index/4); - - if(sign) - tabVal=tabVal+1; - int elevenTabVal = tabVal*8; - - if(mul!=0) - elevenTabVal*=mul; - else - elevenTabVal/=8; - - if(sign) - elevenTabVal=-elevenTabVal; - - //calculate sum - int elevenbits = elevenbase+elevenTabVal; - - //clamp.. - if(elevenbits>=1024) - elevenbits=1023; - else if(elevenbits<-1023) - elevenbits=-1023; - //this is the value we would actually output.. - //but there aren't any good 11-bit file or uncompressed GL formats - //so we extend to 15 bits signed. - sign = elevenbits<0; - elevenbits=abs(elevenbits); - int16 fifteenbits = (elevenbits<<5)+(elevenbits>>5); - int16 sixteenbits=fifteenbits; - - if(sign) - sixteenbits=-sixteenbits; - - return sixteenbits; -} - -// Does decompression and then immediately converts from 11 bit signed to a 16-bit format -// Calculates the 11 bit value represented by base, table, mul and index, and extends it to 16 bits. -// NO WARRANTY --- SEE STATEMENT IN TOP OF FILE (C) Ericsson AB 2013. All Rights Reserved. -uint16 get16bits11bits(int base, int table, int mul, int index) -{ - int elevenbase = base*8+4; - - //i want the positive value here - int tabVal = -alphaBase[table][3-index%4]-1; - //and the sign, please - int sign = 1-(index/4); - - if(sign) - tabVal=tabVal+1; - int elevenTabVal = tabVal*8; - - if(mul!=0) - elevenTabVal*=mul; - else - elevenTabVal/=8; - - if(sign) - elevenTabVal=-elevenTabVal; - - //calculate sum - int elevenbits = elevenbase+elevenTabVal; - - //clamp.. - if(elevenbits>=256*8) - elevenbits=256*8-1; - else if(elevenbits<0) - elevenbits=0; - //elevenbits now contains the 11 bit alpha value as defined in the spec. - - //extend to 16 bits before returning, since we don't have any good 11-bit file formats. - uint16 sixteenbits = (elevenbits<<5)+(elevenbits>>6); - - return sixteenbits; -} - -// Decompresses a block using one of the GL_COMPRESSED_R11_EAC or GL_COMPRESSED_SIGNED_R11_EAC-formats -// NO WARRANTY --- SEE STATEMENT IN TOP OF FILE (C) Ericsson AB 2013. All Rights Reserved. -void decompressBlockAlpha16bitC(uint8* data, uint8* img, int width, int height, int ix, int iy, int channels) -{ - int alpha = data[0]; - int table = data[1]; - - if(formatSigned) - { - //if we have a signed format, the base value is given as a signed byte. We convert it to (0-255) here, - //so more code can be shared with the unsigned mode. - alpha = *((signed char*)(&data[0])); - alpha = alpha+128; - } - - int bit=0; - int byte=2; - //extract an alpha value for each pixel. - for(int x=0; x<4; x++) - { - for(int y=0; y<4; y++) - { - //Extract table index - int index=0; - for(int bitpos=0; bitpos<3; bitpos++) - { - index|=getbit(data[byte],7-bit,2-bitpos); - bit++; - if(bit>7) - { - bit=0; - byte++; - } - } - int windex = channels*(2*(ix+x+(iy+y)*width)); -#if !PGMOUT - if(formatSigned) - { - *(int16 *)&img[windex] = get16bits11signed(alpha,(table%16),(table/16),index); - } - else - { - *(uint16 *)&img[windex] = get16bits11bits(alpha,(table%16),(table/16),index); - } -#else - //make data compatible with the .pgm format. See the comment in compressBlockAlpha16() for details. - uint16 uSixteen; - if (formatSigned) - { - //the pgm-format only allows unsigned images, - //so we add 2^15 to get a 16-bit value. - uSixteen = get16bits11signed(alpha,(table%16),(table/16),index) + 256*128; - } - else - { - uSixteen = get16bits11bits(alpha,(table%16),(table/16),index); - } - //byte swap for pgm - img[windex] = uSixteen/256; - img[windex+1] = uSixteen%256; -#endif - - } - } -} - -void decompressBlockAlpha16bit(uint8* data, uint8* img, int width, int height, int ix, int iy) -{ - decompressBlockAlpha16bitC(data, img, width, height, ix, iy, 1); -} diff --git a/external/KTX-Software-master/lib/etcunpack.cxx b/external/KTX-Software-master/lib/etcunpack.cxx deleted file mode 100644 index 85d0c51..0000000 --- a/external/KTX-Software-master/lib/etcunpack.cxx +++ /dev/null @@ -1,288 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4: */ - -/* $Id: 764e83ee5c8febe3233114f9ebe9a9ef21d120f1 $ */ - -/* - * ©2010 The khronos Group, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* @internal - * @~English - * @file - * - * Unpack a texture compressed with ETC1 - * - * @author Mark Callow, HI Corporation. - */ - -#include <assert.h> -#include <stdlib.h> - -#include "GL/glcorearb.h" -// Not defined in glcorearb.h. -#define GL_ETC1_RGB8_OES 0x8D64 -#include "ktx.h" -#include "ktxint.h" - -#if SUPPORT_SOFTWARE_ETC_UNPACK -typedef unsigned int uint; -typedef unsigned char uint8; - -extern void decompressBlockETC2c(uint block_part1, uint block_part2, uint8* img, - int width, int height, int startx, int starty, int channels); -extern void decompressBlockETC21BitAlphaC(uint block_part1, uint block_part2, uint8* img, uint8* alphaimg, - int width, int height, int startx, int starty, int channels); -extern void decompressBlockAlphaC(uint8* data, uint8* img, - int width, int height, int startx, int starty, int channels); -extern void decompressBlockAlpha16bitC(uint8* data, uint8* img, - int width, int height, int startx, int starty, int channels); - -extern void setupAlphaTable(); - -// This global variable affects the behaviour of decompressBlockAlpha16bitC. -extern int formatSigned; - -static void -readBigEndian4byteWord(ktx_uint32_t* pBlock, const GLubyte *s) -{ - *pBlock = (s[0] << 24) | (s[1] << 16) | (s[2] << 8) | s[3]; -} - - -/* Unpack an ETC1_RGB8_OES format compressed texture */ -extern "C" KTX_error_code -_ktxUnpackETC(const GLubyte* srcETC, const GLenum srcFormat, - ktx_uint32_t activeWidth, ktx_uint32_t activeHeight, - GLubyte** dstImage, - GLenum* format, GLenum* internalFormat, GLenum* type, - GLint R16Formats, GLboolean supportsSRGB) -{ - unsigned int width, height; - unsigned int block_part1, block_part2; - unsigned int x, y; - /*const*/ GLubyte* src = (GLubyte*)srcETC; - // AF_11BIT is used to compress R11 & RG11 though its not alpha data. - enum {AF_NONE, AF_1BIT, AF_8BIT, AF_11BIT} alphaFormat = AF_NONE; - int dstChannels, dstChannelBytes; - - switch (srcFormat) { - case GL_COMPRESSED_SIGNED_R11_EAC: - if (R16Formats & _KTX_R16_FORMATS_SNORM) { - dstChannelBytes = sizeof(GLshort); - dstChannels = 1; - formatSigned = GL_TRUE; - *internalFormat = GL_R16_SNORM; - *format = GL_RED; - *type = GL_SHORT; - alphaFormat = AF_11BIT; - } else - return KTX_UNSUPPORTED_TEXTURE_TYPE; - break; - - case GL_COMPRESSED_R11_EAC: - if (R16Formats & _KTX_R16_FORMATS_NORM) { - dstChannelBytes = sizeof(GLshort); - dstChannels = 1; - formatSigned = GL_FALSE; - *internalFormat = GL_R16; - *format = GL_RED; - *type = GL_UNSIGNED_SHORT; - alphaFormat = AF_11BIT; - } else - return KTX_UNSUPPORTED_TEXTURE_TYPE; - break; - - case GL_COMPRESSED_SIGNED_RG11_EAC: - if (R16Formats & _KTX_R16_FORMATS_SNORM) { - dstChannelBytes = sizeof(GLshort); - dstChannels = 2; - formatSigned = GL_TRUE; - *internalFormat = GL_RG16_SNORM; - *format = GL_RG; - *type = GL_SHORT; - alphaFormat = AF_11BIT; - } else - return KTX_UNSUPPORTED_TEXTURE_TYPE; - break; - - case GL_COMPRESSED_RG11_EAC: - if (R16Formats & _KTX_R16_FORMATS_NORM) { - dstChannelBytes = sizeof(GLshort); - dstChannels = 2; - formatSigned = GL_FALSE; - *internalFormat = GL_RG16; - *format = GL_RG; - *type = GL_UNSIGNED_SHORT; - alphaFormat = AF_11BIT; - } else - return KTX_UNSUPPORTED_TEXTURE_TYPE; - break; - - case GL_ETC1_RGB8_OES: - case GL_COMPRESSED_RGB8_ETC2: - dstChannelBytes = sizeof(GLubyte); - dstChannels = 3; - *internalFormat = GL_RGB8; - *format = GL_RGB; - *type = GL_UNSIGNED_BYTE; - break; - - case GL_COMPRESSED_RGBA8_ETC2_EAC: - dstChannelBytes = sizeof(GLubyte); - dstChannels = 4; - *internalFormat = GL_RGBA8; - *format = GL_RGBA; - *type = GL_UNSIGNED_BYTE; - alphaFormat = AF_8BIT; - break; - - case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: - dstChannelBytes = sizeof(GLubyte); - dstChannels = 4; - *internalFormat = GL_RGBA8; - *format = GL_RGBA; - *type = GL_UNSIGNED_BYTE; - alphaFormat = AF_1BIT; - break; - - case GL_COMPRESSED_SRGB8_ETC2: - if (supportsSRGB) { - dstChannelBytes = sizeof(GLubyte); - dstChannels = 3; - *internalFormat = GL_SRGB8; - *format = GL_RGB; - *type = GL_UNSIGNED_BYTE; - } else - return KTX_UNSUPPORTED_TEXTURE_TYPE; - break; - - case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: - if (supportsSRGB) { - dstChannelBytes = sizeof(GLubyte); - dstChannels = 4; - *internalFormat = GL_SRGB8_ALPHA8; - *format = GL_RGBA; - *type = GL_UNSIGNED_BYTE; - alphaFormat = AF_8BIT; - } else - return KTX_UNSUPPORTED_TEXTURE_TYPE; - break; - - case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: - if (supportsSRGB) { - dstChannelBytes = sizeof(GLubyte); - dstChannels = 4; - *internalFormat = GL_SRGB8_ALPHA8; - *format = GL_RGBA; - *type = GL_UNSIGNED_BYTE; - alphaFormat = AF_1BIT; - } else - return KTX_UNSUPPORTED_TEXTURE_TYPE; - break; - - default: - assert(0); // Upper levels should pass only one of the above srcFormats. - return KTX_UNSUPPORTED_TEXTURE_TYPE; // For Release configurations. - } - - /* active_{width,height} show how many pixels contain active data, - * (the rest are just for making sure we have a 2*a x 4*b size). - */ - - /* Compute the full width & height. */ - width = ((activeWidth+3)/4)*4; - height = ((activeHeight+3)/4)*4; - - /* printf("Width = %d, Height = %d\n", width, height); */ - /* printf("active pixel area: top left %d x %d area.\n", activeWidth, activeHeight); */ - - *dstImage = (GLubyte*)malloc(dstChannels*dstChannelBytes*width*height); - if (!*dstImage) { - return KTX_OUT_OF_MEMORY; - } - - if (alphaFormat != AF_NONE) - setupAlphaTable(); - - // NOTE: none of the decompress functions actually use the <height> parameter - if (alphaFormat == AF_11BIT) { - // One or two 11-bit alpha channels for R or RG. - for (y=0; y < height/4; y++) { - for (x=0; x < width/4; x++) { - decompressBlockAlpha16bitC(src, *dstImage, width, height, 4*x, 4*y, dstChannels); - src += 8; - if (srcFormat == GL_COMPRESSED_RG11_EAC || srcFormat == GL_COMPRESSED_SIGNED_RG11_EAC) { - decompressBlockAlpha16bitC(src, *dstImage + dstChannelBytes, width, height, 4*x, 4*y, dstChannels); - src += 8; - } - } - } - } else { - for (y=0; y < height/4; y++) { - for (x=0; x < width/4; x++) { - // Decode alpha channel for RGBA - if (alphaFormat == AF_8BIT) { - decompressBlockAlphaC(src, *dstImage + 3, width, height, 4*x, 4*y, dstChannels); - src += 8; - } - // Decode color dstChannels - readBigEndian4byteWord(&block_part1, src); - src += 4; - readBigEndian4byteWord(&block_part2, src); - src += 4; - if (alphaFormat == AF_1BIT) - decompressBlockETC21BitAlphaC(block_part1, block_part2, *dstImage, 0, width, height, 4*x, 4*y, dstChannels); - else - decompressBlockETC2c(block_part1, block_part2, *dstImage, width, height, 4*x, 4*y, dstChannels); - } - } - } - - /* Ok, now write out the active pixels to the destination image. - * (But only if the active pixels differ from the total pixels) - */ - - if( !(height == activeHeight && width == activeWidth) ) { - int dstPixelBytes = dstChannels * dstChannelBytes; - int dstRowBytes = dstPixelBytes * width; - int activeRowBytes = activeWidth * dstPixelBytes; - GLubyte *newimg = (GLubyte*)malloc(dstPixelBytes * activeWidth * activeHeight); - unsigned int xx, yy; - int zz; - - if (!newimg) { - free(*dstImage); - return KTX_OUT_OF_MEMORY; - } - - /* Convert from total area to active area: */ - - for (yy = 0; yy < activeHeight; yy++) { - for (xx = 0; xx < activeWidth; xx++) { - for (zz = 0; zz < dstPixelBytes; zz++) { - newimg[ yy*activeRowBytes + xx*dstPixelBytes + zz ] = (*dstImage)[ yy*dstRowBytes + xx*dstPixelBytes + zz]; - } - } - } - - free(*dstImage); - *dstImage = newimg; - } - - return KTX_SUCCESS; -} - -#endif /* SUPPORT_SOFTWARE_ETC_UNPACK */ diff --git a/external/KTX-Software-master/lib/filestream.c b/external/KTX-Software-master/lib/filestream.c deleted file mode 100644 index dd6d09b..0000000 --- a/external/KTX-Software-master/lib/filestream.c +++ /dev/null @@ -1,324 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4 expandtab: */ - -/* - * ©2010-2018 The khronos Group, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @file - * @~English - * - * @brief Implementation of ktxStream for FILE. - * - * @author Maksim Kolesin, Under Development - * @author Georg Kolling, Imagination Technology - * @author Mark Callow, HI Corporation - */ - -#include <assert.h> -#include <errno.h> -#include <string.h> -/* I need these on Linux. Why? */ -#define __USE_LARGEFILE 1 // For declaration of ftello, etc. -#define __USE_POSIX 1 // For declaration of fileno. -#include <stdio.h> -#include <stdlib.h> -#include <sys/stat.h> - -#include "ktx.h" -#include "ktxint.h" -#include "filestream.h" - -#if defined(_MSC_VER) - #if defined(_WIN64) - #define ftello _ftelli64 - #define fseeko _fseeki64 - #else - #define ftello ftell - #define fseeko fseek - #endif - #define fileno _fileno -#endif - -#define KTX_FILE_STREAM_MAX (1 << (sizeof(ktx_off_t) - 1) - 1) - -/** - * @internal - * @~English - * @brief Read bytes from a ktxFileStream. - * - * @param [in] str pointer to the ktxStream from which to read. - * @param [out] dst pointer to a block of memory with a size - * of at least @p size bytes, converted to a void*. - * @param [in,out] count pointer to total count of bytes to be read. - * On completion set to number of bytes read. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @p dst is @c NULL or @p src is @c NULL. - * @exception KTX_FILE_UNEXPECTED_EOF not enough data to satisfy the request. - */ -static -KTX_error_code ktxFileStream_read(ktxStream* str, void* dst, const ktx_size_t count) -{ - ktx_size_t nread; - - if (!str || !dst) - return KTX_INVALID_VALUE; - - assert(str->type == eStreamTypeFile); - - if ((nread = fread(dst, 1, count, str->data.file)) != count) { - if (feof(str->data.file)) { - return KTX_FILE_UNEXPECTED_EOF; - } else - return KTX_FILE_READ_ERROR; - } - - return KTX_SUCCESS; -} - -/** - * @internal - * @~English - * @brief Skip bytes in a ktxFileStream. - * - * @param [in] str pointer to a ktxStream object. - * @param [in] count number of bytes to be skipped. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @p str is @c NULL or @p count is less than zero. - * @exception KTX_INVALID_OPERATION skipping @p count bytes would go beyond EOF. - * @exception KTX_FILE_UNEXPECTED_EOF not enough data to satisfy the request. - * @p count is set to the number of bytes - * skipped. - */ -static -KTX_error_code ktxFileStream_skip(ktxStream* str, const ktx_size_t count) -{ - ktx_size_t fileSize; - ktx_off_t pos, newpos; - - if (!str) - return KTX_INVALID_VALUE; - - assert(str->type == eStreamTypeFile); - - str->getsize(str, &fileSize); - str->getpos(str, &pos); - - newpos = pos + count; - /* First clause checks for overflow. */ - if (newpos < pos || pos + count > fileSize) - return KTX_FILE_UNEXPECTED_EOF; - - if (fseeko(str->data.file, count, SEEK_CUR) != 0) - return KTX_FILE_SEEK_ERROR; - - return KTX_SUCCESS; -} - -/** - * @internal - * @~English - * @brief Write bytes to a ktxFileStream. - * - * @param [in] str pointer to the ktxStream that is the destination of the - * write. - * @param [in] src pointer to the array of elements to be written, - * converted to a const void*. - * @param [in] size size in bytes of each element to be written. - * @param [in] count number of elements, each one with a @p size of size - * bytes. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @p str is @c NULL or @p src is @c NULL. - * @exception KTX_FILE_OVERFLOW the requested write would caused the file to - * exceed the maximum supported file size. - * @exception KTX_FILE_WRITE_ERROR a system error occurred while writing the - * file. - */ -static -KTX_error_code ktxFileStream_write(ktxStream* str, const void *src, - const ktx_size_t size, - const ktx_size_t count) -{ - if (!str || !src) - return KTX_INVALID_VALUE; - - assert(str->type == eStreamTypeFile); - - if (fwrite(src, size, count, str->data.file) != count) { - if (errno == EFBIG || errno == EOVERFLOW) - return KTX_FILE_OVERFLOW; - else - return KTX_FILE_WRITE_ERROR; - } - - return KTX_SUCCESS; -} - -/** - * @internal - * @~English - * @brief Get the current read/write position in a ktxFileStream. - * - * @param [in] str pointer to the ktxStream to query. - * @param [in,out] off pointer to variable to receive the offset value. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @p str or @p pos is @c NULL. - */ -static -KTX_error_code ktxFileStream_getpos(ktxStream* str, ktx_off_t* pos) -{ - if (!str || !pos) - return KTX_INVALID_VALUE; - - assert(str->type == eStreamTypeFile); - - /* The cast quiets an Xcode warning when building for "Generic iOS Device". - * For some reason, even when ARCHS is arm64, size_t is only a long. */ - *pos = (ktx_off_t)ftello(str->data.file); - - return KTX_SUCCESS; -} - -/** - * @internal - * @~English - * @brief Set the current read/write position in a ktxFileStream. - * - * Offset of 0 is the start of the file. This function operates - * like Linux > 3.1's @c lseek() when it is passed a @c whence - * of @c SEEK_DATA is it returns and error if the seek would - * go beyond the end of the file. - * - * @param [in] str pointer to the ktxStream whose r/w position is to be set. - * @param [in] off pointer to the offset value to set. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @p str is @c NULL. - * @exception KTX_INVALID_OPERATION @p pos is > the size of the file or an - * fseek error occurred. - */ -static -KTX_error_code ktxFileStream_setpos(ktxStream* str, ktx_off_t pos) -{ - ktx_size_t fileSize; - - if (!str) - return KTX_INVALID_VALUE; - - assert(str->type == eStreamTypeFile); - - str->getsize(str, &fileSize); - if (pos > fileSize) - return KTX_INVALID_OPERATION; - - if (fseeko(str->data.file, pos, SEEK_SET) < 0) - return KTX_FILE_SEEK_ERROR; - - return KTX_SUCCESS; -} - -/** - * @internal - * @~English - * @brief Get the size of a ktxFileStream in bytes. - * - * @param [in] str pointer to the ktxStream whose size is to be queried. - * @param [in,out] size pointer to a variable in which size will be written. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @p str or @p size is @c NULL. - * @exception KTX_FILE_WRITE_ERROR a system error occurred while getting the - * size. - */ -static -KTX_error_code ktxFileStream_getsize(ktxStream* str, ktx_size_t* size) -{ - struct stat statbuf; - - if (!str || !size) - return KTX_INVALID_VALUE; - - assert(str->type == eStreamTypeFile); - - if (fstat(fileno(str->data.file), &statbuf) < 0) - return KTX_FILE_READ_ERROR; - *size = (ktx_size_t)statbuf.st_size; /* See _getpos for why this cast. */ - - return KTX_SUCCESS; -} - -/** - * @internal - * @~English - * @brief Initialize a ktxFileStream. - * - * @param [in] str pointer to the ktxStream to initialize. - * @param [in] file pointer to the underlying FILE object. - * - * @return KTX_SUCCESS on success, KTX_INVALID_VALUE on error. - * - * @exception KTX_INVALID_VALUE @p stream is @c NULL or @p file is @c NULL. - */ -KTX_error_code ktxFileStream_construct(ktxStream* str, FILE* file, - ktx_bool_t closeFileOnDestruct) -{ - if (!str || !file) - return KTX_INVALID_VALUE; - - str->data.file = file; - str->type = eStreamTypeFile; - str->read = ktxFileStream_read; - str->skip = ktxFileStream_skip; - str->write = ktxFileStream_write; - str->getpos = ktxFileStream_getpos; - str->setpos = ktxFileStream_setpos; - str->getsize = ktxFileStream_getsize; - str->destruct = ktxFileStream_destruct; - str->closeOnDestruct = closeFileOnDestruct; - - return KTX_SUCCESS; -} - -/** - * @internal - * @~English - * @brief Destruct the stream, potentially closing the underlying FILE. - * - * This only closes the underyling FILE if the @c closeOnDestruct parameter to - * ktxFileStream_construct() was not @c KTX_FALSE. - * - * @param [in] str pointer to the ktxStream whose FILE is to potentially - * be closed. - */ -void -ktxFileStream_destruct(ktxStream* str) -{ - assert(str && str->type == eStreamTypeFile); - - if (str->closeOnDestruct) - fclose(str->data.file); - str->data.file = 0; -} diff --git a/external/KTX-Software-master/lib/filestream.h b/external/KTX-Software-master/lib/filestream.h deleted file mode 100644 index 3359cb2..0000000 --- a/external/KTX-Software-master/lib/filestream.h +++ /dev/null @@ -1,39 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4 expandtab: */ - -/* - * ©2010-2018 The khronos Group, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Author: Maksim Kolesin from original code - * by Mark Callow and Georg Kolling - */ - -#ifndef FILESTREAM_H -#define FILESTREAM_H - -#include "ktx.h" -#include "stream.h" - -/* - * ktxFileInit: Initialize a ktxStream to a ktxFileStream with a FILE object - */ -KTX_error_code ktxFileStream_construct(ktxStream* str, FILE* file, - ktx_bool_t closeFileOnDestruct); - -void ktxFileStream_destruct(ktxStream* str); - -#endif /* FILESTREAM_H */ diff --git a/external/KTX-Software-master/lib/gl_format.h b/external/KTX-Software-master/lib/gl_format.h deleted file mode 100644 index 2a78124..0000000 --- a/external/KTX-Software-master/lib/gl_format.h +++ /dev/null @@ -1,2456 +0,0 @@ -/* -================================================================================================ - -Description : OpenGL formats/types and properties. -Author : J.M.P. van Waveren -Date : 07/17/2016 -Language : C99 -Format : Real tabs with the tab size equal to 4 spaces. -Copyright : Copyright (c) 2016 Oculus VR, LLC. All Rights reserved. - - -LICENSE -======= - -Copyright (c) 2016 Oculus VR, LLC. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - - -DESCRIPTION -=========== - -This header stores the OpenGL formats/types and two simple routines -to derive the format/type from an internal format. These routines -are useful to verify the data in a KTX container files. The OpenGL -constants are generally useful to convert files like KTX and glTF -to different graphics APIs. - -This header stores the OpenGL formats/types that are used as parameters -to the following OpenGL functions: - -void glTexImage2D( GLenum target, GLint level, GLint internalFormat, - GLsizei width, GLsizei height, GLint border, - GLenum format, GLenum type, const GLvoid * data ); -void glTexImage3D( GLenum target, GLint level, GLint internalFormat, - GLsizei width, GLsizei height, GLsizei depth, GLint border, - GLenum format, GLenum type, const GLvoid * data ); -void glCompressedTexImage2D( GLenum target, GLint level, GLenum internalformat, - GLsizei width, GLsizei height, GLint border, - GLsizei imageSize, const GLvoid * data ); -void glCompressedTexImage3D( GLenum target, GLint level, GLenum internalformat, - GLsizei width, GLsizei height, GLsizei depth, GLint border, - GLsizei imageSize, const GLvoid * data ); -void glTexStorage2D( GLenum target, GLsizei levels, GLenum internalformat, - GLsizei width, GLsizei height ); -void glTexStorage3D( GLenum target, GLsizei levels, GLenum internalformat, - GLsizei width, GLsizei height, GLsizei depth ); -void glVertexAttribPointer( GLuint index, GLint size, GLenum type, GLboolean normalized, - GLsizei stride, const GLvoid * pointer); - - -IMPLEMENTATION -============== - -This file does not include OpenGL / OpenGL ES headers because: - - 1. Including OpenGL / OpenGL ES headers is platform dependent and - may require a separate installation of an OpenGL SDK. - 2. The OpenGL format/type constants are the same between extensions and core. - 3. The OpenGL format/type constants are the same between OpenGL and OpenGL ES. - 4. The OpenGL constants in this header are also used to derive Vulkan formats - from the OpenGL formats/types stored in files like KTX and glTF. These file - formats may use OpenGL formats/types that are not supported by the OpenGL - implementation on the platform but are supported by the Vulkan implementation. - - -ENTRY POINTS -============ - -static inline GLenum glGetFormatFromInternalFormat( const GLenum internalFormat ); -static inline GLenum glGetTypeFromInternalFormat( const GLenum internalFormat ); -static inline void glGetFormatSize( const GLenum internalFormat, GlFormatSize * pFormatSize ); -static inline unsigned int glGetTypeSizeFromType( const GLenum type ); - -MODIFICATIONS for use in libktx -=============================== - -2018.3.23 Added glGetTypeSizeFromType. Mark Callow, Edgewise Consulting. -2019.3.09 #if 0 around GL type declarations. Mark Callow, 〃 - -================================================================================================ -*/ - -#if !defined( GL_FORMAT_H ) -#define GL_FORMAT_H - -#include <assert.h> - -#if defined(_WIN32) -#define NOMINMAX -#ifndef __cplusplus -#undef inline -#define inline __inline -#endif // __cplusplus -#endif - -/* -=========================================================================== -Avoid warnings or even errors when using strict C99. "Redefinition of -(type) is a C11 feature." All includers in libktx also include ktx.h where -they are also defined. -=========================================================================== -*/ -#if 0 -typedef unsigned int GLenum; -typedef unsigned char GLboolean; -typedef unsigned int GLuint; -#endif - -#if !defined( GL_INVALID_VALUE ) -#define GL_INVALID_VALUE 0x0501 -#endif - -/* -================================================================================================================================ - -Format to glTexImage2D and glTexImage3D. - -================================================================================================================================ -*/ - -#if !defined( GL_RED ) -#define GL_RED 0x1903 // same as GL_RED_EXT -#endif -#if !defined( GL_GREEN ) -#define GL_GREEN 0x1904 // deprecated -#endif -#if !defined( GL_BLUE ) -#define GL_BLUE 0x1905 // deprecated -#endif -#if !defined( GL_ALPHA ) -#define GL_ALPHA 0x1906 // deprecated -#endif -#if !defined( GL_LUMINANCE ) -#define GL_LUMINANCE 0x1909 // deprecated -#endif -#if !defined( GL_SLUMINANCE ) -#define GL_SLUMINANCE 0x8C46 // deprecated, same as GL_SLUMINANCE_EXT -#endif -#if !defined( GL_LUMINANCE_ALPHA ) -#define GL_LUMINANCE_ALPHA 0x190A // deprecated -#endif -#if !defined( GL_SLUMINANCE_ALPHA ) -#define GL_SLUMINANCE_ALPHA 0x8C44 // deprecated, same as GL_SLUMINANCE_ALPHA_EXT -#endif -#if !defined( GL_INTENSITY ) -#define GL_INTENSITY 0x8049 // deprecated, same as GL_INTENSITY_EXT -#endif -#if !defined( GL_RG ) -#define GL_RG 0x8227 // same as GL_RG_EXT -#endif -#if !defined( GL_RGB ) -#define GL_RGB 0x1907 -#endif -#if !defined( GL_BGR ) -#define GL_BGR 0x80E0 // same as GL_BGR_EXT -#endif -#if !defined( GL_RGBA ) -#define GL_RGBA 0x1908 -#endif -#if !defined( GL_BGRA ) -#define GL_BGRA 0x80E1 // same as GL_BGRA_EXT -#endif -#if !defined( GL_RED_INTEGER ) -#define GL_RED_INTEGER 0x8D94 // same as GL_RED_INTEGER_EXT -#endif -#if !defined( GL_GREEN_INTEGER ) -#define GL_GREEN_INTEGER 0x8D95 // deprecated, same as GL_GREEN_INTEGER_EXT -#endif -#if !defined( GL_BLUE_INTEGER ) -#define GL_BLUE_INTEGER 0x8D96 // deprecated, same as GL_BLUE_INTEGER_EXT -#endif -#if !defined( GL_ALPHA_INTEGER ) -#define GL_ALPHA_INTEGER 0x8D97 // deprecated, same as GL_ALPHA_INTEGER_EXT -#endif -#if !defined( GL_LUMINANCE_INTEGER ) -#define GL_LUMINANCE_INTEGER 0x8D9C // deprecated, same as GL_LUMINANCE_INTEGER_EXT -#endif -#if !defined( GL_LUMINANCE_ALPHA_INTEGER ) -#define GL_LUMINANCE_ALPHA_INTEGER 0x8D9D // deprecated, same as GL_LUMINANCE_ALPHA_INTEGER_EXT -#endif -#if !defined( GL_RG_INTEGER ) -#define GL_RG_INTEGER 0x8228 // same as GL_RG_INTEGER_EXT -#endif -#if !defined( GL_RGB_INTEGER ) -#define GL_RGB_INTEGER 0x8D98 // same as GL_RGB_INTEGER_EXT -#endif -#if !defined( GL_BGR_INTEGER ) -#define GL_BGR_INTEGER 0x8D9A // same as GL_BGR_INTEGER_EXT -#endif -#if !defined( GL_RGBA_INTEGER ) -#define GL_RGBA_INTEGER 0x8D99 // same as GL_RGBA_INTEGER_EXT -#endif -#if !defined( GL_BGRA_INTEGER ) -#define GL_BGRA_INTEGER 0x8D9B // same as GL_BGRA_INTEGER_EXT -#endif -#if !defined( GL_COLOR_INDEX ) -#define GL_COLOR_INDEX 0x1900 // deprecated -#endif -#if !defined( GL_STENCIL_INDEX ) -#define GL_STENCIL_INDEX 0x1901 -#endif -#if !defined( GL_DEPTH_COMPONENT ) -#define GL_DEPTH_COMPONENT 0x1902 -#endif -#if !defined( GL_DEPTH_STENCIL ) -#define GL_DEPTH_STENCIL 0x84F9 // same as GL_DEPTH_STENCIL_NV and GL_DEPTH_STENCIL_EXT and GL_DEPTH_STENCIL_OES -#endif - -/* -================================================================================================================================ - -Type to glTexImage2D, glTexImage3D and glVertexAttribPointer. - -================================================================================================================================ -*/ - -#if !defined( GL_BYTE ) -#define GL_BYTE 0x1400 -#endif -#if !defined( GL_UNSIGNED_BYTE ) -#define GL_UNSIGNED_BYTE 0x1401 -#endif -#if !defined( GL_SHORT ) -#define GL_SHORT 0x1402 -#endif -#if !defined( GL_UNSIGNED_SHORT ) -#define GL_UNSIGNED_SHORT 0x1403 -#endif -#if !defined( GL_INT ) -#define GL_INT 0x1404 -#endif -#if !defined( GL_UNSIGNED_INT ) -#define GL_UNSIGNED_INT 0x1405 -#endif -#if !defined( GL_INT64 ) -#define GL_INT64 0x140E // same as GL_INT64_NV and GL_INT64_ARB -#endif -#if !defined( GL_UNSIGNED_INT64 ) -#define GL_UNSIGNED_INT64 0x140F // same as GL_UNSIGNED_INT64_NV and GL_UNSIGNED_INT64_ARB -#endif -#if !defined( GL_HALF_FLOAT ) -#define GL_HALF_FLOAT 0x140B // same as GL_HALF_FLOAT_NV and GL_HALF_FLOAT_ARB -#endif -#if !defined( GL_HALF_FLOAT_OES ) -#define GL_HALF_FLOAT_OES 0x8D61 // Note that this different from GL_HALF_FLOAT. -#endif -#if !defined( GL_FLOAT ) -#define GL_FLOAT 0x1406 -#endif -#if !defined( GL_DOUBLE ) -#define GL_DOUBLE 0x140A // same as GL_DOUBLE_EXT -#endif -#if !defined( GL_UNSIGNED_BYTE_3_3_2 ) -#define GL_UNSIGNED_BYTE_3_3_2 0x8032 // same as GL_UNSIGNED_BYTE_3_3_2_EXT -#endif -#if !defined( GL_UNSIGNED_BYTE_2_3_3_REV ) -#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 // same as GL_UNSIGNED_BYTE_2_3_3_REV_EXT -#endif -#if !defined( GL_UNSIGNED_SHORT_5_6_5 ) -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 // same as GL_UNSIGNED_SHORT_5_6_5_EXT -#endif -#if !defined( GL_UNSIGNED_SHORT_5_6_5_REV ) -#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 // same as GL_UNSIGNED_SHORT_5_6_5_REV_EXT -#endif -#if !defined( GL_UNSIGNED_SHORT_4_4_4_4 ) -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 // same as GL_UNSIGNED_SHORT_4_4_4_4_EXT -#endif -#if !defined( GL_UNSIGNED_SHORT_4_4_4_4_REV ) -#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 // same as GL_UNSIGNED_SHORT_4_4_4_4_REV_IMG and GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT -#endif -#if !defined( GL_UNSIGNED_SHORT_5_5_5_1 ) -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 // same as GL_UNSIGNED_SHORT_5_5_5_1_EXT -#endif -#if !defined( GL_UNSIGNED_SHORT_1_5_5_5_REV ) -#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 // same as GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT -#endif -#if !defined( GL_UNSIGNED_INT_8_8_8_8 ) -#define GL_UNSIGNED_INT_8_8_8_8 0x8035 // same as GL_UNSIGNED_INT_8_8_8_8_EXT -#endif -#if !defined( GL_UNSIGNED_INT_8_8_8_8_REV ) -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 // same as GL_UNSIGNED_INT_8_8_8_8_REV_EXT -#endif -#if !defined( GL_UNSIGNED_INT_10_10_10_2 ) -#define GL_UNSIGNED_INT_10_10_10_2 0x8036 // same as GL_UNSIGNED_INT_10_10_10_2_EXT -#endif -#if !defined( GL_UNSIGNED_INT_2_10_10_10_REV ) -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 // same as GL_UNSIGNED_INT_2_10_10_10_REV_EXT -#endif -#if !defined( GL_UNSIGNED_INT_10F_11F_11F_REV ) -#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B // same as GL_UNSIGNED_INT_10F_11F_11F_REV_EXT -#endif -#if !defined( GL_UNSIGNED_INT_5_9_9_9_REV ) -#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E // same as GL_UNSIGNED_INT_5_9_9_9_REV_EXT -#endif -#if !defined( GL_UNSIGNED_INT_24_8 ) -#define GL_UNSIGNED_INT_24_8 0x84FA // same as GL_UNSIGNED_INT_24_8_NV and GL_UNSIGNED_INT_24_8_EXT and GL_UNSIGNED_INT_24_8_OES -#endif -#if !defined( GL_FLOAT_32_UNSIGNED_INT_24_8_REV ) -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD // same as GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV and GL_FLOAT_32_UNSIGNED_INT_24_8_REV_ARB -#endif - -/* -================================================================================================================================ - -Internal format to glTexImage2D, glTexImage3D, glCompressedTexImage2D, glCompressedTexImage3D, glTexStorage2D, glTexStorage3D - -================================================================================================================================ -*/ - -// -// 8 bits per component -// - -#if !defined( GL_R8 ) -#define GL_R8 0x8229 // same as GL_R8_EXT -#endif -#if !defined( GL_RG8 ) -#define GL_RG8 0x822B // same as GL_RG8_EXT -#endif -#if !defined( GL_RGB8 ) -#define GL_RGB8 0x8051 // same as GL_RGB8_EXT and GL_RGB8_OES -#endif -#if !defined( GL_RGBA8 ) -#define GL_RGBA8 0x8058 // same as GL_RGBA8_EXT and GL_RGBA8_OES -#endif - -#if !defined( GL_R8_SNORM ) -#define GL_R8_SNORM 0x8F94 -#endif -#if !defined( GL_RG8_SNORM ) -#define GL_RG8_SNORM 0x8F95 -#endif -#if !defined( GL_RGB8_SNORM ) -#define GL_RGB8_SNORM 0x8F96 -#endif -#if !defined( GL_RGBA8_SNORM ) -#define GL_RGBA8_SNORM 0x8F97 -#endif - -#if !defined( GL_R8UI ) -#define GL_R8UI 0x8232 -#endif -#if !defined( GL_RG8UI ) -#define GL_RG8UI 0x8238 -#endif -#if !defined( GL_RGB8UI ) -#define GL_RGB8UI 0x8D7D // same as GL_RGB8UI_EXT -#endif -#if !defined( GL_RGBA8UI ) -#define GL_RGBA8UI 0x8D7C // same as GL_RGBA8UI_EXT -#endif - -#if !defined( GL_R8I ) -#define GL_R8I 0x8231 -#endif -#if !defined( GL_RG8I ) -#define GL_RG8I 0x8237 -#endif -#if !defined( GL_RGB8I ) -#define GL_RGB8I 0x8D8F // same as GL_RGB8I_EXT -#endif -#if !defined( GL_RGBA8I ) -#define GL_RGBA8I 0x8D8E // same as GL_RGBA8I_EXT -#endif - -#if !defined( GL_SR8 ) -#define GL_SR8 0x8FBD // same as GL_SR8_EXT -#endif -#if !defined( GL_SRG8 ) -#define GL_SRG8 0x8FBE // same as GL_SRG8_EXT -#endif -#if !defined( GL_SRGB8 ) -#define GL_SRGB8 0x8C41 // same as GL_SRGB8_EXT -#endif -#if !defined( GL_SRGB8_ALPHA8 ) -#define GL_SRGB8_ALPHA8 0x8C43 // same as GL_SRGB8_ALPHA8_EXT -#endif - -// -// 16 bits per component -// - -#if !defined( GL_R16 ) -#define GL_R16 0x822A // same as GL_R16_EXT -#endif -#if !defined( GL_RG16 ) -#define GL_RG16 0x822C // same as GL_RG16_EXT -#endif -#if !defined( GL_RGB16 ) -#define GL_RGB16 0x8054 // same as GL_RGB16_EXT -#endif -#if !defined( GL_RGBA16 ) -#define GL_RGBA16 0x805B // same as GL_RGBA16_EXT -#endif - -#if !defined( GL_R16_SNORM ) -#define GL_R16_SNORM 0x8F98 // same as GL_R16_SNORM_EXT -#endif -#if !defined( GL_RG16_SNORM ) -#define GL_RG16_SNORM 0x8F99 // same as GL_RG16_SNORM_EXT -#endif -#if !defined( GL_RGB16_SNORM ) -#define GL_RGB16_SNORM 0x8F9A // same as GL_RGB16_SNORM_EXT -#endif -#if !defined( GL_RGBA16_SNORM ) -#define GL_RGBA16_SNORM 0x8F9B // same as GL_RGBA16_SNORM_EXT -#endif - -#if !defined( GL_R16UI ) -#define GL_R16UI 0x8234 -#endif -#if !defined( GL_RG16UI ) -#define GL_RG16UI 0x823A -#endif -#if !defined( GL_RGB16UI ) -#define GL_RGB16UI 0x8D77 // same as GL_RGB16UI_EXT -#endif -#if !defined( GL_RGBA16UI ) -#define GL_RGBA16UI 0x8D76 // same as GL_RGBA16UI_EXT -#endif - -#if !defined( GL_R16I ) -#define GL_R16I 0x8233 -#endif -#if !defined( GL_RG16I ) -#define GL_RG16I 0x8239 -#endif -#if !defined( GL_RGB16I ) -#define GL_RGB16I 0x8D89 // same as GL_RGB16I_EXT -#endif -#if !defined( GL_RGBA16I ) -#define GL_RGBA16I 0x8D88 // same as GL_RGBA16I_EXT -#endif - -#if !defined( GL_R16F ) -#define GL_R16F 0x822D // same as GL_R16F_EXT -#endif -#if !defined( GL_RG16F ) -#define GL_RG16F 0x822F // same as GL_RG16F_EXT -#endif -#if !defined( GL_RGB16F ) -#define GL_RGB16F 0x881B // same as GL_RGB16F_EXT and GL_RGB16F_ARB -#endif -#if !defined( GL_RGBA16F ) -#define GL_RGBA16F 0x881A // sama as GL_RGBA16F_EXT and GL_RGBA16F_ARB -#endif - -// -// 32 bits per component -// - -#if !defined( GL_R32UI ) -#define GL_R32UI 0x8236 -#endif -#if !defined( GL_RG32UI ) -#define GL_RG32UI 0x823C -#endif -#if !defined( GL_RGB32UI ) -#define GL_RGB32UI 0x8D71 // same as GL_RGB32UI_EXT -#endif -#if !defined( GL_RGBA32UI ) -#define GL_RGBA32UI 0x8D70 // same as GL_RGBA32UI_EXT -#endif - -#if !defined( GL_R32I ) -#define GL_R32I 0x8235 -#endif -#if !defined( GL_RG32I ) -#define GL_RG32I 0x823B -#endif -#if !defined( GL_RGB32I ) -#define GL_RGB32I 0x8D83 // same as GL_RGB32I_EXT -#endif -#if !defined( GL_RGBA32I ) -#define GL_RGBA32I 0x8D82 // same as GL_RGBA32I_EXT -#endif - -#if !defined( GL_R32F ) -#define GL_R32F 0x822E // same as GL_R32F_EXT -#endif -#if !defined( GL_RG32F ) -#define GL_RG32F 0x8230 // same as GL_RG32F_EXT -#endif -#if !defined( GL_RGB32F ) -#define GL_RGB32F 0x8815 // same as GL_RGB32F_EXT and GL_RGB32F_ARB -#endif -#if !defined( GL_RGBA32F ) -#define GL_RGBA32F 0x8814 // same as GL_RGBA32F_EXT and GL_RGBA32F_ARB -#endif - -// -// Packed -// - -#if !defined( GL_R3_G3_B2 ) -#define GL_R3_G3_B2 0x2A10 -#endif -#if !defined( GL_RGB4 ) -#define GL_RGB4 0x804F // same as GL_RGB4_EXT -#endif -#if !defined( GL_RGB5 ) -#define GL_RGB5 0x8050 // same as GL_RGB5_EXT -#endif -#if !defined( GL_RGB565 ) -#define GL_RGB565 0x8D62 // same as GL_RGB565_EXT and GL_RGB565_OES -#endif -#if !defined( GL_RGB10 ) -#define GL_RGB10 0x8052 // same as GL_RGB10_EXT -#endif -#if !defined( GL_RGB12 ) -#define GL_RGB12 0x8053 // same as GL_RGB12_EXT -#endif -#if !defined( GL_RGBA2 ) -#define GL_RGBA2 0x8055 // same as GL_RGBA2_EXT -#endif -#if !defined( GL_RGBA4 ) -#define GL_RGBA4 0x8056 // same as GL_RGBA4_EXT and GL_RGBA4_OES -#endif -#if !defined( GL_RGBA12 ) -#define GL_RGBA12 0x805A // same as GL_RGBA12_EXT -#endif -#if !defined( GL_RGB5_A1 ) -#define GL_RGB5_A1 0x8057 // same as GL_RGB5_A1_EXT and GL_RGB5_A1_OES -#endif -#if !defined( GL_RGB10_A2 ) -#define GL_RGB10_A2 0x8059 // same as GL_RGB10_A2_EXT -#endif -#if !defined( GL_RGB10_A2UI ) -#define GL_RGB10_A2UI 0x906F -#endif -#if !defined( GL_R11F_G11F_B10F ) -#define GL_R11F_G11F_B10F 0x8C3A // same as GL_R11F_G11F_B10F_APPLE and GL_R11F_G11F_B10F_EXT -#endif -#if !defined( GL_RGB9_E5 ) -#define GL_RGB9_E5 0x8C3D // same as GL_RGB9_E5_APPLE and GL_RGB9_E5_EXT -#endif - -// -// Alpha -// - -#if !defined( GL_ALPHA4 ) -#define GL_ALPHA4 0x803B // deprecated, same as GL_ALPHA4_EXT -#endif -#if !defined( GL_ALPHA8 ) -#define GL_ALPHA8 0x803C // deprecated, same as GL_ALPHA8_EXT -#endif -#if !defined( GL_ALPHA8_SNORM ) -#define GL_ALPHA8_SNORM 0x9014 // deprecated -#endif -#if !defined( GL_ALPHA8UI_EXT ) -#define GL_ALPHA8UI_EXT 0x8D7E // deprecated -#endif -#if !defined( GL_ALPHA8I_EXT ) -#define GL_ALPHA8I_EXT 0x8D90 // deprecated -#endif -#if !defined( GL_ALPHA12 ) -#define GL_ALPHA12 0x803D // deprecated, same as GL_ALPHA12_EXT -#endif -#if !defined( GL_ALPHA16 ) -#define GL_ALPHA16 0x803E // deprecated, same as GL_ALPHA16_EXT -#endif -#if !defined( GL_ALPHA16_SNORM ) -#define GL_ALPHA16_SNORM 0x9018 // deprecated -#endif -#if !defined( GL_ALPHA16UI_EXT ) -#define GL_ALPHA16UI_EXT 0x8D78 // deprecated -#endif -#if !defined( GL_ALPHA16I_EXT ) -#define GL_ALPHA16I_EXT 0x8D8A // deprecated -#endif -#if !defined( GL_ALPHA16F_ARB ) -#define GL_ALPHA16F_ARB 0x881C // deprecated, same as GL_ALPHA_FLOAT16_APPLE and GL_ALPHA_FLOAT16_ATI -#endif -#if !defined( GL_ALPHA32UI_EXT ) -#define GL_ALPHA32UI_EXT 0x8D72 // deprecated -#endif -#if !defined( GL_ALPHA32I_EXT ) -#define GL_ALPHA32I_EXT 0x8D84 // deprecated -#endif -#if !defined( GL_ALPHA32F_ARB ) -#define GL_ALPHA32F_ARB 0x8816 // deprecated, same as GL_ALPHA_FLOAT32_APPLE and GL_ALPHA_FLOAT32_ATI -#endif - -// -// Luminance -// - -#if !defined( GL_LUMINANCE4 ) -#define GL_LUMINANCE4 0x803F // deprecated, same as GL_LUMINANCE4_EXT -#endif -#if !defined( GL_LUMINANCE8 ) -#define GL_LUMINANCE8 0x8040 // deprecated, same as GL_LUMINANCE8_EXT -#endif -#if !defined( GL_LUMINANCE8_SNORM ) -#define GL_LUMINANCE8_SNORM 0x9015 // deprecated -#endif -#if !defined( GL_SLUMINANCE8 ) -#define GL_SLUMINANCE8 0x8C47 // deprecated, same as GL_SLUMINANCE8_EXT -#endif -#if !defined( GL_LUMINANCE8UI_EXT ) -#define GL_LUMINANCE8UI_EXT 0x8D80 // deprecated -#endif -#if !defined( GL_LUMINANCE8I_EXT ) -#define GL_LUMINANCE8I_EXT 0x8D92 // deprecated -#endif -#if !defined( GL_LUMINANCE12 ) -#define GL_LUMINANCE12 0x8041 // deprecated, same as GL_LUMINANCE12_EXT -#endif -#if !defined( GL_LUMINANCE16 ) -#define GL_LUMINANCE16 0x8042 // deprecated, same as GL_LUMINANCE16_EXT -#endif -#if !defined( GL_LUMINANCE16_SNORM ) -#define GL_LUMINANCE16_SNORM 0x9019 // deprecated -#endif -#if !defined( GL_LUMINANCE16UI_EXT ) -#define GL_LUMINANCE16UI_EXT 0x8D7A // deprecated -#endif -#if !defined( GL_LUMINANCE16I_EXT ) -#define GL_LUMINANCE16I_EXT 0x8D8C // deprecated -#endif -#if !defined( GL_LUMINANCE16F_ARB ) -#define GL_LUMINANCE16F_ARB 0x881E // deprecated, same as GL_LUMINANCE_FLOAT16_APPLE and GL_LUMINANCE_FLOAT16_ATI -#endif -#if !defined( GL_LUMINANCE32UI_EXT ) -#define GL_LUMINANCE32UI_EXT 0x8D74 // deprecated -#endif -#if !defined( GL_LUMINANCE32I_EXT ) -#define GL_LUMINANCE32I_EXT 0x8D86 // deprecated -#endif -#if !defined( GL_LUMINANCE32F_ARB ) -#define GL_LUMINANCE32F_ARB 0x8818 // deprecated, same as GL_LUMINANCE_FLOAT32_APPLE and GL_LUMINANCE_FLOAT32_ATI -#endif - -// -// Luminance/Alpha -// - -#if !defined( GL_LUMINANCE4_ALPHA4 ) -#define GL_LUMINANCE4_ALPHA4 0x8043 // deprecated, same as GL_LUMINANCE4_ALPHA4_EXT -#endif -#if !defined( GL_LUMINANCE6_ALPHA2 ) -#define GL_LUMINANCE6_ALPHA2 0x8044 // deprecated, same as GL_LUMINANCE6_ALPHA2_EXT -#endif -#if !defined( GL_LUMINANCE8_ALPHA8 ) -#define GL_LUMINANCE8_ALPHA8 0x8045 // deprecated, same as GL_LUMINANCE8_ALPHA8_EXT -#endif -#if !defined( GL_LUMINANCE8_ALPHA8_SNORM ) -#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 // deprecated -#endif -#if !defined( GL_SLUMINANCE8_ALPHA8 ) -#define GL_SLUMINANCE8_ALPHA8 0x8C45 // deprecated, same as GL_SLUMINANCE8_ALPHA8_EXT -#endif -#if !defined( GL_LUMINANCE_ALPHA8UI_EXT ) -#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 // deprecated -#endif -#if !defined( GL_LUMINANCE_ALPHA8I_EXT ) -#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 // deprecated -#endif -#if !defined( GL_LUMINANCE12_ALPHA4 ) -#define GL_LUMINANCE12_ALPHA4 0x8046 // deprecated, same as GL_LUMINANCE12_ALPHA4_EXT -#endif -#if !defined( GL_LUMINANCE12_ALPHA12 ) -#define GL_LUMINANCE12_ALPHA12 0x8047 // deprecated, same as GL_LUMINANCE12_ALPHA12_EXT -#endif -#if !defined( GL_LUMINANCE16_ALPHA16 ) -#define GL_LUMINANCE16_ALPHA16 0x8048 // deprecated, same as GL_LUMINANCE16_ALPHA16_EXT -#endif -#if !defined( GL_LUMINANCE16_ALPHA16_SNORM ) -#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A // deprecated -#endif -#if !defined( GL_LUMINANCE_ALPHA16UI_EXT ) -#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B // deprecated -#endif -#if !defined( GL_LUMINANCE_ALPHA16I_EXT ) -#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D // deprecated -#endif -#if !defined( GL_LUMINANCE_ALPHA16F_ARB ) -#define GL_LUMINANCE_ALPHA16F_ARB 0x881F // deprecated, same as GL_LUMINANCE_ALPHA_FLOAT16_APPLE and GL_LUMINANCE_ALPHA_FLOAT16_ATI -#endif -#if !defined( GL_LUMINANCE_ALPHA32UI_EXT ) -#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 // deprecated -#endif -#if !defined( GL_LUMINANCE_ALPHA32I_EXT ) -#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 // deprecated -#endif -#if !defined( GL_LUMINANCE_ALPHA32F_ARB ) -#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 // deprecated, same as GL_LUMINANCE_ALPHA_FLOAT32_APPLE and GL_LUMINANCE_ALPHA_FLOAT32_ATI -#endif - -// -// Intensity -// - -#if !defined( GL_INTENSITY4 ) -#define GL_INTENSITY4 0x804A // deprecated, same as GL_INTENSITY4_EXT -#endif -#if !defined( GL_INTENSITY8 ) -#define GL_INTENSITY8 0x804B // deprecated, same as GL_INTENSITY8_EXT -#endif -#if !defined( GL_INTENSITY8_SNORM ) -#define GL_INTENSITY8_SNORM 0x9017 // deprecated -#endif -#if !defined( GL_INTENSITY8UI_EXT ) -#define GL_INTENSITY8UI_EXT 0x8D7F // deprecated -#endif -#if !defined( GL_INTENSITY8I_EXT ) -#define GL_INTENSITY8I_EXT 0x8D91 // deprecated -#endif -#if !defined( GL_INTENSITY12 ) -#define GL_INTENSITY12 0x804C // deprecated, same as GL_INTENSITY12_EXT -#endif -#if !defined( GL_INTENSITY16 ) -#define GL_INTENSITY16 0x804D // deprecated, same as GL_INTENSITY16_EXT -#endif -#if !defined( GL_INTENSITY16_SNORM ) -#define GL_INTENSITY16_SNORM 0x901B // deprecated -#endif -#if !defined( GL_INTENSITY16UI_EXT ) -#define GL_INTENSITY16UI_EXT 0x8D79 // deprecated -#endif -#if !defined( GL_INTENSITY16I_EXT ) -#define GL_INTENSITY16I_EXT 0x8D8B // deprecated -#endif -#if !defined( GL_INTENSITY16F_ARB ) -#define GL_INTENSITY16F_ARB 0x881D // deprecated, same as GL_INTENSITY_FLOAT16_APPLE and GL_INTENSITY_FLOAT16_ATI -#endif -#if !defined( GL_INTENSITY32UI_EXT ) -#define GL_INTENSITY32UI_EXT 0x8D73 // deprecated -#endif -#if !defined( GL_INTENSITY32I_EXT ) -#define GL_INTENSITY32I_EXT 0x8D85 // deprecated -#endif -#if !defined( GL_INTENSITY32F_ARB ) -#define GL_INTENSITY32F_ARB 0x8817 // deprecated, same as GL_INTENSITY_FLOAT32_APPLE and GL_INTENSITY_FLOAT32_ATI -#endif - -// -// Generic compression -// - -#if !defined( GL_COMPRESSED_RED ) -#define GL_COMPRESSED_RED 0x8225 -#endif -#if !defined( GL_COMPRESSED_ALPHA ) -#define GL_COMPRESSED_ALPHA 0x84E9 // deprecated, same as GL_COMPRESSED_ALPHA_ARB -#endif -#if !defined( GL_COMPRESSED_LUMINANCE ) -#define GL_COMPRESSED_LUMINANCE 0x84EA // deprecated, same as GL_COMPRESSED_LUMINANCE_ARB -#endif -#if !defined( GL_COMPRESSED_SLUMINANCE ) -#define GL_COMPRESSED_SLUMINANCE 0x8C4A // deprecated, same as GL_COMPRESSED_SLUMINANCE_EXT -#endif -#if !defined( GL_COMPRESSED_LUMINANCE_ALPHA ) -#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB // deprecated, same as GL_COMPRESSED_LUMINANCE_ALPHA_ARB -#endif -#if !defined( GL_COMPRESSED_SLUMINANCE_ALPHA ) -#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B // deprecated, same as GL_COMPRESSED_SLUMINANCE_ALPHA_EXT -#endif -#if !defined( GL_COMPRESSED_INTENSITY ) -#define GL_COMPRESSED_INTENSITY 0x84EC // deprecated, same as GL_COMPRESSED_INTENSITY_ARB -#endif -#if !defined( GL_COMPRESSED_RG ) -#define GL_COMPRESSED_RG 0x8226 -#endif -#if !defined( GL_COMPRESSED_RGB ) -#define GL_COMPRESSED_RGB 0x84ED // same as GL_COMPRESSED_RGB_ARB -#endif -#if !defined( GL_COMPRESSED_RGBA ) -#define GL_COMPRESSED_RGBA 0x84EE // same as GL_COMPRESSED_RGBA_ARB -#endif -#if !defined( GL_COMPRESSED_SRGB ) -#define GL_COMPRESSED_SRGB 0x8C48 // same as GL_COMPRESSED_SRGB_EXT -#endif -#if !defined( GL_COMPRESSED_SRGB_ALPHA ) -#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 // same as GL_COMPRESSED_SRGB_ALPHA_EXT -#endif - -// -// FXT1 -// - -#if !defined( GL_COMPRESSED_RGB_FXT1_3DFX ) -#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 // deprecated -#endif -#if !defined( GL_COMPRESSED_RGBA_FXT1_3DFX ) -#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 // deprecated -#endif - -// -// S3TC/DXT/BC -// - -#if !defined( GL_COMPRESSED_RGB_S3TC_DXT1_EXT ) -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#endif -#if !defined( GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ) -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#endif -#if !defined( GL_COMPRESSED_RGBA_S3TC_DXT3_EXT ) -#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 -#endif -#if !defined( GL_COMPRESSED_RGBA_S3TC_DXT5_EXT ) -#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 -#endif - -#if !defined( GL_COMPRESSED_SRGB_S3TC_DXT1_EXT ) -#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C -#endif -#if !defined( GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT ) -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D -#endif -#if !defined( GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT ) -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E -#endif -#if !defined( GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT ) -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F -#endif - -#if !defined( GL_COMPRESSED_LUMINANCE_LATC1_EXT ) -#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 -#endif -#if !defined( GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT ) -#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 -#endif -#if !defined( GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT ) -#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 -#endif -#if !defined( GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT ) -#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 -#endif - -#if !defined( GL_COMPRESSED_RED_RGTC1 ) -#define GL_COMPRESSED_RED_RGTC1 0x8DBB // same as GL_COMPRESSED_RED_RGTC1_EXT -#endif -#if !defined( GL_COMPRESSED_RG_RGTC2 ) -#define GL_COMPRESSED_RG_RGTC2 0x8DBD // same as GL_COMPRESSED_RG_RGTC2_EXT -#endif -#if !defined( GL_COMPRESSED_SIGNED_RED_RGTC1 ) -#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC // same as GL_COMPRESSED_SIGNED_RED_RGTC1_EXT -#endif -#if !defined( GL_COMPRESSED_SIGNED_RG_RGTC2 ) -#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE // same as GL_COMPRESSED_SIGNED_RG_RGTC2_EXT -#endif - -#if !defined( GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT ) -#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E // same as GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB -#endif -#if !defined( GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT ) -#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F // same as GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB -#endif -#if !defined( GL_COMPRESSED_RGBA_BPTC_UNORM ) -#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C // same as GL_COMPRESSED_RGBA_BPTC_UNORM_ARB -#endif -#if !defined( GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM ) -#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D // same as GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB -#endif - -// -// ETC -// - -#if !defined( GL_ETC1_RGB8_OES ) -#define GL_ETC1_RGB8_OES 0x8D64 -#endif - -#if !defined( GL_COMPRESSED_RGB8_ETC2 ) -#define GL_COMPRESSED_RGB8_ETC2 0x9274 -#endif -#if !defined( GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 ) -#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 -#endif -#if !defined( GL_COMPRESSED_RGBA8_ETC2_EAC ) -#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 -#endif - -#if !defined( GL_COMPRESSED_SRGB8_ETC2 ) -#define GL_COMPRESSED_SRGB8_ETC2 0x9275 -#endif -#if !defined( GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 ) -#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 -#endif -#if !defined( GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC ) -#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 -#endif - -#if !defined( GL_COMPRESSED_R11_EAC ) -#define GL_COMPRESSED_R11_EAC 0x9270 -#endif -#if !defined( GL_COMPRESSED_RG11_EAC ) -#define GL_COMPRESSED_RG11_EAC 0x9272 -#endif -#if !defined( GL_COMPRESSED_SIGNED_R11_EAC ) -#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 -#endif -#if !defined( GL_COMPRESSED_SIGNED_RG11_EAC ) -#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 -#endif - -// -// PVRTC -// - -#if !defined( GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG ) -#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01 -#define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 -#define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03 -#define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 -#endif -#if !defined( GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG ) -#define GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG 0x9137 -#define GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG 0x9138 -#endif -#if !defined( GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT ) -#define GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT 0x8A54 -#define GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT 0x8A55 -#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT 0x8A56 -#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT 0x8A57 -#endif -#if !defined( GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV2_IMG ) -#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV2_IMG 0x93F0 -#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV2_IMG 0x93F1 -#endif - -// -// ASTC -// - -#if !defined( GL_COMPRESSED_RGBA_ASTC_4x4_KHR ) -#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 -#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 -#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 -#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 -#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 -#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 -#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 -#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 -#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 -#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 -#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA -#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB -#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC -#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD -#endif - -#if !defined( GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR ) -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD -#endif - -#if !defined( GL_COMPRESSED_RGBA_ASTC_3x3x3_OES ) -#define GL_COMPRESSED_RGBA_ASTC_3x3x3_OES 0x93C0 -#define GL_COMPRESSED_RGBA_ASTC_4x3x3_OES 0x93C1 -#define GL_COMPRESSED_RGBA_ASTC_4x4x3_OES 0x93C2 -#define GL_COMPRESSED_RGBA_ASTC_4x4x4_OES 0x93C3 -#define GL_COMPRESSED_RGBA_ASTC_5x4x4_OES 0x93C4 -#define GL_COMPRESSED_RGBA_ASTC_5x5x4_OES 0x93C5 -#define GL_COMPRESSED_RGBA_ASTC_5x5x5_OES 0x93C6 -#define GL_COMPRESSED_RGBA_ASTC_6x5x5_OES 0x93C7 -#define GL_COMPRESSED_RGBA_ASTC_6x6x5_OES 0x93C8 -#define GL_COMPRESSED_RGBA_ASTC_6x6x6_OES 0x93C9 -#endif - -#if !defined( GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES ) -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES 0x93E0 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES 0x93E1 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES 0x93E2 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES 0x93E3 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES 0x93E4 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES 0x93E5 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES 0x93E6 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES 0x93E7 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES 0x93E8 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES 0x93E9 -#endif - -// -// ATC -// - -#if !defined( GL_ATC_RGB_AMD ) -#define GL_ATC_RGB_AMD 0x8C92 -#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93 -#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE -#endif - -// -// Palletized (combined palette) -// - -#if !defined( GL_PALETTE4_RGB8_OES ) -#define GL_PALETTE4_RGB8_OES 0x8B90 -#define GL_PALETTE4_RGBA8_OES 0x8B91 -#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 -#define GL_PALETTE4_RGBA4_OES 0x8B93 -#define GL_PALETTE4_RGB5_A1_OES 0x8B94 -#define GL_PALETTE8_RGB8_OES 0x8B95 -#define GL_PALETTE8_RGBA8_OES 0x8B96 -#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 -#define GL_PALETTE8_RGBA4_OES 0x8B98 -#define GL_PALETTE8_RGB5_A1_OES 0x8B99 -#endif - -// -// Palletized (separate palette) -// - -#if !defined( GL_COLOR_INDEX1_EXT ) -#define GL_COLOR_INDEX1_EXT 0x80E2 // deprecated -#define GL_COLOR_INDEX2_EXT 0x80E3 // deprecated -#define GL_COLOR_INDEX4_EXT 0x80E4 // deprecated -#define GL_COLOR_INDEX8_EXT 0x80E5 // deprecated -#define GL_COLOR_INDEX12_EXT 0x80E6 // deprecated -#define GL_COLOR_INDEX16_EXT 0x80E7 // deprecated -#endif - -// -// Depth/stencil -// - -#if !defined( GL_DEPTH_COMPONENT16 ) -#define GL_DEPTH_COMPONENT16 0x81A5 // same as GL_DEPTH_COMPONENT16_SGIX and GL_DEPTH_COMPONENT16_ARB -#endif -#if !defined( GL_DEPTH_COMPONENT24 ) -#define GL_DEPTH_COMPONENT24 0x81A6 // same as GL_DEPTH_COMPONENT24_SGIX and GL_DEPTH_COMPONENT24_ARB -#endif -#if !defined( GL_DEPTH_COMPONENT32 ) -#define GL_DEPTH_COMPONENT32 0x81A7 // same as GL_DEPTH_COMPONENT32_SGIX and GL_DEPTH_COMPONENT32_ARB and GL_DEPTH_COMPONENT32_OES -#endif -#if !defined( GL_DEPTH_COMPONENT32F ) -#define GL_DEPTH_COMPONENT32F 0x8CAC // same as GL_DEPTH_COMPONENT32F_ARB -#endif -#if !defined( GL_DEPTH_COMPONENT32F_NV ) -#define GL_DEPTH_COMPONENT32F_NV 0x8DAB // note that this is different from GL_DEPTH_COMPONENT32F -#endif -#if !defined( GL_STENCIL_INDEX1 ) -#define GL_STENCIL_INDEX1 0x8D46 // same as GL_STENCIL_INDEX1_EXT -#endif -#if !defined( GL_STENCIL_INDEX4 ) -#define GL_STENCIL_INDEX4 0x8D47 // same as GL_STENCIL_INDEX4_EXT -#endif -#if !defined( GL_STENCIL_INDEX8 ) -#define GL_STENCIL_INDEX8 0x8D48 // same as GL_STENCIL_INDEX8_EXT -#endif -#if !defined( GL_STENCIL_INDEX16 ) -#define GL_STENCIL_INDEX16 0x8D49 // same as GL_STENCIL_INDEX16_EXT -#endif -#if !defined( GL_DEPTH24_STENCIL8 ) -#define GL_DEPTH24_STENCIL8 0x88F0 // same as GL_DEPTH24_STENCIL8_EXT and GL_DEPTH24_STENCIL8_OES -#endif -#if !defined( GL_DEPTH32F_STENCIL8 ) -#define GL_DEPTH32F_STENCIL8 0x8CAD // same as GL_DEPTH32F_STENCIL8_ARB -#endif -#if !defined( GL_DEPTH32F_STENCIL8_NV ) -#define GL_DEPTH32F_STENCIL8_NV 0x8DAC // note that this is different from GL_DEPTH32F_STENCIL8 -#endif - -static inline GLenum glGetFormatFromInternalFormat( const GLenum internalFormat ) -{ - switch ( internalFormat ) - { - // - // 8 bits per component - // - case GL_R8: return GL_RED; // 1-component, 8-bit unsigned normalized - case GL_RG8: return GL_RG; // 2-component, 8-bit unsigned normalized - case GL_RGB8: return GL_RGB; // 3-component, 8-bit unsigned normalized - case GL_RGBA8: return GL_RGBA; // 4-component, 8-bit unsigned normalized - - case GL_R8_SNORM: return GL_RED; // 1-component, 8-bit signed normalized - case GL_RG8_SNORM: return GL_RG; // 2-component, 8-bit signed normalized - case GL_RGB8_SNORM: return GL_RGB; // 3-component, 8-bit signed normalized - case GL_RGBA8_SNORM: return GL_RGBA; // 4-component, 8-bit signed normalized - - case GL_R8UI: return GL_RED; // 1-component, 8-bit unsigned integer - case GL_RG8UI: return GL_RG; // 2-component, 8-bit unsigned integer - case GL_RGB8UI: return GL_RGB; // 3-component, 8-bit unsigned integer - case GL_RGBA8UI: return GL_RGBA; // 4-component, 8-bit unsigned integer - - case GL_R8I: return GL_RED; // 1-component, 8-bit signed integer - case GL_RG8I: return GL_RG; // 2-component, 8-bit signed integer - case GL_RGB8I: return GL_RGB; // 3-component, 8-bit signed integer - case GL_RGBA8I: return GL_RGBA; // 4-component, 8-bit signed integer - - case GL_SR8: return GL_RED; // 1-component, 8-bit sRGB - case GL_SRG8: return GL_RG; // 2-component, 8-bit sRGB - case GL_SRGB8: return GL_RGB; // 3-component, 8-bit sRGB - case GL_SRGB8_ALPHA8: return GL_RGBA; // 4-component, 8-bit sRGB - - // - // 16 bits per component - // - case GL_R16: return GL_RED; // 1-component, 16-bit unsigned normalized - case GL_RG16: return GL_RG; // 2-component, 16-bit unsigned normalized - case GL_RGB16: return GL_RGB; // 3-component, 16-bit unsigned normalized - case GL_RGBA16: return GL_RGBA; // 4-component, 16-bit unsigned normalized - - case GL_R16_SNORM: return GL_RED; // 1-component, 16-bit signed normalized - case GL_RG16_SNORM: return GL_RG; // 2-component, 16-bit signed normalized - case GL_RGB16_SNORM: return GL_RGB; // 3-component, 16-bit signed normalized - case GL_RGBA16_SNORM: return GL_RGBA; // 4-component, 16-bit signed normalized - - case GL_R16UI: return GL_RED; // 1-component, 16-bit unsigned integer - case GL_RG16UI: return GL_RG; // 2-component, 16-bit unsigned integer - case GL_RGB16UI: return GL_RGB; // 3-component, 16-bit unsigned integer - case GL_RGBA16UI: return GL_RGBA; // 4-component, 16-bit unsigned integer - - case GL_R16I: return GL_RED; // 1-component, 16-bit signed integer - case GL_RG16I: return GL_RG; // 2-component, 16-bit signed integer - case GL_RGB16I: return GL_RGB; // 3-component, 16-bit signed integer - case GL_RGBA16I: return GL_RGBA; // 4-component, 16-bit signed integer - - case GL_R16F: return GL_RED; // 1-component, 16-bit floating-point - case GL_RG16F: return GL_RG; // 2-component, 16-bit floating-point - case GL_RGB16F: return GL_RGB; // 3-component, 16-bit floating-point - case GL_RGBA16F: return GL_RGBA; // 4-component, 16-bit floating-point - - // - // 32 bits per component - // - case GL_R32UI: return GL_RED; // 1-component, 32-bit unsigned integer - case GL_RG32UI: return GL_RG; // 2-component, 32-bit unsigned integer - case GL_RGB32UI: return GL_RGB; // 3-component, 32-bit unsigned integer - case GL_RGBA32UI: return GL_RGBA; // 4-component, 32-bit unsigned integer - - case GL_R32I: return GL_RED; // 1-component, 32-bit signed integer - case GL_RG32I: return GL_RG; // 2-component, 32-bit signed integer - case GL_RGB32I: return GL_RGB; // 3-component, 32-bit signed integer - case GL_RGBA32I: return GL_RGBA; // 4-component, 32-bit signed integer - - case GL_R32F: return GL_RED; // 1-component, 32-bit floating-point - case GL_RG32F: return GL_RG; // 2-component, 32-bit floating-point - case GL_RGB32F: return GL_RGB; // 3-component, 32-bit floating-point - case GL_RGBA32F: return GL_RGBA; // 4-component, 32-bit floating-point - - // - // Packed - // - case GL_R3_G3_B2: return GL_RGB; // 3-component 3:3:2, unsigned normalized - case GL_RGB4: return GL_RGB; // 3-component 4:4:4, unsigned normalized - case GL_RGB5: return GL_RGB; // 3-component 5:5:5, unsigned normalized - case GL_RGB565: return GL_RGB; // 3-component 5:6:5, unsigned normalized - case GL_RGB10: return GL_RGB; // 3-component 10:10:10, unsigned normalized - case GL_RGB12: return GL_RGB; // 3-component 12:12:12, unsigned normalized - case GL_RGBA2: return GL_RGBA; // 4-component 2:2:2:2, unsigned normalized - case GL_RGBA4: return GL_RGBA; // 4-component 4:4:4:4, unsigned normalized - case GL_RGBA12: return GL_RGBA; // 4-component 12:12:12:12, unsigned normalized - case GL_RGB5_A1: return GL_RGBA; // 4-component 5:5:5:1, unsigned normalized - case GL_RGB10_A2: return GL_RGBA; // 4-component 10:10:10:2, unsigned normalized - case GL_RGB10_A2UI: return GL_RGBA; // 4-component 10:10:10:2, unsigned integer - case GL_R11F_G11F_B10F: return GL_RGB; // 3-component 11:11:10, floating-point - case GL_RGB9_E5: return GL_RGB; // 3-component/exp 9:9:9/5, floating-point - - // - // S3TC/DXT/BC - // - - case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return GL_RGB; // line through 3D space, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return GL_RGBA; // line through 3D space plus 1-bit alpha, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: return GL_RGBA; // line through 3D space plus line through 1D space, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: return GL_RGBA; // line through 3D space plus 4-bit alpha, 4x4 blocks, unsigned normalized - - case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: return GL_RGB; // line through 3D space, 4x4 blocks, sRGB - case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: return GL_RGBA; // line through 3D space plus 1-bit alpha, 4x4 blocks, sRGB - case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: return GL_RGBA; // line through 3D space plus line through 1D space, 4x4 blocks, sRGB - case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: return GL_RGBA; // line through 3D space plus 4-bit alpha, 4x4 blocks, sRGB - - case GL_COMPRESSED_LUMINANCE_LATC1_EXT: return GL_RED; // line through 1D space, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT: return GL_RG; // two lines through 1D space, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT: return GL_RED; // line through 1D space, 4x4 blocks, signed normalized - case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT: return GL_RG; // two lines through 1D space, 4x4 blocks, signed normalized - - case GL_COMPRESSED_RED_RGTC1: return GL_RED; // line through 1D space, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RG_RGTC2: return GL_RG; // two lines through 1D space, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SIGNED_RED_RGTC1: return GL_RED; // line through 1D space, 4x4 blocks, signed normalized - case GL_COMPRESSED_SIGNED_RG_RGTC2: return GL_RG; // two lines through 1D space, 4x4 blocks, signed normalized - - case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT: return GL_RGB; // 3-component, 4x4 blocks, unsigned floating-point - case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT: return GL_RGB; // 3-component, 4x4 blocks, signed floating-point - case GL_COMPRESSED_RGBA_BPTC_UNORM: return GL_RGBA; // 4-component, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM: return GL_RGBA; // 4-component, 4x4 blocks, sRGB - - // - // ETC - // - case GL_ETC1_RGB8_OES: return GL_RGB; // 3-component ETC1, 4x4 blocks, unsigned normalized - - case GL_COMPRESSED_RGB8_ETC2: return GL_RGB; // 3-component ETC2, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: return GL_RGBA; // 4-component ETC2 with 1-bit alpha, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA8_ETC2_EAC: return GL_RGBA; // 4-component ETC2, 4x4 blocks, unsigned normalized - - case GL_COMPRESSED_SRGB8_ETC2: return GL_RGB; // 3-component ETC2, 4x4 blocks, sRGB - case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: return GL_RGBA; // 4-component ETC2 with 1-bit alpha, 4x4 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: return GL_RGBA; // 4-component ETC2, 4x4 blocks, sRGB - - case GL_COMPRESSED_R11_EAC: return GL_RED; // 1-component ETC, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RG11_EAC: return GL_RG; // 2-component ETC, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SIGNED_R11_EAC: return GL_RED; // 1-component ETC, 4x4 blocks, signed normalized - case GL_COMPRESSED_SIGNED_RG11_EAC: return GL_RG; // 2-component ETC, 4x4 blocks, signed normalized - - // - // PVRTC - // - case GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG: return GL_RGB; // 3-component PVRTC, 16x8 blocks, unsigned normalized - case GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG: return GL_RGB; // 3-component PVRTC, 8x8 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: return GL_RGBA; // 4-component PVRTC, 16x8 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: return GL_RGBA; // 4-component PVRTC, 8x8 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG: return GL_RGBA; // 4-component PVRTC, 8x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG: return GL_RGBA; // 4-component PVRTC, 4x4 blocks, unsigned normalized - - case GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT: return GL_RGB; // 3-component PVRTC, 16x8 blocks, sRGB - case GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT: return GL_RGB; // 3-component PVRTC, 8x8 blocks, sRGB - case GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT: return GL_RGBA; // 4-component PVRTC, 16x8 blocks, sRGB - case GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT: return GL_RGBA; // 4-component PVRTC, 8x8 blocks, sRGB - case GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV2_IMG: return GL_RGBA; // 4-component PVRTC, 8x4 blocks, sRGB - case GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV2_IMG: return GL_RGBA; // 4-component PVRTC, 4x4 blocks, sRGB - - // - // ASTC - // - case GL_COMPRESSED_RGBA_ASTC_4x4_KHR: return GL_RGBA; // 4-component ASTC, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_5x4_KHR: return GL_RGBA; // 4-component ASTC, 5x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_5x5_KHR: return GL_RGBA; // 4-component ASTC, 5x5 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_6x5_KHR: return GL_RGBA; // 4-component ASTC, 6x5 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_6x6_KHR: return GL_RGBA; // 4-component ASTC, 6x6 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_8x5_KHR: return GL_RGBA; // 4-component ASTC, 8x5 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_8x6_KHR: return GL_RGBA; // 4-component ASTC, 8x6 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_8x8_KHR: return GL_RGBA; // 4-component ASTC, 8x8 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_10x5_KHR: return GL_RGBA; // 4-component ASTC, 10x5 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_10x6_KHR: return GL_RGBA; // 4-component ASTC, 10x6 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_10x8_KHR: return GL_RGBA; // 4-component ASTC, 10x8 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_10x10_KHR: return GL_RGBA; // 4-component ASTC, 10x10 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_12x10_KHR: return GL_RGBA; // 4-component ASTC, 12x10 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_12x12_KHR: return GL_RGBA; // 4-component ASTC, 12x12 blocks, unsigned normalized - - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: return GL_RGBA; // 4-component ASTC, 4x4 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: return GL_RGBA; // 4-component ASTC, 5x4 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: return GL_RGBA; // 4-component ASTC, 5x5 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: return GL_RGBA; // 4-component ASTC, 6x5 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: return GL_RGBA; // 4-component ASTC, 6x6 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: return GL_RGBA; // 4-component ASTC, 8x5 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: return GL_RGBA; // 4-component ASTC, 8x6 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: return GL_RGBA; // 4-component ASTC, 8x8 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: return GL_RGBA; // 4-component ASTC, 10x5 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: return GL_RGBA; // 4-component ASTC, 10x6 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: return GL_RGBA; // 4-component ASTC, 10x8 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: return GL_RGBA; // 4-component ASTC, 10x10 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: return GL_RGBA; // 4-component ASTC, 12x10 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: return GL_RGBA; // 4-component ASTC, 12x12 blocks, sRGB - - case GL_COMPRESSED_RGBA_ASTC_3x3x3_OES: return GL_RGBA; // 4-component ASTC, 3x3x3 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_4x3x3_OES: return GL_RGBA; // 4-component ASTC, 4x3x3 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_4x4x3_OES: return GL_RGBA; // 4-component ASTC, 4x4x3 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_4x4x4_OES: return GL_RGBA; // 4-component ASTC, 4x4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_5x4x4_OES: return GL_RGBA; // 4-component ASTC, 5x4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_5x5x4_OES: return GL_RGBA; // 4-component ASTC, 5x5x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_5x5x5_OES: return GL_RGBA; // 4-component ASTC, 5x5x5 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_6x5x5_OES: return GL_RGBA; // 4-component ASTC, 6x5x5 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_6x6x5_OES: return GL_RGBA; // 4-component ASTC, 6x6x5 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_6x6x6_OES: return GL_RGBA; // 4-component ASTC, 6x6x6 blocks, unsigned normalized - - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES: return GL_RGBA; // 4-component ASTC, 3x3x3 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES: return GL_RGBA; // 4-component ASTC, 4x3x3 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES: return GL_RGBA; // 4-component ASTC, 4x4x3 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES: return GL_RGBA; // 4-component ASTC, 4x4x4 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES: return GL_RGBA; // 4-component ASTC, 5x4x4 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES: return GL_RGBA; // 4-component ASTC, 5x5x4 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES: return GL_RGBA; // 4-component ASTC, 5x5x5 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES: return GL_RGBA; // 4-component ASTC, 6x5x5 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES: return GL_RGBA; // 4-component ASTC, 6x6x5 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES: return GL_RGBA; // 4-component ASTC, 6x6x6 blocks, sRGB - - // - // ATC - // - case GL_ATC_RGB_AMD: return GL_RGB; // 3-component, 4x4 blocks, unsigned normalized - case GL_ATC_RGBA_EXPLICIT_ALPHA_AMD: return GL_RGBA; // 4-component, 4x4 blocks, unsigned normalized - case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD: return GL_RGBA; // 4-component, 4x4 blocks, unsigned normalized - - // - // Palletized - // - case GL_PALETTE4_RGB8_OES: return GL_RGB; // 3-component 8:8:8, 4-bit palette, unsigned normalized - case GL_PALETTE4_RGBA8_OES: return GL_RGBA; // 4-component 8:8:8:8, 4-bit palette, unsigned normalized - case GL_PALETTE4_R5_G6_B5_OES: return GL_RGB; // 3-component 5:6:5, 4-bit palette, unsigned normalized - case GL_PALETTE4_RGBA4_OES: return GL_RGBA; // 4-component 4:4:4:4, 4-bit palette, unsigned normalized - case GL_PALETTE4_RGB5_A1_OES: return GL_RGBA; // 4-component 5:5:5:1, 4-bit palette, unsigned normalized - case GL_PALETTE8_RGB8_OES: return GL_RGB; // 3-component 8:8:8, 8-bit palette, unsigned normalized - case GL_PALETTE8_RGBA8_OES: return GL_RGBA; // 4-component 8:8:8:8, 8-bit palette, unsigned normalized - case GL_PALETTE8_R5_G6_B5_OES: return GL_RGB; // 3-component 5:6:5, 8-bit palette, unsigned normalized - case GL_PALETTE8_RGBA4_OES: return GL_RGBA; // 4-component 4:4:4:4, 8-bit palette, unsigned normalized - case GL_PALETTE8_RGB5_A1_OES: return GL_RGBA; // 4-component 5:5:5:1, 8-bit palette, unsigned normalized - - // - // Depth/stencil - // - case GL_DEPTH_COMPONENT16: return GL_DEPTH_COMPONENT; - case GL_DEPTH_COMPONENT24: return GL_DEPTH_COMPONENT; - case GL_DEPTH_COMPONENT32: return GL_DEPTH_COMPONENT; - case GL_DEPTH_COMPONENT32F: return GL_DEPTH_COMPONENT; - case GL_DEPTH_COMPONENT32F_NV: return GL_DEPTH_COMPONENT; - case GL_STENCIL_INDEX1: return GL_STENCIL_INDEX; - case GL_STENCIL_INDEX4: return GL_STENCIL_INDEX; - case GL_STENCIL_INDEX8: return GL_STENCIL_INDEX; - case GL_STENCIL_INDEX16: return GL_STENCIL_INDEX; - case GL_DEPTH24_STENCIL8: return GL_DEPTH_STENCIL; - case GL_DEPTH32F_STENCIL8: return GL_DEPTH_STENCIL; - case GL_DEPTH32F_STENCIL8_NV: return GL_DEPTH_STENCIL; - - default: return GL_INVALID_VALUE; - } -} - -static inline GLenum glGetTypeFromInternalFormat( const GLenum internalFormat ) -{ - switch ( internalFormat ) - { - // - // 8 bits per component - // - case GL_R8: return GL_UNSIGNED_BYTE; // 1-component, 8-bit unsigned normalized - case GL_RG8: return GL_UNSIGNED_BYTE; // 2-component, 8-bit unsigned normalized - case GL_RGB8: return GL_UNSIGNED_BYTE; // 3-component, 8-bit unsigned normalized - case GL_RGBA8: return GL_UNSIGNED_BYTE; // 4-component, 8-bit unsigned normalized - - case GL_R8_SNORM: return GL_BYTE; // 1-component, 8-bit signed normalized - case GL_RG8_SNORM: return GL_BYTE; // 2-component, 8-bit signed normalized - case GL_RGB8_SNORM: return GL_BYTE; // 3-component, 8-bit signed normalized - case GL_RGBA8_SNORM: return GL_BYTE; // 4-component, 8-bit signed normalized - - case GL_R8UI: return GL_UNSIGNED_BYTE; // 1-component, 8-bit unsigned integer - case GL_RG8UI: return GL_UNSIGNED_BYTE; // 2-component, 8-bit unsigned integer - case GL_RGB8UI: return GL_UNSIGNED_BYTE; // 3-component, 8-bit unsigned integer - case GL_RGBA8UI: return GL_UNSIGNED_BYTE; // 4-component, 8-bit unsigned integer - - case GL_R8I: return GL_BYTE; // 1-component, 8-bit signed integer - case GL_RG8I: return GL_BYTE; // 2-component, 8-bit signed integer - case GL_RGB8I: return GL_BYTE; // 3-component, 8-bit signed integer - case GL_RGBA8I: return GL_BYTE; // 4-component, 8-bit signed integer - - case GL_SR8: return GL_UNSIGNED_BYTE; // 1-component, 8-bit sRGB - case GL_SRG8: return GL_UNSIGNED_BYTE; // 2-component, 8-bit sRGB - case GL_SRGB8: return GL_UNSIGNED_BYTE; // 3-component, 8-bit sRGB - case GL_SRGB8_ALPHA8: return GL_UNSIGNED_BYTE; // 4-component, 8-bit sRGB - - // - // 16 bits per component - // - case GL_R16: return GL_UNSIGNED_SHORT; // 1-component, 16-bit unsigned normalized - case GL_RG16: return GL_UNSIGNED_SHORT; // 2-component, 16-bit unsigned normalized - case GL_RGB16: return GL_UNSIGNED_SHORT; // 3-component, 16-bit unsigned normalized - case GL_RGBA16: return GL_UNSIGNED_SHORT; // 4-component, 16-bit unsigned normalized - - case GL_R16_SNORM: return GL_SHORT; // 1-component, 16-bit signed normalized - case GL_RG16_SNORM: return GL_SHORT; // 2-component, 16-bit signed normalized - case GL_RGB16_SNORM: return GL_SHORT; // 3-component, 16-bit signed normalized - case GL_RGBA16_SNORM: return GL_SHORT; // 4-component, 16-bit signed normalized - - case GL_R16UI: return GL_UNSIGNED_SHORT; // 1-component, 16-bit unsigned integer - case GL_RG16UI: return GL_UNSIGNED_SHORT; // 2-component, 16-bit unsigned integer - case GL_RGB16UI: return GL_UNSIGNED_SHORT; // 3-component, 16-bit unsigned integer - case GL_RGBA16UI: return GL_UNSIGNED_SHORT; // 4-component, 16-bit unsigned integer - - case GL_R16I: return GL_SHORT; // 1-component, 16-bit signed integer - case GL_RG16I: return GL_SHORT; // 2-component, 16-bit signed integer - case GL_RGB16I: return GL_SHORT; // 3-component, 16-bit signed integer - case GL_RGBA16I: return GL_SHORT; // 4-component, 16-bit signed integer - - case GL_R16F: return GL_HALF_FLOAT; // 1-component, 16-bit floating-point - case GL_RG16F: return GL_HALF_FLOAT; // 2-component, 16-bit floating-point - case GL_RGB16F: return GL_HALF_FLOAT; // 3-component, 16-bit floating-point - case GL_RGBA16F: return GL_HALF_FLOAT; // 4-component, 16-bit floating-point - - // - // 32 bits per component - // - case GL_R32UI: return GL_UNSIGNED_INT; // 1-component, 32-bit unsigned integer - case GL_RG32UI: return GL_UNSIGNED_INT; // 2-component, 32-bit unsigned integer - case GL_RGB32UI: return GL_UNSIGNED_INT; // 3-component, 32-bit unsigned integer - case GL_RGBA32UI: return GL_UNSIGNED_INT; // 4-component, 32-bit unsigned integer - - case GL_R32I: return GL_INT; // 1-component, 32-bit signed integer - case GL_RG32I: return GL_INT; // 2-component, 32-bit signed integer - case GL_RGB32I: return GL_INT; // 3-component, 32-bit signed integer - case GL_RGBA32I: return GL_INT; // 4-component, 32-bit signed integer - - case GL_R32F: return GL_FLOAT; // 1-component, 32-bit floating-point - case GL_RG32F: return GL_FLOAT; // 2-component, 32-bit floating-point - case GL_RGB32F: return GL_FLOAT; // 3-component, 32-bit floating-point - case GL_RGBA32F: return GL_FLOAT; // 4-component, 32-bit floating-point - - // - // Packed - // - case GL_R3_G3_B2: return GL_UNSIGNED_BYTE_2_3_3_REV; // 3-component 3:3:2, unsigned normalized - case GL_RGB4: return GL_UNSIGNED_SHORT_4_4_4_4; // 3-component 4:4:4, unsigned normalized - case GL_RGB5: return GL_UNSIGNED_SHORT_5_5_5_1; // 3-component 5:5:5, unsigned normalized - case GL_RGB565: return GL_UNSIGNED_SHORT_5_6_5; // 3-component 5:6:5, unsigned normalized - case GL_RGB10: return GL_UNSIGNED_INT_10_10_10_2; // 3-component 10:10:10, unsigned normalized - case GL_RGB12: return GL_UNSIGNED_SHORT; // 3-component 12:12:12, unsigned normalized - case GL_RGBA2: return GL_UNSIGNED_BYTE; // 4-component 2:2:2:2, unsigned normalized - case GL_RGBA4: return GL_UNSIGNED_SHORT_4_4_4_4; // 4-component 4:4:4:4, unsigned normalized - case GL_RGBA12: return GL_UNSIGNED_SHORT; // 4-component 12:12:12:12, unsigned normalized - case GL_RGB5_A1: return GL_UNSIGNED_SHORT_5_5_5_1; // 4-component 5:5:5:1, unsigned normalized - case GL_RGB10_A2: return GL_UNSIGNED_INT_2_10_10_10_REV; // 4-component 10:10:10:2, unsigned normalized - case GL_RGB10_A2UI: return GL_UNSIGNED_INT_2_10_10_10_REV; // 4-component 10:10:10:2, unsigned integer - case GL_R11F_G11F_B10F: return GL_UNSIGNED_INT_10F_11F_11F_REV; // 3-component 11:11:10, floating-point - case GL_RGB9_E5: return GL_UNSIGNED_INT_5_9_9_9_REV; // 3-component/exp 9:9:9/5, floating-point - - // - // S3TC/DXT/BC - // - - case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return GL_UNSIGNED_BYTE; // line through 3D space, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return GL_UNSIGNED_BYTE; // line through 3D space plus 1-bit alpha, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: return GL_UNSIGNED_BYTE; // line through 3D space plus line through 1D space, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: return GL_UNSIGNED_BYTE; // line through 3D space plus 4-bit alpha, 4x4 blocks, unsigned normalized - - case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: return GL_UNSIGNED_BYTE; // line through 3D space, 4x4 blocks, sRGB - case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: return GL_UNSIGNED_BYTE; // line through 3D space plus 1-bit alpha, 4x4 blocks, sRGB - case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: return GL_UNSIGNED_BYTE; // line through 3D space plus line through 1D space, 4x4 blocks, sRGB - case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: return GL_UNSIGNED_BYTE; // line through 3D space plus 4-bit alpha, 4x4 blocks, sRGB - - case GL_COMPRESSED_LUMINANCE_LATC1_EXT: return GL_UNSIGNED_BYTE; // line through 1D space, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT: return GL_UNSIGNED_BYTE; // two lines through 1D space, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT: return GL_UNSIGNED_BYTE; // line through 1D space, 4x4 blocks, signed normalized - case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT: return GL_UNSIGNED_BYTE; // two lines through 1D space, 4x4 blocks, signed normalized - - case GL_COMPRESSED_RED_RGTC1: return GL_UNSIGNED_BYTE; // line through 1D space, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RG_RGTC2: return GL_UNSIGNED_BYTE; // two lines through 1D space, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SIGNED_RED_RGTC1: return GL_UNSIGNED_BYTE; // line through 1D space, 4x4 blocks, signed normalized - case GL_COMPRESSED_SIGNED_RG_RGTC2: return GL_UNSIGNED_BYTE; // two lines through 1D space, 4x4 blocks, signed normalized - - case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT: return GL_FLOAT; // 3-component, 4x4 blocks, unsigned floating-point - case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT: return GL_FLOAT; // 3-component, 4x4 blocks, signed floating-point - case GL_COMPRESSED_RGBA_BPTC_UNORM: return GL_UNSIGNED_BYTE; // 4-component, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM: return GL_UNSIGNED_BYTE; // 4-component, 4x4 blocks, sRGB - - // - // ETC - // - case GL_ETC1_RGB8_OES: return GL_UNSIGNED_BYTE; // 3-component ETC1, 4x4 blocks, unsigned normalized" ), - - case GL_COMPRESSED_RGB8_ETC2: return GL_UNSIGNED_BYTE; // 3-component ETC2, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: return GL_UNSIGNED_BYTE; // 4-component ETC2 with 1-bit alpha, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA8_ETC2_EAC: return GL_UNSIGNED_BYTE; // 4-component ETC2, 4x4 blocks, unsigned normalized - - case GL_COMPRESSED_SRGB8_ETC2: return GL_UNSIGNED_BYTE; // 3-component ETC2, 4x4 blocks, sRGB - case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: return GL_UNSIGNED_BYTE; // 4-component ETC2 with 1-bit alpha, 4x4 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: return GL_UNSIGNED_BYTE; // 4-component ETC2, 4x4 blocks, sRGB - - case GL_COMPRESSED_R11_EAC: return GL_UNSIGNED_BYTE; // 1-component ETC, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RG11_EAC: return GL_UNSIGNED_BYTE; // 2-component ETC, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SIGNED_R11_EAC: return GL_UNSIGNED_BYTE; // 1-component ETC, 4x4 blocks, signed normalized - case GL_COMPRESSED_SIGNED_RG11_EAC: return GL_UNSIGNED_BYTE; // 2-component ETC, 4x4 blocks, signed normalized - - // - // PVRTC - // - case GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG: return GL_UNSIGNED_BYTE; // 3-component PVRTC, 16x8 blocks, unsigned normalized - case GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG: return GL_UNSIGNED_BYTE; // 3-component PVRTC, 8x8 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: return GL_UNSIGNED_BYTE; // 4-component PVRTC, 16x8 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: return GL_UNSIGNED_BYTE; // 4-component PVRTC, 8x8 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG: return GL_UNSIGNED_BYTE; // 4-component PVRTC, 8x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG: return GL_UNSIGNED_BYTE; // 4-component PVRTC, 4x4 blocks, unsigned normalized - - case GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT: return GL_UNSIGNED_BYTE; // 3-component PVRTC, 16x8 blocks, sRGB - case GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT: return GL_UNSIGNED_BYTE; // 3-component PVRTC, 8x8 blocks, sRGB - case GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT: return GL_UNSIGNED_BYTE; // 4-component PVRTC, 16x8 blocks, sRGB - case GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT: return GL_UNSIGNED_BYTE; // 4-component PVRTC, 8x8 blocks, sRGB - case GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV2_IMG: return GL_UNSIGNED_BYTE; // 4-component PVRTC, 8x4 blocks, sRGB - case GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV2_IMG: return GL_UNSIGNED_BYTE; // 4-component PVRTC, 4x4 blocks, sRGB - - // - // ASTC - // - case GL_COMPRESSED_RGBA_ASTC_4x4_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_5x4_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 5x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_5x5_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 5x5 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_6x5_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 6x5 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_6x6_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 6x6 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_8x5_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 8x5 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_8x6_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 8x6 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_8x8_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 8x8 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_10x5_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 10x5 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_10x6_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 10x6 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_10x8_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 10x8 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_10x10_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 10x10 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_12x10_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 12x10 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_12x12_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 12x12 blocks, unsigned normalized - - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 4x4 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 5x4 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 5x5 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 6x5 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 6x6 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 8x5 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 8x6 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 8x8 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 10x5 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 10x6 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 10x8 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 10x10 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 12x10 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: return GL_UNSIGNED_BYTE; // 4-component ASTC, 12x12 blocks, sRGB - - case GL_COMPRESSED_RGBA_ASTC_3x3x3_OES: return GL_UNSIGNED_BYTE; // 4-component ASTC, 3x3x3 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_4x3x3_OES: return GL_UNSIGNED_BYTE; // 4-component ASTC, 4x3x3 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_4x4x3_OES: return GL_UNSIGNED_BYTE; // 4-component ASTC, 4x4x3 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_4x4x4_OES: return GL_UNSIGNED_BYTE; // 4-component ASTC, 4x4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_5x4x4_OES: return GL_UNSIGNED_BYTE; // 4-component ASTC, 5x4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_5x5x4_OES: return GL_UNSIGNED_BYTE; // 4-component ASTC, 5x5x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_5x5x5_OES: return GL_UNSIGNED_BYTE; // 4-component ASTC, 5x5x5 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_6x5x5_OES: return GL_UNSIGNED_BYTE; // 4-component ASTC, 6x5x5 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_6x6x5_OES: return GL_UNSIGNED_BYTE; // 4-component ASTC, 6x6x5 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_6x6x6_OES: return GL_UNSIGNED_BYTE; // 4-component ASTC, 6x6x6 blocks, unsigned normalized - - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES: return GL_UNSIGNED_BYTE; // 4-component ASTC, 3x3x3 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES: return GL_UNSIGNED_BYTE; // 4-component ASTC, 4x3x3 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES: return GL_UNSIGNED_BYTE; // 4-component ASTC, 4x4x3 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES: return GL_UNSIGNED_BYTE; // 4-component ASTC, 4x4x4 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES: return GL_UNSIGNED_BYTE; // 4-component ASTC, 5x4x4 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES: return GL_UNSIGNED_BYTE; // 4-component ASTC, 5x5x4 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES: return GL_UNSIGNED_BYTE; // 4-component ASTC, 5x5x5 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES: return GL_UNSIGNED_BYTE; // 4-component ASTC, 6x5x5 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES: return GL_UNSIGNED_BYTE; // 4-component ASTC, 6x6x5 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES: return GL_UNSIGNED_BYTE; // 4-component ASTC, 6x6x6 blocks, sRGB - - // - // ATC - // - case GL_ATC_RGB_AMD: return GL_UNSIGNED_BYTE; // 3-component, 4x4 blocks, unsigned normalized - case GL_ATC_RGBA_EXPLICIT_ALPHA_AMD: return GL_UNSIGNED_BYTE; // 4-component, 4x4 blocks, unsigned normalized - case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD: return GL_UNSIGNED_BYTE; // 4-component, 4x4 blocks, unsigned normalized - - // - // Palletized - // - case GL_PALETTE4_RGB8_OES: return GL_UNSIGNED_BYTE; // 3-component 8:8:8, 4-bit palette, unsigned normalized - case GL_PALETTE4_RGBA8_OES: return GL_UNSIGNED_BYTE; // 4-component 8:8:8:8, 4-bit palette, unsigned normalized - case GL_PALETTE4_R5_G6_B5_OES: return GL_UNSIGNED_SHORT_5_6_5; // 3-component 5:6:5, 4-bit palette, unsigned normalized - case GL_PALETTE4_RGBA4_OES: return GL_UNSIGNED_SHORT_4_4_4_4; // 4-component 4:4:4:4, 4-bit palette, unsigned normalized - case GL_PALETTE4_RGB5_A1_OES: return GL_UNSIGNED_SHORT_5_5_5_1; // 4-component 5:5:5:1, 4-bit palette, unsigned normalized - case GL_PALETTE8_RGB8_OES: return GL_UNSIGNED_BYTE; // 3-component 8:8:8, 8-bit palette, unsigned normalized - case GL_PALETTE8_RGBA8_OES: return GL_UNSIGNED_BYTE; // 4-component 8:8:8:8, 8-bit palette, unsigned normalized - case GL_PALETTE8_R5_G6_B5_OES: return GL_UNSIGNED_SHORT_5_6_5; // 3-component 5:6:5, 8-bit palette, unsigned normalized - case GL_PALETTE8_RGBA4_OES: return GL_UNSIGNED_SHORT_4_4_4_4; // 4-component 4:4:4:4, 8-bit palette, unsigned normalized - case GL_PALETTE8_RGB5_A1_OES: return GL_UNSIGNED_SHORT_5_5_5_1; // 4-component 5:5:5:1, 8-bit palette, unsigned normalized - - // - // Depth/stencil - // - case GL_DEPTH_COMPONENT16: return GL_UNSIGNED_SHORT; - case GL_DEPTH_COMPONENT24: return GL_UNSIGNED_INT_24_8; - case GL_DEPTH_COMPONENT32: return GL_UNSIGNED_INT; - case GL_DEPTH_COMPONENT32F: return GL_FLOAT; - case GL_DEPTH_COMPONENT32F_NV: return GL_FLOAT; - case GL_STENCIL_INDEX1: return GL_UNSIGNED_BYTE; - case GL_STENCIL_INDEX4: return GL_UNSIGNED_BYTE; - case GL_STENCIL_INDEX8: return GL_UNSIGNED_BYTE; - case GL_STENCIL_INDEX16: return GL_UNSIGNED_SHORT; - case GL_DEPTH24_STENCIL8: return GL_UNSIGNED_INT_24_8; - case GL_DEPTH32F_STENCIL8: return GL_FLOAT_32_UNSIGNED_INT_24_8_REV; - case GL_DEPTH32F_STENCIL8_NV: return GL_FLOAT_32_UNSIGNED_INT_24_8_REV; - - default: return GL_INVALID_VALUE; - } -} - -static inline unsigned int glGetTypeSizeFromType(GLenum type) -{ - switch (type) { - case GL_BYTE: - case GL_UNSIGNED_BYTE: - case GL_UNSIGNED_BYTE_3_3_2: - case GL_UNSIGNED_BYTE_2_3_3_REV: - return 1; - - case GL_SHORT: - case GL_UNSIGNED_SHORT: - case GL_UNSIGNED_SHORT_5_6_5: - case GL_UNSIGNED_SHORT_4_4_4_4: - case GL_UNSIGNED_SHORT_5_5_5_1: - case GL_UNSIGNED_SHORT_5_6_5_REV: - case GL_UNSIGNED_SHORT_4_4_4_4_REV: - case GL_UNSIGNED_SHORT_1_5_5_5_REV: - case GL_HALF_FLOAT: - return 2; - - case GL_INT: - case GL_UNSIGNED_INT: - case GL_UNSIGNED_INT_8_8_8_8: - case GL_UNSIGNED_INT_8_8_8_8_REV: - case GL_UNSIGNED_INT_10_10_10_2: - case GL_UNSIGNED_INT_2_10_10_10_REV: - case GL_UNSIGNED_INT_24_8: - case GL_UNSIGNED_INT_10F_11F_11F_REV: - case GL_UNSIGNED_INT_5_9_9_9_REV: - case GL_FLOAT: - case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: - return 4; - - default: - return GL_INVALID_VALUE; - } -} - -typedef enum GlFormatSizeFlagBits { - GL_FORMAT_SIZE_PACKED_BIT = 0x00000001, - GL_FORMAT_SIZE_COMPRESSED_BIT = 0x00000002, - GL_FORMAT_SIZE_PALETTIZED_BIT = 0x00000004, - GL_FORMAT_SIZE_DEPTH_BIT = 0x00000008, - GL_FORMAT_SIZE_STENCIL_BIT = 0x00000010, -} GlFormatSizeFlagBits; - -typedef unsigned int GlFormatSizeFlags; - -typedef struct GlFormatSize { - GlFormatSizeFlags flags; - unsigned int paletteSizeInBits; - unsigned int blockSizeInBits; - unsigned int blockWidth; // in texels - unsigned int blockHeight; // in texels - unsigned int blockDepth; // in texels -} GlFormatSize; - -static inline void glGetFormatSize( const GLenum internalFormat, GlFormatSize * pFormatSize ) -{ - switch ( internalFormat ) - { - // - // 8 bits per component - // - case GL_R8: // 1-component, 8-bit unsigned normalized - case GL_R8_SNORM: // 1-component, 8-bit signed normalized - case GL_R8UI: // 1-component, 8-bit unsigned integer - case GL_R8I: // 1-component, 8-bit signed integer - case GL_SR8: // 1-component, 8-bit sRGB - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 1 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_RG8: // 2-component, 8-bit unsigned normalized - case GL_RG8_SNORM: // 2-component, 8-bit signed normalized - case GL_RG8UI: // 2-component, 8-bit unsigned integer - case GL_RG8I: // 2-component, 8-bit signed integer - case GL_SRG8: // 2-component, 8-bit sRGB - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 2 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_RGB8: // 3-component, 8-bit unsigned normalized - case GL_RGB8_SNORM: // 3-component, 8-bit signed normalized - case GL_RGB8UI: // 3-component, 8-bit unsigned integer - case GL_RGB8I: // 3-component, 8-bit signed integer - case GL_SRGB8: // 3-component, 8-bit sRGB - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 3 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_RGBA8: // 4-component, 8-bit unsigned normalized - case GL_RGBA8_SNORM: // 4-component, 8-bit signed normalized - case GL_RGBA8UI: // 4-component, 8-bit unsigned integer - case GL_RGBA8I: // 4-component, 8-bit signed integer - case GL_SRGB8_ALPHA8: // 4-component, 8-bit sRGB - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 4 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - - // - // 16 bits per component - // - case GL_R16: // 1-component, 16-bit unsigned normalized - case GL_R16_SNORM: // 1-component, 16-bit signed normalized - case GL_R16UI: // 1-component, 16-bit unsigned integer - case GL_R16I: // 1-component, 16-bit signed integer - case GL_R16F: // 1-component, 16-bit floating-point - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 2 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_RG16: // 2-component, 16-bit unsigned normalized - case GL_RG16_SNORM: // 2-component, 16-bit signed normalized - case GL_RG16UI: // 2-component, 16-bit unsigned integer - case GL_RG16I: // 2-component, 16-bit signed integer - case GL_RG16F: // 2-component, 16-bit floating-point - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 4 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_RGB16: // 3-component, 16-bit unsigned normalized - case GL_RGB16_SNORM: // 3-component, 16-bit signed normalized - case GL_RGB16UI: // 3-component, 16-bit unsigned integer - case GL_RGB16I: // 3-component, 16-bit signed integer - case GL_RGB16F: // 3-component, 16-bit floating-point - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 6 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_RGBA16: // 4-component, 16-bit unsigned normalized - case GL_RGBA16_SNORM: // 4-component, 16-bit signed normalized - case GL_RGBA16UI: // 4-component, 16-bit unsigned integer - case GL_RGBA16I: // 4-component, 16-bit signed integer - case GL_RGBA16F: // 4-component, 16-bit floating-point - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 8 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - - // - // 32 bits per component - // - case GL_R32UI: // 1-component, 32-bit unsigned integer - case GL_R32I: // 1-component, 32-bit signed integer - case GL_R32F: // 1-component, 32-bit floating-point - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 4 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_RG32UI: // 2-component, 32-bit unsigned integer - case GL_RG32I: // 2-component, 32-bit signed integer - case GL_RG32F: // 2-component, 32-bit floating-point - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 8 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_RGB32UI: // 3-component, 32-bit unsigned integer - case GL_RGB32I: // 3-component, 32-bit signed integer - case GL_RGB32F: // 3-component, 32-bit floating-point - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 12 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_RGBA32UI: // 4-component, 32-bit unsigned integer - case GL_RGBA32I: // 4-component, 32-bit signed integer - case GL_RGBA32F: // 4-component, 32-bit floating-point - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 16 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - - // - // Packed - // - case GL_R3_G3_B2: // 3-component 3:3:2, unsigned normalized - pFormatSize->flags = GL_FORMAT_SIZE_PACKED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_RGB4: // 3-component 4:4:4, unsigned normalized - pFormatSize->flags = GL_FORMAT_SIZE_PACKED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 12; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_RGB5: // 3-component 5:5:5, unsigned normalized - pFormatSize->flags = GL_FORMAT_SIZE_PACKED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 16; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_RGB565: // 3-component 5:6:5, unsigned normalized - pFormatSize->flags = GL_FORMAT_SIZE_PACKED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 16; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_RGB10: // 3-component 10:10:10, unsigned normalized - pFormatSize->flags = GL_FORMAT_SIZE_PACKED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 32; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_RGB12: // 3-component 12:12:12, unsigned normalized - pFormatSize->flags = GL_FORMAT_SIZE_PACKED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 36; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_RGBA2: // 4-component 2:2:2:2, unsigned normalized - pFormatSize->flags = GL_FORMAT_SIZE_PACKED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_RGBA4: // 4-component 4:4:4:4, unsigned normalized - pFormatSize->flags = GL_FORMAT_SIZE_PACKED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 16; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_RGBA12: // 4-component 12:12:12:12, unsigned normalized - pFormatSize->flags = GL_FORMAT_SIZE_PACKED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 48; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_RGB5_A1: // 4-component 5:5:5:1, unsigned normalized - pFormatSize->flags = GL_FORMAT_SIZE_PACKED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 32; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_RGB10_A2: // 4-component 10:10:10:2, unsigned normalized - pFormatSize->flags = GL_FORMAT_SIZE_PACKED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 32; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_RGB10_A2UI: // 4-component 10:10:10:2, unsigned integer - pFormatSize->flags = GL_FORMAT_SIZE_PACKED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 32; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_R11F_G11F_B10F: // 3-component 11:11:10, floating-point - case GL_RGB9_E5: // 3-component/exp 9:9:9/5, floating-point - pFormatSize->flags = GL_FORMAT_SIZE_PACKED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 32; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - - // - // S3TC/DXT/BC - // - case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // line through 3D space, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: // line through 3D space plus 1-bit alpha, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: // line through 3D space, 4x4 blocks, sRGB - case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: // line through 3D space plus 1-bit alpha, 4x4 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 64; - pFormatSize->blockWidth = 4; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 1; - break; - case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: // line through 3D space plus line through 1D space, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: // line through 3D space plus 4-bit alpha, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: // line through 3D space plus line through 1D space, 4x4 blocks, sRGB - case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: // line through 3D space plus 4-bit alpha, 4x4 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 4; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 1; - break; - - case GL_COMPRESSED_LUMINANCE_LATC1_EXT: // line through 1D space, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT: // line through 1D space, 4x4 blocks, signed normalized - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 64; - pFormatSize->blockWidth = 4; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 1; - break; - case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT: // two lines through 1D space, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT: // two lines through 1D space, 4x4 blocks, signed normalized - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 4; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 1; - break; - - case GL_COMPRESSED_RED_RGTC1: // line through 1D space, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SIGNED_RED_RGTC1: // line through 1D space, 4x4 blocks, signed normalized - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 64; - pFormatSize->blockWidth = 4; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 1; - break; - case GL_COMPRESSED_RG_RGTC2: // two lines through 1D space, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SIGNED_RG_RGTC2: // two lines through 1D space, 4x4 blocks, signed normalized - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 4; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 1; - break; - - case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT: // 3-component, 4x4 blocks, unsigned floating-point - case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT: // 3-component, 4x4 blocks, signed floating-point - case GL_COMPRESSED_RGBA_BPTC_UNORM: // 4-component, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM: // 4-component, 4x4 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 4; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 1; - break; - - // - // ETC - // - case GL_ETC1_RGB8_OES: // 3-component ETC1, 4x4 blocks, unsigned normalized" ), - case GL_COMPRESSED_RGB8_ETC2: // 3-component ETC2, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ETC2: // 3-component ETC2, 4x4 blocks, sRGB - case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: // 4-component ETC2 with 1-bit alpha, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: // 4-component ETC2 with 1-bit alpha, 4x4 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 64; - pFormatSize->blockWidth = 4; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 1; - break; - case GL_COMPRESSED_RGBA8_ETC2_EAC: // 4-component ETC2, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: // 4-component ETC2, 4x4 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 4; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 1; - break; - - case GL_COMPRESSED_R11_EAC: // 1-component ETC, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SIGNED_R11_EAC: // 1-component ETC, 4x4 blocks, signed normalized - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 64; - pFormatSize->blockWidth = 4; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 1; - break; - case GL_COMPRESSED_RG11_EAC: // 2-component ETC, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SIGNED_RG11_EAC: // 2-component ETC, 4x4 blocks, signed normalized - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 4; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 1; - break; - - // - // PVRTC - // - case GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG: // 3-component PVRTC, 16x8 blocks, unsigned normalized - case GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT: // 3-component PVRTC, 16x8 blocks, sRGB - case GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: // 4-component PVRTC, 16x8 blocks, unsigned normalized - case GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT: // 4-component PVRTC, 16x8 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 64; - pFormatSize->blockWidth = 16; - pFormatSize->blockHeight = 8; - pFormatSize->blockDepth = 1; - break; - case GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG: // 3-component PVRTC, 8x8 blocks, unsigned normalized - case GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT: // 3-component PVRTC, 8x8 blocks, sRGB - case GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: // 4-component PVRTC, 8x8 blocks, unsigned normalized - case GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT: // 4-component PVRTC, 8x8 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 64; - pFormatSize->blockWidth = 8; - pFormatSize->blockHeight = 8; - pFormatSize->blockDepth = 1; - break; - case GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG: // 4-component PVRTC, 8x4 blocks, unsigned normalized - case GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV2_IMG: // 4-component PVRTC, 8x4 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 64; - pFormatSize->blockWidth = 8; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 1; - break; - case GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG: // 4-component PVRTC, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV2_IMG: // 4-component PVRTC, 4x4 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 64; - pFormatSize->blockWidth = 4; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 1; - break; - - // - // ASTC - // - case GL_COMPRESSED_RGBA_ASTC_4x4_KHR: // 4-component ASTC, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: // 4-component ASTC, 4x4 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 4; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 1; - break; - case GL_COMPRESSED_RGBA_ASTC_5x4_KHR: // 4-component ASTC, 5x4 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: // 4-component ASTC, 5x4 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 5; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 1; - break; - case GL_COMPRESSED_RGBA_ASTC_5x5_KHR: // 4-component ASTC, 5x5 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: // 4-component ASTC, 5x5 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 5; - pFormatSize->blockHeight = 5; - pFormatSize->blockDepth = 1; - break; - case GL_COMPRESSED_RGBA_ASTC_6x5_KHR: // 4-component ASTC, 6x5 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: // 4-component ASTC, 6x5 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 6; - pFormatSize->blockHeight = 5; - pFormatSize->blockDepth = 1; - break; - case GL_COMPRESSED_RGBA_ASTC_6x6_KHR: // 4-component ASTC, 6x6 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: // 4-component ASTC, 6x6 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 6; - pFormatSize->blockHeight = 6; - pFormatSize->blockDepth = 1; - break; - case GL_COMPRESSED_RGBA_ASTC_8x5_KHR: // 4-component ASTC, 8x5 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: // 4-component ASTC, 8x5 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 8; - pFormatSize->blockHeight = 5; - pFormatSize->blockDepth = 1; - break; - case GL_COMPRESSED_RGBA_ASTC_8x6_KHR: // 4-component ASTC, 8x6 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: // 4-component ASTC, 8x6 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 8; - pFormatSize->blockHeight = 6; - pFormatSize->blockDepth = 1; - break; - case GL_COMPRESSED_RGBA_ASTC_8x8_KHR: // 4-component ASTC, 8x8 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: // 4-component ASTC, 8x8 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 8; - pFormatSize->blockHeight = 8; - pFormatSize->blockDepth = 1; - break; - case GL_COMPRESSED_RGBA_ASTC_10x5_KHR: // 4-component ASTC, 10x5 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: // 4-component ASTC, 10x5 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 10; - pFormatSize->blockHeight = 5; - pFormatSize->blockDepth = 1; - break; - case GL_COMPRESSED_RGBA_ASTC_10x6_KHR: // 4-component ASTC, 10x6 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: // 4-component ASTC, 10x6 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 10; - pFormatSize->blockHeight = 6; - pFormatSize->blockDepth = 1; - break; - case GL_COMPRESSED_RGBA_ASTC_10x8_KHR: // 4-component ASTC, 10x8 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: // 4-component ASTC, 10x8 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 10; - pFormatSize->blockHeight = 8; - pFormatSize->blockDepth = 1; - break; - case GL_COMPRESSED_RGBA_ASTC_10x10_KHR: // 4-component ASTC, 10x10 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: // 4-component ASTC, 10x10 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 10; - pFormatSize->blockHeight = 10; - pFormatSize->blockDepth = 1; - break; - case GL_COMPRESSED_RGBA_ASTC_12x10_KHR: // 4-component ASTC, 12x10 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: // 4-component ASTC, 12x10 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 12; - pFormatSize->blockHeight = 10; - pFormatSize->blockDepth = 1; - break; - case GL_COMPRESSED_RGBA_ASTC_12x12_KHR: // 4-component ASTC, 12x12 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: // 4-component ASTC, 12x12 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 12; - pFormatSize->blockHeight = 12; - pFormatSize->blockDepth = 1; - break; - - case GL_COMPRESSED_RGBA_ASTC_3x3x3_OES: // 4-component ASTC, 3x3x3 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES: // 4-component ASTC, 3x3x3 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 3; - pFormatSize->blockHeight = 3; - pFormatSize->blockDepth = 3; - break; - case GL_COMPRESSED_RGBA_ASTC_4x3x3_OES: // 4-component ASTC, 4x3x3 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES: // 4-component ASTC, 4x3x3 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 4; - pFormatSize->blockHeight = 3; - pFormatSize->blockDepth = 3; - break; - case GL_COMPRESSED_RGBA_ASTC_4x4x3_OES: // 4-component ASTC, 4x4x3 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES: // 4-component ASTC, 4x4x3 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 4; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 3; - break; - case GL_COMPRESSED_RGBA_ASTC_4x4x4_OES: // 4-component ASTC, 4x4x4 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES: // 4-component ASTC, 4x4x4 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 4; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 4; - break; - case GL_COMPRESSED_RGBA_ASTC_5x4x4_OES: // 4-component ASTC, 5x4x4 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES: // 4-component ASTC, 5x4x4 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 5; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 4; - break; - case GL_COMPRESSED_RGBA_ASTC_5x5x4_OES: // 4-component ASTC, 5x5x4 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES: // 4-component ASTC, 5x5x4 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 5; - pFormatSize->blockHeight = 5; - pFormatSize->blockDepth = 4; - break; - case GL_COMPRESSED_RGBA_ASTC_5x5x5_OES: // 4-component ASTC, 5x5x5 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES: // 4-component ASTC, 5x5x5 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 5; - pFormatSize->blockHeight = 5; - pFormatSize->blockDepth = 5; - break; - case GL_COMPRESSED_RGBA_ASTC_6x5x5_OES: // 4-component ASTC, 6x5x5 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES: // 4-component ASTC, 6x5x5 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 6; - pFormatSize->blockHeight = 5; - pFormatSize->blockDepth = 5; - break; - case GL_COMPRESSED_RGBA_ASTC_6x6x5_OES: // 4-component ASTC, 6x6x5 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES: // 4-component ASTC, 6x6x5 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 6; - pFormatSize->blockHeight = 6; - pFormatSize->blockDepth = 5; - break; - case GL_COMPRESSED_RGBA_ASTC_6x6x6_OES: // 4-component ASTC, 6x6x6 blocks, unsigned normalized - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES: // 4-component ASTC, 6x6x6 blocks, sRGB - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 6; - pFormatSize->blockHeight = 6; - pFormatSize->blockDepth = 6; - break; - - // - // ATC - // - case GL_ATC_RGB_AMD: // 3-component, 4x4 blocks, unsigned normalized - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 64; - pFormatSize->blockWidth = 4; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 1; - break; - case GL_ATC_RGBA_EXPLICIT_ALPHA_AMD: // 4-component, 4x4 blocks, unsigned normalized - case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD: // 4-component, 4x4 blocks, unsigned normalized - pFormatSize->flags = GL_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 128; - pFormatSize->blockWidth = 4; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 1; - break; - - // - // Palletized - // - case GL_PALETTE4_RGB8_OES: // 3-component 8:8:8, 4-bit palette, unsigned normalized - pFormatSize->flags = GL_FORMAT_SIZE_PALETTIZED_BIT; - pFormatSize->paletteSizeInBits = 16 * 24; - pFormatSize->blockSizeInBits = 4; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_PALETTE4_RGBA8_OES: // 4-component 8:8:8:8, 4-bit palette, unsigned normalized - pFormatSize->flags = GL_FORMAT_SIZE_PALETTIZED_BIT; - pFormatSize->paletteSizeInBits = 16 * 32; - pFormatSize->blockSizeInBits = 4; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_PALETTE4_R5_G6_B5_OES: // 3-component 5:6:5, 4-bit palette, unsigned normalized - case GL_PALETTE4_RGBA4_OES: // 4-component 4:4:4:4, 4-bit palette, unsigned normalized - case GL_PALETTE4_RGB5_A1_OES: // 4-component 5:5:5:1, 4-bit palette, unsigned normalized - pFormatSize->flags = GL_FORMAT_SIZE_PALETTIZED_BIT; - pFormatSize->paletteSizeInBits = 16 * 16; - pFormatSize->blockSizeInBits = 4; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_PALETTE8_RGB8_OES: // 3-component 8:8:8, 8-bit palette, unsigned normalized - pFormatSize->flags = GL_FORMAT_SIZE_PALETTIZED_BIT; - pFormatSize->paletteSizeInBits = 256 * 24; - pFormatSize->blockSizeInBits = 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_PALETTE8_RGBA8_OES: // 4-component 8:8:8:8, 8-bit palette, unsigned normalized - pFormatSize->flags = GL_FORMAT_SIZE_PALETTIZED_BIT; - pFormatSize->paletteSizeInBits = 256 * 32; - pFormatSize->blockSizeInBits = 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_PALETTE8_R5_G6_B5_OES: // 3-component 5:6:5, 8-bit palette, unsigned normalized - case GL_PALETTE8_RGBA4_OES: // 4-component 4:4:4:4, 8-bit palette, unsigned normalized - case GL_PALETTE8_RGB5_A1_OES: // 4-component 5:5:5:1, 8-bit palette, unsigned normalized - pFormatSize->flags = GL_FORMAT_SIZE_PALETTIZED_BIT; - pFormatSize->paletteSizeInBits = 256 * 16; - pFormatSize->blockSizeInBits = 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - - // - // Depth/stencil - // - case GL_DEPTH_COMPONENT16: - pFormatSize->flags = GL_FORMAT_SIZE_DEPTH_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 16; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_DEPTH_COMPONENT24: - case GL_DEPTH_COMPONENT32: - case GL_DEPTH_COMPONENT32F: - case GL_DEPTH_COMPONENT32F_NV: - pFormatSize->flags = GL_FORMAT_SIZE_DEPTH_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 32; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_STENCIL_INDEX1: - pFormatSize->flags = GL_FORMAT_SIZE_STENCIL_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 1; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_STENCIL_INDEX4: - pFormatSize->flags = GL_FORMAT_SIZE_STENCIL_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 4; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_STENCIL_INDEX8: - pFormatSize->flags = GL_FORMAT_SIZE_STENCIL_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_STENCIL_INDEX16: - pFormatSize->flags = GL_FORMAT_SIZE_STENCIL_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 16; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_DEPTH24_STENCIL8: - pFormatSize->flags = GL_FORMAT_SIZE_DEPTH_BIT | GL_FORMAT_SIZE_STENCIL_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 32; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case GL_DEPTH32F_STENCIL8: - case GL_DEPTH32F_STENCIL8_NV: - pFormatSize->flags = GL_FORMAT_SIZE_DEPTH_BIT | GL_FORMAT_SIZE_STENCIL_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 64; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - - default: - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - } -} - -#endif // !GL_FORMAT_H diff --git a/external/KTX-Software-master/lib/gl_funcptrs.h b/external/KTX-Software-master/lib/gl_funcptrs.h deleted file mode 100644 index a9c644a..0000000 --- a/external/KTX-Software-master/lib/gl_funcptrs.h +++ /dev/null @@ -1,69 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4 expandtab: */ - -/* $Id: c29f4818e74655d62754e26efdab99cb2d2ca638 $ */ - -/* - * ©2010-2017 The khronos Group, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Author: Mark Callow based on code from Georg Kolling - */ - -#ifndef GL_FUNCPTRS_H -#define GL_FUNCPTRS_H - -#ifdef __cplusplus -extern "C" { -#endif - -#if KTX_USE_GETPROC - // Not defined in glew.h. - typedef void (GL_APIENTRY* PFNGLTEXIMAGE1DPROC) ( - GLenum target, GLint level, GLint internalformat, - GLsizei width, GLint border, GLenum format, GLenum type, - const GLvoid *pixels - ); -#endif - -extern PFNGLTEXIMAGE1DPROC pfGlTexImage1D; -extern PFNGLTEXIMAGE3DPROC pfGlTexImage3D; -extern PFNGLCOMPRESSEDTEXIMAGE1DPROC pfGlCompressedTexImage1D; -extern PFNGLCOMPRESSEDTEXIMAGE3DPROC pfGlCompressedTexImage3D; -extern PFNGLGENERATEMIPMAPPROC pfGlGenerateMipmap; -extern PFNGLGETSTRINGIPROC pfGlGetStringi; - -#define DECLARE_GL_FUNCPTRS \ - PFNGLTEXIMAGE1DPROC pfGlTexImage1D; \ - PFNGLTEXIMAGE3DPROC pfGlTexImage3D; \ - PFNGLCOMPRESSEDTEXIMAGE1DPROC pfGlCompressedTexImage1D; \ - PFNGLCOMPRESSEDTEXIMAGE3DPROC pfGlCompressedTexImage3D; \ - PFNGLGENERATEMIPMAPPROC pfGlGenerateMipmap; \ - PFNGLGETSTRINGIPROC pfGlGetStringi; - -#define INITIALIZE_GL_FUNCPTRS \ - pfGlTexImage1D = glTexImage1D; \ - pfGlTexImage3D = glTexImage3D; \ - pfGlCompressedTexImage1D = glCompressedTexImage1D; \ - pfGlCompressedTexImage3D = glCompressedTexImage3D; \ - pfGlGenerateMipmap = glGenerateMipmap; \ - pfGlGetStringi = glGetStringi; - -#ifdef __cplusplus -} -#endif - -#endif /* GL_FUNCPTRS_H */ diff --git a/external/KTX-Software-master/lib/gles1_funcptrs.h b/external/KTX-Software-master/lib/gles1_funcptrs.h deleted file mode 100644 index 4b96da9..0000000 --- a/external/KTX-Software-master/lib/gles1_funcptrs.h +++ /dev/null @@ -1,68 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4 expandtab: */ - -/* $Id: a9dea3dfe7b8266c56bd790f15e03e8e7e1baa8e $ */ - -/* - * ©2010-2017 The khronos Group, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Author: Mark Callow based on code from Georg Kolling - */ - -#ifndef GLES1_FUNCPTRS_H -#define GLES1_FUNCPTRS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* remove these where already defined as typedefs (GCC 4 complains of duplicate definitions) */ -typedef void (GL_APIENTRY* PFNGLTEXIMAGE1DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (GL_APIENTRY* PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (GL_APIENTRY* PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (GL_APIENTRY* PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (GL_APIENTRY* PFNGLGENERATEMIPMAPPROC) (GLenum target); -typedef const GLubyte* (GL_APIENTRY* PFNGLGETSTRINGIPROC) (GLenum name, GLint index); - -extern PFNGLTEXIMAGE1DPROC pfGlTexImage1D; -extern PFNGLTEXIMAGE3DPROC pfGlTexImage3D; -extern PFNGLCOMPRESSEDTEXIMAGE1DPROC pfGlCompressedTexImage1D; -extern PFNGLCOMPRESSEDTEXIMAGE3DPROC pfGlCompressedTexImage3D; -extern PFNGLGENERATEMIPMAPPROC pfGlGenerateMipmap; -extern PFNGLGETSTRINGIPROC pfGlGetStringi; - -#define DECLARE_GL_FUNCPTRS \ - PFNGLTEXIMAGE1DPROC pfGlTexImage1D; \ - PFNGLTEXIMAGE3DPROC pfGlTexImage3D; \ - PFNGLCOMPRESSEDTEXIMAGE1DPROC pfGlCompressedTexImage1D; \ - PFNGLCOMPRESSEDTEXIMAGE3DPROC pfGlCompressedTexImage3D; \ - PFNGLGENERATEMIPMAPPROC pfGlGenerateMipmap; \ - PFNGLGETSTRINGIPROC pfGlGetStringi; - -#define INITIALIZE_GL_FUNCPTRS \ - pfGlTexImage1D = 0; \ - pfGlTexImage3D = 0; \ - pfGlCompressedTexImage1D = 0; \ - pfGlCompressedTexImage3D = 0; \ - pfGlGenerateMipmap = 0; \ - pfGlGetStringi = 0; - -#ifdef __cplusplus -} -#endif - -#endif /* GLES1_FUNCPTRS_H */ diff --git a/external/KTX-Software-master/lib/gles2_funcptrs.h b/external/KTX-Software-master/lib/gles2_funcptrs.h deleted file mode 100644 index 1494695..0000000 --- a/external/KTX-Software-master/lib/gles2_funcptrs.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4 expandtab: */ - -/* $Id: f780b88290b1aa6df0104020b75e21904e53ff1c $ */ - -/* - * ©2010-2017 The khronos Group, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Author: Mark Callow based on code from Georg Kolling - */ - -#ifndef GLES2_FUNCPTRS_H -#define GLES2_FUNCPTRS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* remove these where already defined as typedefs (GCC 4 complains of duplicate definitions) */ -typedef void (GL_APIENTRY* PFNGLTEXIMAGE1DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (GL_APIENTRY* PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (GL_APIENTRY* PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (GL_APIENTRY* PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -typedef const GLubyte* (GL_APIENTRY* PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); - -extern PFNGLTEXIMAGE1DPROC pfGlTexImage1D; -extern PFNGLTEXIMAGE3DPROC pfGlTexImage3D; -extern PFNGLCOMPRESSEDTEXIMAGE1DPROC pfGlCompressedTexImage1D; -extern PFNGLCOMPRESSEDTEXIMAGE3DPROC pfGlCompressedTexImage3D; -extern PFNGLGENERATEMIPMAPPROC pfGlGenerateMipmap; -extern PFNGLGETSTRINGIPROC pfGlGetStringi; - -#define DECLARE_GL_FUNCPTRS \ - PFNGLTEXIMAGE1DPROC pfGlTexImage1D; \ - PFNGLTEXIMAGE3DPROC pfGlTexImage3D; \ - PFNGLCOMPRESSEDTEXIMAGE1DPROC pfGlCompressedTexImage1D; \ - PFNGLCOMPRESSEDTEXIMAGE3DPROC pfGlCompressedTexImage3D; \ - PFNGLGENERATEMIPMAPPROC pfGlGenerateMipmap; \ - PFNGLGETSTRINGIPROC pfGlGetStringi; - -#define INITIALIZE_GL_FUNCPTRS \ - pfGlTexImage1D = 0; \ - pfGlTexImage3D = 0; \ - pfGlCompressedTexImage1D = 0; \ - pfGlCompressedTexImage3D = 0; \ - pfGlGenerateMipmap = glGenerateMipmap; \ - pfGlGetStringi = 0; - -#ifdef __cplusplus -} -#endif - -#endif /* GLES2_FUNCPTRS_H */ diff --git a/external/KTX-Software-master/lib/gles3_funcptrs.h b/external/KTX-Software-master/lib/gles3_funcptrs.h deleted file mode 100644 index b7ea291..0000000 --- a/external/KTX-Software-master/lib/gles3_funcptrs.h +++ /dev/null @@ -1,72 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4 expandtab: */ - -/* $Id: 81315679d0a7bf28f92251adeb0cfea199e013fe $ */ - -/* - * ©2010-2017 The khronos Group, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Author: Mark Callow based on code from Georg Kolling - */ - -#ifndef GLES3_FUNCPTRS_H -#define GLES3_FUNCPTRS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* remove these where already defined as typedefs */ -typedef void (GL_APIENTRY* PFNGLTEXIMAGE1DPROC) ( - GLenum target, GLint level, GLint internalformat, - GLsizei width, GLint border, GLenum format, - GLenum type, const GLvoid *pixels - ); -typedef void (GL_APIENTRY* PFNGLCOMPRESSEDTEXIMAGE1DPROC) ( - GLenum target, GLint level, GLenum internalformat, - GLsizei width, GLint border, GLsizei imageSize, - const GLvoid *data - ); - -extern PFNGLTEXIMAGE1DPROC pfGlTexImage1D; -extern PFNGLTEXIMAGE3DPROC pfGlTexImage3D; -extern PFNGLCOMPRESSEDTEXIMAGE1DPROC pfGlCompressedTexImage1D; -extern PFNGLCOMPRESSEDTEXIMAGE3DPROC pfGlCompressedTexImage3D; -extern PFNGLGENERATEMIPMAPPROC pfGlGenerateMipmap; -extern PFNGLGETSTRINGIPROC pfGlGetStringi; - -#define DECLARE_GL_FUNCPTRS \ - PFNGLTEXIMAGE1DPROC pfGlTexImage1D; \ - PFNGLTEXIMAGE3DPROC pfGlTexImage3D; \ - PFNGLCOMPRESSEDTEXIMAGE1DPROC pfGlCompressedTexImage1D; \ - PFNGLCOMPRESSEDTEXIMAGE3DPROC pfGlCompressedTexImage3D; \ - PFNGLGENERATEMIPMAPPROC pfGlGenerateMipmap; \ - PFNGLGETSTRINGIPROC pfGlGetStringi; - -#define INITIALIZE_GL_FUNCPTRS \ - pfGlTexImage1D = 0; \ - pfGlTexImage3D = glTexImage3D; \ - pfGlCompressedTexImage1D = 0; \ - pfGlCompressedTexImage3D = glCompressedTexImage3D; \ - pfGlGenerateMipmap = glGenerateMipmap; \ - pfGlGetStringi = glGetStringi; - -#ifdef __cplusplus -} -#endif - -#endif /* GLES3_FUNCPTRS_H */ diff --git a/external/KTX-Software-master/lib/glloader.c b/external/KTX-Software-master/lib/glloader.c deleted file mode 100644 index 1089898..0000000 --- a/external/KTX-Software-master/lib/glloader.c +++ /dev/null @@ -1,1115 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4 expandtab: */ - -/* - * ©2010-2018 Mark Callow. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @internal - * @file - * @~English - * - * @brief Functions for instantiating GL or GLES textures from KTX files. - * - * @author Georg Kolling, Imagination Technology - * @author Mark Callow, HI Corporation & Edgewise Consulting - */ - -#ifdef _WIN32 -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include <assert.h> -#include <string.h> -#include <stdlib.h> - -#if KTX_OPENGL - - #ifdef _WIN32 - #include <windows.h> - #undef KTX_USE_GETPROC /* Must use GETPROC on Windows */ - #define KTX_USE_GETPROC 1 - #else - #if !defined(KTX_USE_GETPROC) - #define KTX_USE_GETPROC 0 - #endif - #endif - #if KTX_USE_GETPROC - #include <GL/glew.h> - #else - #define GL_GLEXT_PROTOTYPES - #include <GL/glcorearb.h> - #endif - - #define GL_APIENTRY APIENTRY - #include "gl_funcptrs.h" - -#elif KTX_OPENGL_ES1 - - #include <GLES/gl.h> - #include <GLES/glext.h> - #include "gles1_funcptrs.h" - -#elif KTX_OPENGL_ES2 - - #define GL_GLEXT_PROTOTYPES - #include <GLES2/gl2.h> - #include <GLES2/gl2ext.h> - #include "gles2_funcptrs.h" - -#elif KTX_OPENGL_ES3 - - #define GL_GLEXT_PROTOTYPES - #include <GLES3/gl3.h> - #include <GLES2/gl2ext.h> - #include "gles3_funcptrs.h" - -#else - #error Please #define one of KTX_OPENGL, KTX_OPENGL_ES1, KTX_OPENGL_ES2 or KTX_OPENGL_ES3 as 1 -#endif - -#include "ktx.h" -#include "ktxint.h" -#include "ktxgl.h" - -DECLARE_GL_FUNCPTRS - -/** - * @defgroup ktx_glloader OpenGL Texture Image Loader - * @brief Create texture objects in current OpenGL context. - * @{ - */ - -/** - * @example glloader.c - * This is an example of using the low-level ktxTexture API to create and load - * an OpenGL texture. It is a fragment of the code used by - * @ref ktxTexture_GLUpload which underpins the @c ktxLoadTexture* functions. - * - * @code - * #include <ktx.h> - * @endcode - * - * This structure is used to pass to a callback function data that is uniform - * across all images. - * @snippet this cbdata - * - * One of these callbacks, selected by @ref ktxTexture_GLUpload based on the - * dimensionality and arrayness of the texture, is called from - * @ref ktxTexture_IterateLevelFaces to upload the texture data to OpenGL. - * @snippet this imageCallbacks - * - * This function creates the GL texture object and sets up the callbacks to - * load the image data into it. - * @snippet this loadGLTexture - */ - -/** - * @internal - * @~English - * @brief Additional contextProfile bit indicating an OpenGL ES context. - * - * This is the same value NVIDIA returns when using an OpenGL ES profile - * of their desktop drivers. However it is not specified in any official - * specification as OpenGL ES does not support the GL_CONTEXT_PROFILE_MASK - * query. - */ -#define _CONTEXT_ES_PROFILE_BIT 0x4 - -/** - * @internal - * @~English - * @name Supported Sized Format Macros - * - * These macros describe values that may be used with the sizedFormats - * variable. - */ -/**@{*/ -#define _NON_LEGACY_FORMATS 0x1 /*< @internal Non-legacy sized formats are supported. */ -#define _LEGACY_FORMATS 0x2 /*< @internal Legacy sized formats are supported. */ -/** - * @internal - * @~English - * @brief All sized formats are supported - */ -#define _ALL_SIZED_FORMATS (_NON_LEGACY_FORMATS | _LEGACY_FORMATS) -#define _NO_SIZED_FORMATS 0 /*< @internal No sized formats are supported. */ -/**@}*/ - -/** - * @internal - * @~English - * @brief indicates the profile of the current context. - */ -static GLint contextProfile = 0; -/** - * @internal - * @~English - * @brief Indicates what sized texture formats are supported - * by the current context. - */ -static GLint sizedFormats = _ALL_SIZED_FORMATS; -static GLboolean supportsSwizzle = GL_TRUE; -/** - * @internal - * @~English - * @brief Indicates which R16 & RG16 formats are supported by the current - * context. - */ -static GLint R16Formats = _KTX_ALL_R16_FORMATS; -/** - * @internal - * @~English - * @brief Indicates if the current context supports sRGB textures. - */ -static GLboolean supportsSRGB = GL_TRUE; -/** - * @internal - * @~English - * @brief Indicates if the current context supports cube map arrays. - */ -static GLboolean supportsCubeMapArrays = GL_FALSE; - -/** - * @internal - * @~English - * @brief Workaround mismatch of glGetString declaration and standard string - * function parameters. - */ -#define glGetString(x) (const char*)glGetString(x) - -/** - * @internal - * @~English - * @brief Workaround mismatch of glGetStringi declaration and standard string - * function parameters. - */ -#define pfGlGetStringi(x,y) (const char*)pfGlGetStringi(x,y) - -/** - * @internal - * @~English - * @brief Check for existence of OpenGL extension - */ -static GLboolean -hasExtension(const char* extension) -{ - if (pfGlGetStringi == NULL) { - if (strstr(glGetString(GL_EXTENSIONS), extension) != NULL) - return GL_TRUE; - else - return GL_FALSE; - } else { - int i, n; - - glGetIntegerv(GL_NUM_EXTENSIONS, &n); - for (i = 0; i < n; i++) { - if (strcmp(pfGlGetStringi(GL_EXTENSIONS, i), extension) == 0) - return GL_TRUE; - } - return GL_FALSE; - } -} - -/** - * @internal - * @~English - * @brief Discover the capabilities of the current GL context. - * - * Queries the context and sets several the following internal variables - * indicating the capabilities of the context: - * - * @li sizedFormats - * @li supportsSwizzle - * @li supportsSRGB - * @li b16Formats - */ -static void -discoverContextCapabilities(void) -{ - GLint majorVersion = 1; - GLint minorVersion = 0; - - // Done here so things will work when GLEW, or equivalent, is being used - // and GL function names are defined as pointers. Initialization at - // declaration would happen before these pointers have been initialized. - INITIALIZE_GL_FUNCPTRS - - if (strstr(glGetString(GL_VERSION), "GL ES") != NULL) - contextProfile = _CONTEXT_ES_PROFILE_BIT; - // MAJOR & MINOR only introduced in GL {,ES} 3.0 - glGetIntegerv(GL_MAJOR_VERSION, &majorVersion); - glGetIntegerv(GL_MINOR_VERSION, &minorVersion); - if (glGetError() != GL_NO_ERROR) { - // < v3.0; resort to the old-fashioned way. - if (contextProfile & _CONTEXT_ES_PROFILE_BIT) - sscanf(glGetString(GL_VERSION), "OpenGL ES %d.%d ", - &majorVersion, &minorVersion); - else - sscanf(glGetString(GL_VERSION), "OpenGL %d.%d ", - &majorVersion, &minorVersion); - } - if (contextProfile & _CONTEXT_ES_PROFILE_BIT) { - if (majorVersion < 3) { - supportsSwizzle = GL_FALSE; - sizedFormats = _NO_SIZED_FORMATS; - R16Formats = _KTX_NO_R16_FORMATS; - supportsSRGB = GL_FALSE; - } else { - sizedFormats = _NON_LEGACY_FORMATS; - if (hasExtension("GL_EXT_texture_cube_map_array")) { - supportsCubeMapArrays = GL_TRUE; - } - } - if (hasExtension("GL_OES_required_internalformat")) { - sizedFormats |= _ALL_SIZED_FORMATS; - } - // There are no OES extensions for sRGB textures or R16 formats. - } else { - // PROFILE_MASK was introduced in OpenGL 3.2. - // Profiles: CONTEXT_CORE_PROFILE_BIT 0x1, - // CONTEXT_COMPATIBILITY_PROFILE_BIT 0x2. - glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &contextProfile); - if (glGetError() == GL_NO_ERROR) { - // >= 3.2 - if (majorVersion == 3 && minorVersion < 3) - supportsSwizzle = GL_FALSE; - if ((contextProfile & GL_CONTEXT_CORE_PROFILE_BIT)) - sizedFormats &= ~_LEGACY_FORMATS; - if (majorVersion >= 4) - supportsCubeMapArrays = GL_TRUE; - } else { - // < 3.2 - contextProfile = GL_CONTEXT_COMPATIBILITY_PROFILE_BIT; - supportsSwizzle = GL_FALSE; - // sRGB textures introduced in 2.0 - if (majorVersion < 2 && hasExtension("GL_EXT_texture_sRGB")) { - supportsSRGB = GL_FALSE; - } - // R{,G]16 introduced in 3.0; R{,G}16_SNORM introduced in 3.1. - if (majorVersion == 3) { - if (minorVersion == 0) - R16Formats &= ~_KTX_R16_FORMATS_SNORM; - } else if (hasExtension("GL_ARB_texture_rg")) { - R16Formats &= ~_KTX_R16_FORMATS_SNORM; - } else { - R16Formats = _KTX_NO_R16_FORMATS; - } - } - if (!supportsCubeMapArrays) { - if (hasExtension("GL_ARB_texture_cube_map_array")) { - supportsCubeMapArrays = GL_TRUE; - } - } - } -} - -#if SUPPORT_LEGACY_FORMAT_CONVERSION -/** - * @internal - * @~English - * @brief Convert deprecated legacy-format texture to modern format. - * - * The function sets the GL_TEXTURE_SWIZZLEs necessary to get the same - * behavior as the legacy format. - * - * @param[in] target texture target on which the swizzle will - * be set. - * @param[in,out] pFormat pointer to variable holding the base format of the - * texture. The new base format is written here. - * @param[in,out] pInternalformat pointer to variable holding the - * internalformat of the texture. The new - * internalformat is written here. - * @return void unrecognized formats will be passed on to OpenGL. Any loading - * error that arises will be handled in the usual way. - */ -static void convertFormat(GLenum target, GLenum* pFormat, GLenum* pInternalformat) { - switch (*pFormat) { - case GL_ALPHA: - { - GLint swizzle[] = {GL_ZERO, GL_ZERO, GL_ZERO, GL_RED}; - *pFormat = GL_RED; - glTexParameteriv(target, GL_TEXTURE_SWIZZLE_RGBA, swizzle); - switch (*pInternalformat) { - case GL_ALPHA: - case GL_ALPHA4: - case GL_ALPHA8: - *pInternalformat = GL_R8; - break; - case GL_ALPHA12: - case GL_ALPHA16: - *pInternalformat = GL_R16; - break; - } - } - case GL_LUMINANCE: - { - GLint swizzle[] = {GL_RED, GL_RED, GL_RED, GL_ONE}; - *pFormat = GL_RED; - glTexParameteriv(target, GL_TEXTURE_SWIZZLE_RGBA, swizzle); - switch (*pInternalformat) { - case GL_LUMINANCE: - case GL_LUMINANCE4: - case GL_LUMINANCE8: - *pInternalformat = GL_R8; - break; - case GL_LUMINANCE12: - case GL_LUMINANCE16: - *pInternalformat = GL_R16; - break; -#if 0 - // XXX Must avoid setting TEXTURE_SWIZZLE in these cases - // XXX Must manually swizzle. - case GL_SLUMINANCE: - case GL_SLUMINANCE8: - *pInternalformat = GL_SRGB8; - break; -#endif - } - break; - } - case GL_LUMINANCE_ALPHA: - { - GLint swizzle[] = {GL_RED, GL_RED, GL_RED, GL_GREEN}; - *pFormat = GL_RG; - glTexParameteriv(target, GL_TEXTURE_SWIZZLE_RGBA, swizzle); - switch (*pInternalformat) { - case GL_LUMINANCE_ALPHA: - case GL_LUMINANCE4_ALPHA4: - case GL_LUMINANCE6_ALPHA2: - case GL_LUMINANCE8_ALPHA8: - *pInternalformat = GL_RG8; - break; - case GL_LUMINANCE12_ALPHA4: - case GL_LUMINANCE12_ALPHA12: - case GL_LUMINANCE16_ALPHA16: - *pInternalformat = GL_RG16; - break; -#if 0 - // XXX Must avoid setting TEXTURE_SWIZZLE in these cases - // XXX Must manually swizzle. - case GL_SLUMINANCE_ALPHA: - case GL_SLUMINANCE8_ALPHA8: - *pInternalformat = GL_SRGB8_ALPHA8; - break; -#endif - } - break; - } - case GL_INTENSITY: - { - GLint swizzle[] = {GL_RED, GL_RED, GL_RED, GL_RED}; - *pFormat = GL_RED; - glTexParameteriv(target, GL_TEXTURE_SWIZZLE_RGBA, swizzle); - switch (*pInternalformat) { - case GL_INTENSITY: - case GL_INTENSITY4: - case GL_INTENSITY8: - *pInternalformat = GL_R8; - break; - case GL_INTENSITY12: - case GL_INTENSITY16: - *pInternalformat = GL_R16; - break; - } - break; - } - default: - break; - } -} -#endif /* SUPPORT_LEGACY_FORMAT_CONVERSION */ - -/* [cbdata] */ -typedef struct ktx_cbdata { - GLenum glTarget; - GLenum glFormat; - GLenum glInternalformat; - GLenum glType; - GLenum glError; - GLuint numLayers; -} ktx_cbdata; -/* [cbdata] */ - -/* [imageCallbacks] */ - -KTX_error_code KTXAPIENTRY -texImage1DCallback(int miplevel, int face, - int width, int height, - int depth, - ktx_uint32_t faceLodSize, - void* pixels, void* userdata) -{ - ktx_cbdata* cbData = (ktx_cbdata*)userdata; - - assert(pfGlTexImage1D != NULL); - pfGlTexImage1D(cbData->glTarget + face, miplevel, - cbData->glInternalformat, width, 0, - cbData->glFormat, cbData->glType, pixels); - - if ((cbData->glError = glGetError()) == GL_NO_ERROR) { - return KTX_SUCCESS; - } else { - return KTX_GL_ERROR; - } -} - -KTX_error_code KTXAPIENTRY -compressedTexImage1DCallback(int miplevel, int face, - int width, int height, - int depth, - ktx_uint32_t faceLodSize, - void* pixels, void* userdata) -{ - ktx_cbdata* cbData = (ktx_cbdata*)userdata; - - assert(pfGlCompressedTexImage1D != NULL); - pfGlCompressedTexImage1D(cbData->glTarget + face, miplevel, - cbData->glInternalformat, width, 0, - faceLodSize, pixels); - - if ((cbData->glError = glGetError()) == GL_NO_ERROR) { - return KTX_SUCCESS; - } else { - return KTX_GL_ERROR; - } -} - -KTX_error_code KTXAPIENTRY -texImage2DCallback(int miplevel, int face, - int width, int height, - int depth, - ktx_uint32_t faceLodSize, - void* pixels, void* userdata) -{ - ktx_cbdata* cbData = (ktx_cbdata*)userdata; - - glTexImage2D(cbData->glTarget + face, miplevel, - cbData->glInternalformat, width, - cbData->numLayers == 0 ? height : cbData->numLayers, 0, - cbData->glFormat, cbData->glType, pixels); - - if ((cbData->glError = glGetError()) == GL_NO_ERROR) { - return KTX_SUCCESS; - } else { - return KTX_GL_ERROR; - } -} - - -KTX_error_code KTXAPIENTRY -compressedTexImage2DCallback(int miplevel, int face, - int width, int height, - int depth, - ktx_uint32_t faceLodSize, - void* pixels, void* userdata) -{ - ktx_cbdata* cbData = (ktx_cbdata*)userdata; - GLenum glerror; - KTX_error_code result; - - // It is simpler to just attempt to load the format, rather than divine - // which formats are supported by the implementation. In the event of an - // error, software unpacking can be attempted. - glCompressedTexImage2D(cbData->glTarget + face, miplevel, - cbData->glInternalformat, width, - cbData->numLayers == 0 ? height : cbData->numLayers, - 0, - faceLodSize, pixels); - - glerror = glGetError(); -#if SUPPORT_SOFTWARE_ETC_UNPACK - // Renderion is returning INVALID_VALUE. Oops!! - if ((glerror == GL_INVALID_ENUM || glerror == GL_INVALID_VALUE) - && (cbData->glInternalformat == GL_ETC1_RGB8_OES - || (cbData->glInternalformat >= GL_COMPRESSED_R11_EAC - && cbData->glInternalformat <= GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC) - )) - { - GLubyte* unpacked; - GLenum format, internalformat, type; - - result = _ktxUnpackETC((GLubyte*)pixels, cbData->glInternalformat, - width, height, &unpacked, - &format, &internalformat, - &type, R16Formats, supportsSRGB); - if (result != KTX_SUCCESS) { - return result; - } - if (!(sizedFormats & _NON_LEGACY_FORMATS)) { - if (internalformat == GL_RGB8) - internalformat = GL_RGB; - else if (internalformat == GL_RGBA8) - internalformat = GL_RGBA; - } - glTexImage2D(cbData->glTarget + face, miplevel, - internalformat, width, - cbData->numLayers == 0 ? height : cbData->numLayers, 0, - format, type, unpacked); - - free(unpacked); - glerror = glGetError(); - } -#endif - - if ((cbData->glError = glerror) == GL_NO_ERROR) { - return KTX_SUCCESS; - } else { - return KTX_GL_ERROR; - } -} - -KTX_error_code KTXAPIENTRY -texImage3DCallback(int miplevel, int face, - int width, int height, - int depth, - ktx_uint32_t faceLodSize, - void* pixels, void* userdata) -{ - ktx_cbdata* cbData = (ktx_cbdata*)userdata; - - assert(pfGlTexImage3D != NULL); - pfGlTexImage3D(cbData->glTarget + face, miplevel, - cbData->glInternalformat, - width, height, - cbData->numLayers == 0 ? depth : cbData->numLayers, - 0, - cbData->glFormat, cbData->glType, pixels); - - if ((cbData->glError = glGetError()) == GL_NO_ERROR) { - return KTX_SUCCESS; - } else { - return KTX_GL_ERROR; - } -} - -KTX_error_code KTXAPIENTRY -compressedTexImage3DCallback(int miplevel, int face, - int width, int height, - int depth, - ktx_uint32_t faceLodSize, - void* pixels, void* userdata) -{ - ktx_cbdata* cbData = (ktx_cbdata*)userdata; - - assert(pfGlCompressedTexImage3D != NULL); - pfGlCompressedTexImage3D(cbData->glTarget + face, miplevel, - cbData->glInternalformat, - width, height, - cbData->numLayers == 0 ? depth : cbData->numLayers, - 0, - faceLodSize, pixels); - - if ((cbData->glError = glGetError()) == GL_NO_ERROR) { - return KTX_SUCCESS; - } else { - return KTX_GL_ERROR; - } -} -/* [imageCallbacks] */ - -/** - * @memberof ktxTexture - * @~English - * @brief Create a GL texture object from a ktxTexture object. - * - * Sets the texture object's GL_TEXTURE_MAX_LEVEL parameter according to the - * number of levels in the KTX data, provided the library has been compiled - * with a version of gl.h where GL_TEXTURE_MAX_LEVEL is defined. - * - * Unpacks compressed GL_ETC1_RGB8_OES and GL_ETC2_* format - * textures in software when the format is not supported by the GL context, - * provided the library has been compiled with SUPPORT_SOFTWARE_ETC_UNPACK - * defined as 1. - * - * It will also convert textures with legacy formats to their modern equivalents - * when the format is not supported by the GL context, provided the library - * has been compiled with SUPPORT_LEGACY_FORMAT_CONVERSION defined as 1. - * - * @param[in] This handle of the ktxTexture to upload. - * @param[in,out] pTexture name of the GL texture object to load. If NULL or if - * <tt>*pTexture == 0</tt> the function will generate - * a texture name. The function binds either the - * generated name or the name given in @p *pTexture - * to the texture target returned in @p *pTarget, - * before loading the texture data. If @p pTexture - * is not NULL and a name was generated, the generated - * name will be returned in *pTexture. - * @param[out] pTarget @p *pTarget is set to the texture target used. The - * target is chosen based on the file contents. - * @param[out] pGlerror @p *pGlerror is set to the value returned by - * glGetError when this function returns the error - * KTX_GL_ERROR. glerror can be NULL. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @p This or @p target is @c NULL or the size of - * a mip level is greater than the size of the - * preceding level. - * @exception KTX_GL_ERROR A GL error was raised by glBindTexture, - * glGenTextures or gl*TexImage*. The GL error - * will be returned in @p *glerror, if glerror - * is not @c NULL. - * @exception KTX_UNSUPPORTED_TEXTURE_TYPE The type of texture is not supported - * by the current OpenGL context. - */ -/* [loadGLTexture] */ -KTX_error_code -ktxTexture_GLUpload(ktxTexture* This, GLuint* pTexture, GLenum* pTarget, - GLenum* pGlerror) -{ - GLint previousUnpackAlignment; - GLuint texname; - GLenum target = GL_TEXTURE_2D; - int texnameUser; - KTX_error_code result = KTX_SUCCESS; - PFNKTXITERCB iterCb = NULL; - ktx_cbdata cbData; - int dimensions; - - if (pGlerror) - *pGlerror = GL_NO_ERROR; - - if (!This) { - return KTX_INVALID_VALUE; - } - - if (!pTarget) { - return KTX_INVALID_VALUE; - } - - if (contextProfile == 0) - discoverContextCapabilities(); - - /* KTX files require an unpack alignment of 4 */ - glGetIntegerv(GL_UNPACK_ALIGNMENT, &previousUnpackAlignment); - if (previousUnpackAlignment != KTX_GL_UNPACK_ALIGNMENT) { - glPixelStorei(GL_UNPACK_ALIGNMENT, KTX_GL_UNPACK_ALIGNMENT); - } - - cbData.glFormat = This->glFormat; - cbData.glInternalformat = This->glInternalformat; - cbData.glType = This->glType; - - texnameUser = pTexture && *pTexture; - if (texnameUser) { - texname = *pTexture; - } else { - glGenTextures(1, &texname); - } - - dimensions = This->numDimensions; - if (This->isArray) { - dimensions += 1; - if (This->numFaces == 6) { - /* _ktxCheckHeader should have caught this. */ - assert(This->numDimensions == 2); - target = GL_TEXTURE_CUBE_MAP_ARRAY; - } else { - switch (This->numDimensions) { - case 1: target = GL_TEXTURE_1D_ARRAY_EXT; break; - case 2: target = GL_TEXTURE_2D_ARRAY_EXT; break; - /* _ktxCheckHeader should have caught this. */ - default: assert(KTX_TRUE); - } - } - cbData.numLayers = This->numLayers; - } else { - if (This->numFaces == 6) { - /* _ktxCheckHeader should have caught this. */ - assert(This->numDimensions == 2); - target = GL_TEXTURE_CUBE_MAP; - } else { - switch (This->numDimensions) { - case 1: target = GL_TEXTURE_1D; break; - case 2: target = GL_TEXTURE_2D; break; - case 3: target = GL_TEXTURE_3D; break; - /* _ktxCheckHeader shold have caught this. */ - default: assert(KTX_TRUE); - } - } - cbData.numLayers = 0; - } - - if (target == GL_TEXTURE_1D && - ((This->isCompressed && (pfGlCompressedTexImage1D == NULL)) || - (!This->isCompressed && (pfGlTexImage1D == NULL)))) - { - return KTX_UNSUPPORTED_TEXTURE_TYPE; - } - - /* Reject 3D texture if unsupported. */ - if (target == GL_TEXTURE_3D && - ((This->isCompressed && (pfGlCompressedTexImage3D == NULL)) || - (!This->isCompressed && (pfGlTexImage3D == NULL)))) - { - return KTX_UNSUPPORTED_TEXTURE_TYPE; - } - - /* Reject cube map arrays if not supported. */ - if (target == GL_TEXTURE_CUBE_MAP_ARRAY && !supportsCubeMapArrays) { - return KTX_UNSUPPORTED_TEXTURE_TYPE; - } - - /* XXX Need to reject other array textures & cube maps if not supported. */ - - switch (dimensions) { - case 1: - iterCb = This->isCompressed - ? compressedTexImage1DCallback : texImage1DCallback; - break; - case 2: - iterCb = This->isCompressed - ? compressedTexImage2DCallback : texImage2DCallback; - break; - case 3: - iterCb = This->isCompressed - ? compressedTexImage3DCallback : texImage3DCallback; - break; - default: - assert(KTX_TRUE); - } - - glBindTexture(target, texname); - - // Prefer glGenerateMipmaps over GL_GENERATE_MIPMAP - if (This->generateMipmaps && (pfGlGenerateMipmap == NULL)) { - glTexParameteri(target, GL_GENERATE_MIPMAP, GL_TRUE); - } -#ifdef GL_TEXTURE_MAX_LEVEL - if (!This->generateMipmaps) - glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, This->numLevels - 1); -#endif - - if (target == GL_TEXTURE_CUBE_MAP) { - cbData.glTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X; - } else { - cbData.glTarget = target; - } - - cbData.glInternalformat = This->glInternalformat; - cbData.glFormat = This->glFormat; - if (!This->isCompressed) { -#if SUPPORT_LEGACY_FORMAT_CONVERSION - // If sized legacy formats are supported there is no need to convert. - // If only unsized formats are supported, there is no point in - // converting as the modern formats aren't supported either. - if (sizedFormats == _NON_LEGACY_FORMATS && supportsSwizzle) { - convertFormat(target, &cbData.glFormat, &cbData.glInternalformat); - } else if (sizedFormats == _NO_SIZED_FORMATS) - cbData.glInternalformat = This->glBaseInternalformat; -#else - // When no sized formats are supported, or legacy sized formats are not - // supported, must change internal format. - if (sizedFormats == _NO_SIZED_FORMATS - || (!(sizedFormats & _LEGACY_FORMATS) && - (This->glBaseInternalformat == GL_ALPHA - || This->glBaseInternalformat == GL_LUMINANCE - || This->glBaseInternalformat == GL_LUMINANCE_ALPHA - || This->glBaseInternalformat == GL_INTENSITY))) { - cbData.glInternalformat = This->glBaseInternalformat; - } -#endif - } - - if (ktxTexture_isActiveStream(This)) - result = ktxTexture_IterateLoadLevelFaces(This, iterCb, &cbData); - else - result = ktxTexture_IterateLevelFaces(This, iterCb, &cbData); - - /* GL errors are the only reason for failure. */ - if (result != KTX_SUCCESS && cbData.glError != GL_NO_ERROR) { - if (pGlerror) - *pGlerror = cbData.glError; - } - - /* restore previous GL state */ - if (previousUnpackAlignment != KTX_GL_UNPACK_ALIGNMENT) { - glPixelStorei(GL_UNPACK_ALIGNMENT, previousUnpackAlignment); - } - - if (result == KTX_SUCCESS) - { - // Prefer glGenerateMipmaps over GL_GENERATE_MIPMAP - if (This->generateMipmaps && pfGlGenerateMipmap) { - pfGlGenerateMipmap(target); - } - *pTarget = target; - if (pTexture) { - *pTexture = texname; - } - } else if (!texnameUser) { - glDeleteTextures(1, &texname); - } - return result; -} -/* [loadGLTexture] */ - -/** - * @~English - * @deprecated Use ktxTexture_CreateFromStdioStream() and ktxTexture_GLUpload(). - * @brief Create a GL texture object from KTX data in a stdio FILE stream. - * - * Sets the texture object's GL_TEXTURE_MAX_LEVEL parameter according to the - * number of levels in the ktxStream, provided the library has been compiled - * with a version of gl.h where GL_TEXTURE_MAX_LEVEL is defined. - * - * Unpacks compressed GL_ETC1_RGB8_OES and GL_ETC2_* format textures in - * software when the format is not supported by the GL context, provided the - * library has been compiled with SUPPORT_SOFTWARE_ETC_UNPACK defined as 1. - * - * Also converts texture with legacy formats to their modern equivalents - * when the format is not supported by the GL context, provided the library - * has been compiled with SUPPORT_LEGACY_FORMAT_CONVERSION defined as 1. - * - * @param[in] file stdio stream FILE pointer - * @param[in,out] pTexture name of the GL texture object to load. If NULL or if - * <tt>*pTexture == 0</tt> the function will generate - * a texture name. The function binds either the - * generated name or the name given in @p *pTexture - * to the texture target returned in @p *pTarget, - * before loading the texture data. If @p pTexture - * is not NULL and a name was generated, the generated - * name will be returned in *pTexture. - * @param[out] pTarget @p *pTarget is set to the texture target used. The - * target is chosen based on the file contents. - * @param[out] pDimensions If @p pDimensions is not NULL, the width, height and - * depth of the texture's base level are returned in - * the fields of the KTX_dimensions structure to which - * it points. - * @param[out] pIsMipmapped - * If @p pIsMipmapped is not NULL, @p *pIsMipmapped is - * set to GL_TRUE if the KTX texture is mipmapped, - * GL_FALSE otherwise. - * @param[out] pGlerror @p *pGlerror is set to the value returned by - * glGetError when this function returns the error - * KTX_GL_ERROR. glerror can be NULL. - * @param[in,out] pKvdLen If not NULL, @p *pKvdLen is set to the number of - * bytes of key-value data pointed at by @p *ppKvd. - * Must not be NULL, if @p ppKvd is not NULL. - * @param[in,out] ppKvd If not NULL, @p *ppKvd is set to the point to a - * block of memory containing key-value data read from - * the file. The application is responsible for freeing - * the memory. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @p target is @c NULL or the size of a mip - * level is greater than the size of the - * preceding level. - * @exception KTX_INVALID_OPERATION @p ppKvd is not NULL but pKvdLen is NULL. - * @exception KTX_UNEXPECTED_END_OF_FILE the file does not contain the - * expected amount of data. - * @exception KTX_OUT_OF_MEMORY Sufficient memory could not be allocated for the - * underlying ktxTexture object or to store the - * requested key-value data. - * @exception KTX_GL_ERROR A GL error was raised by glBindTexture, - * glGenTextures or gl*TexImage*. The GL error - * will be returned in @p *glerror, if glerror - * is not @c NULL. - * @exception KTX_UNSUPPORTED_TEXTURE_TYPE The type of texture is not supported - * by the current OpenGL context. - */ -KTX_error_code -ktxLoadTextureF(FILE* file, GLuint* pTexture, GLenum* pTarget, - KTX_dimensions* pDimensions, GLboolean* pIsMipmapped, - GLenum* pGlerror, - unsigned int* pKvdLen, unsigned char** ppKvd) -{ - ktxTexture* texture; - KTX_error_code result = KTX_SUCCESS; - - if (ppKvd != NULL && pKvdLen == NULL) - return KTX_INVALID_VALUE; - - result = ktxTexture_CreateFromStdioStream(file, - KTX_TEXTURE_CREATE_RAW_KVDATA_BIT, - &texture); - if (result != KTX_SUCCESS) - return result; - - result = ktxTexture_GLUpload(texture, pTexture, pTarget, pGlerror); - - if (result == KTX_SUCCESS) { - if (ppKvd != NULL) { - *ppKvd = texture->kvData; - *pKvdLen = texture->kvDataLen; - /* Remove to avoid it being freed when texture is destroyed. */ - texture->kvData = NULL; - texture->kvDataLen = 0; - } - if (pDimensions) { - pDimensions->width = texture->baseWidth; - pDimensions->height = texture->baseHeight; - pDimensions->depth = texture->baseDepth; - } - if (pIsMipmapped) { - if (texture->generateMipmaps || texture->numLevels > 1) - *pIsMipmapped = GL_TRUE; - else - *pIsMipmapped = GL_FALSE; - } - } - - ktxTexture_Destroy(texture); - - return result; -} - -/** - * @~English - * @deprecated Use ktxTexture_CreateFromNamedFile() and ktxTexture_GLUpload(). - * @brief Create a GL texture object from KTX data in a named file on disk. - * - * @param[in] filename pointer to a C string that contains the path of - * the file to load. - * @param[in,out] pTexture name of the GL texture object to load. See - * ktxLoadTextureF() for details. - * @param[out] pTarget @p *pTarget is set to the texture target used. See - * ktxLoadTextureF() for details. - * @param[out] pDimensions @p the texture's base level width depth and height - * are returned in structure to which this points. - * See ktxLoadTextureF() for details. - * @param[out] pIsMipmapped @p pIsMipMapped is set to indicate if the loaded - * texture is mipmapped. See ktxLoadTextureF() for - * details. - * @param[out] pGlerror @p *pGlerror is set to the value returned by - * glGetError when this function returns the error - * KTX_GL_ERROR. glerror can be NULL. - * @param[in,out] pKvdLen If not NULL, @p *pKvdLen is set to the number of - * bytes of key-value data pointed at by @p *ppKvd. - * Must not be NULL, if @p ppKvd is not NULL. - * @param[in,out] ppKvd If not NULL, @p *ppKvd is set to the point to a - * block of memory containing key-value data read from - * the file. The application is responsible for freeing - * the memory. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_FILE_OPEN_FAILED The specified file could not be opened. - * @exception KTX_INVALID_VALUE See ktxLoadTextureF() for causes. - * @exception KTX_INVALID_OPERATION See ktxLoadTextureF() for causes. - * @exception KTX_UNEXPECTED_END_OF_FILE See ktxLoadTextureF() for causes. - * @exception KTX_GL_ERROR See ktxLoadTextureF() for causes. - * @exception KTX_UNSUPPORTED_TEXTURE_TYPE See ktxLoadTextureF() for causes. - */ -KTX_error_code -ktxLoadTextureN(const char* const filename, GLuint* pTexture, GLenum* pTarget, - KTX_dimensions* pDimensions, GLboolean* pIsMipmapped, - GLenum* pGlerror, - unsigned int* pKvdLen, unsigned char** ppKvd) -{ - KTX_error_code result; - - FILE* file = fopen(filename, "rb"); - if (file) { - result = ktxLoadTextureF(file, pTexture, pTarget, pDimensions, - pIsMipmapped, pGlerror, pKvdLen, ppKvd); - fclose(file); - } else - result = KTX_FILE_OPEN_FAILED; - - return result; -} - -/** - * @~English - * @deprecated Use ktxTexture_CreateFromMemory() and ktxTexture_GLUpload(). - * @brief Create a GL texture object from KTX formatted data in memory. - * - * @param[in] bytes pointer to the array of bytes containing - * the KTX data to load. - * @param[in] size size of the memory array containing the - * KTX format data. - * @param[in,out] pTexture name of the GL texture object to load. See - * ktxLoadTextureF() for details. - * @param[out] pTarget @p *pTarget is set to the texture target used. See - * ktxLoadTextureF() for details. - * @param[out] pDimensions @p the texture's base level width depth and height - * are returned in structure to which this points. - * See ktxLoadTextureF() for details. - * @param[out] pIsMipmapped @p *pIsMipMapped is set to indicate if the loaded - * texture is mipmapped. See ktxLoadTextureF() for - * details. - * @param[out] pGlerror @p *pGlerror is set to the value returned by - * glGetError when this function returns the error - * KTX_GL_ERROR. glerror can be NULL. - * @param[in,out] pKvdLen If not NULL, @p *pKvdLen is set to the number of - * bytes of key-value data pointed at by @p *ppKvd. - * Must not be NULL, if @p ppKvd is not NULL. - * @param[in,out] ppKvd If not NULL, @p *ppKvd is set to the point to a - * block of memory containing key-value data read from - * the file. The application is responsible for freeing - * the memory. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_FILE_OPEN_FAILED The specified memory could not be opened as - * a file. - * @exception KTX_INVALID_VALUE See ktxLoadTextureF() for causes. - * @exception KTX_INVALID_OPERATION See ktxLoadTextureF() for causes. - * @exception KTX_UNEXPECTED_END_OF_FILE See ktxLoadTextureF() for causes. - * - * @exception KTX_GL_ERROR See ktxLoadTextureF() for causes. - * @exception KTX_UNSUPPORTED_TEXTURE_TYPE See ktxLoadTextureF() for causes. - */ -KTX_error_code -ktxLoadTextureM(const void* bytes, GLsizei size, GLuint* pTexture, - GLenum* pTarget, KTX_dimensions* pDimensions, - GLboolean* pIsMipmapped, GLenum* pGlerror, - unsigned int* pKvdLen, unsigned char** ppKvd) -{ - ktxTexture* texture; - KTX_error_code result = KTX_SUCCESS; - - if (ppKvd != NULL && pKvdLen == NULL) - return KTX_INVALID_VALUE; - - result = ktxTexture_CreateFromMemory(bytes, size, - KTX_TEXTURE_CREATE_RAW_KVDATA_BIT, - &texture); - - if (result != KTX_SUCCESS) - return result; - - result = ktxTexture_GLUpload(texture, pTexture, pTarget, pGlerror); - if (result == KTX_SUCCESS) { - if (ppKvd != NULL) { - *ppKvd = texture->kvData; - *pKvdLen = texture->kvDataLen; - /* Remove to avoid it being freed when texture is destroyed. */ - texture->kvData = NULL; - texture->kvDataLen = 0; - } - if (pDimensions) { - pDimensions->width = texture->baseWidth; - pDimensions->height = texture->baseHeight; - pDimensions->depth = texture->baseDepth; - } - if (pIsMipmapped) { - if (texture->generateMipmaps || texture->numLevels > 1) - *pIsMipmapped = GL_TRUE; - else - *pIsMipmapped = GL_FALSE; - } - } - - ktxTexture_Destroy(texture); - - return result; -} - -/** @} */ diff --git a/external/KTX-Software-master/lib/hashlist.c b/external/KTX-Software-master/lib/hashlist.c deleted file mode 100644 index 2afb20c..0000000 --- a/external/KTX-Software-master/lib/hashlist.c +++ /dev/null @@ -1,344 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4 expandtab: */ - -/* - * Copyright (c) 2010-2018 The Khronos Group Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @internal - * @file hashlist.c - * @~English - * - * @brief Functions for creating and using a hash list of key-value - * pairs. - * - * @author Mark Callow, HI Corporation - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <assert.h> - -// This is to avoid compile warnings. strlen is defined as returning -// size_t and is used by the uthash macros. This avoids having to -// make changes to uthash and a bunch of casts in this file. The -// casts would be required because the key and value lengths in KTX -// are specified as 4 byte quantities so we can't change _keyAndValue -// below to use size_t. -#define strlen(x) ((unsigned int)strlen(x)) - -#include "uthash.h" - -#include "ktx.h" -#include "ktxint.h" - - -/** - * @internal - * @struct ktxKVListEntry - * @brief Hash list entry structure - */ -typedef struct ktxKVListEntry { - unsigned int keyLen; /*!< Length of the key */ - char* key; /*!< Pointer to key string */ - unsigned int valueLen; /*!< Length of the value */ - void* value; /*!< Pointer to the value */ - UT_hash_handle hh; /*!< handle used by UT hash */ -} ktxKVListEntry; - - -/** - * @memberof ktxHashList @public - * @~English - * @brief Construct an empty hash list for storing key-value pairs. - * - * @param [in] pHead pointer to the location to write the list head. - */ -void -ktxHashList_Construct(ktxHashList* pHead) -{ - *pHead = NULL; -} - - -/** - * @memberof ktxHashList @public - * @~English - * @brief Destruct a hash list. - * - * All memory associated with the hash list's keys and values - * is freed. - * - * @param [in] pHead pointer to the hash list to be destroyed. - */ -void -ktxHashList_Destruct(ktxHashList* pHead) -{ - ktxKVListEntry* kv; - ktxKVListEntry* head = *pHead; - - for(kv = head; kv != NULL;) { - ktxKVListEntry* tmp = (ktxKVListEntry*)kv->hh.next; - HASH_DELETE(hh, head, kv); - free(kv); - kv = tmp; - } -} -/** - * @memberof ktxHashList @public - * @~English - * @brief Create an empty hash list for storing key-value pairs. - * - * @param [in,out] ppHl address of a variable in which to set a pointer to - * the newly created hash list. - * - * @return KTX_SUCCESS or one of the following error codes. - * @exception KTX_OUT_OF_MEMORY if not enough memory. - */ -KTX_error_code -ktxHashList_Create(ktxHashList** ppHl) -{ - ktxHashList* hl = (ktxHashList*)malloc(sizeof (ktxKVListEntry*)); - if (hl == NULL) - return KTX_OUT_OF_MEMORY; - - ktxHashList_Construct(hl); - *ppHl = hl; - return KTX_SUCCESS; -} - - -/** - * @memberof ktxHashList @public - * @~English - * @brief Destroy a hash list. - * - * All memory associated with the hash list's keys and values - * is freed. The hash list is also freed. - * - * @param [in] pHead pointer to the hash list to be destroyed. - */ -void -ktxHashList_Destroy(ktxHashList* pHead) -{ - ktxHashList_Destruct(pHead); - free(pHead); -} - - -/** - * @memberof ktxHashList @public - * @~English - * @brief Add a key value pair to a hash list. - * - * @param [in] pHead pointer to the head of the target hash list. - * @param [in] key pointer to the UTF8 NUL-terminated string to be used as the key. - * @param [in] valueLen the number of bytes of data in @p value. - * @param [in] value pointer to the bytes of data constituting the value. - * - * @return KTX_SUCCESS or one of the following error codes. - * @exception KTX_INVALID_VALUE if @p This, @p key or @p value are NULL, @p key is an - * empty string or @p valueLen == 0. - */ -KTX_error_code -ktxHashList_AddKVPair(ktxHashList* pHead, const char* key, unsigned int valueLen, const void* value) -{ - if (pHead && key && value && valueLen != 0) { - unsigned int keyLen = (unsigned int)strlen(key) + 1; - /* ktxKVListEntry* head = *(ktxKVListEntry**)This; */ - ktxKVListEntry* kv; - - if (keyLen == 1) - return KTX_INVALID_VALUE; /* Empty string */ - - /* Allocate all the memory as a block */ - kv = (ktxKVListEntry*)malloc(sizeof(ktxKVListEntry) + keyLen + valueLen); - /* Put key first */ - kv->key = (char *)kv + sizeof(ktxKVListEntry); - kv->keyLen = keyLen; - /* then value */ - kv->value = kv->key + keyLen; - kv->valueLen = valueLen; - memcpy(kv->key, key, keyLen); - memcpy(kv->value, value, valueLen); - - HASH_ADD_KEYPTR( hh, *pHead, kv->key, kv->keyLen-1, kv); - return KTX_SUCCESS; - } else - return KTX_INVALID_VALUE; -} - - -/** - * @memberof ktxHashList @public - * @~English - * @brief Looks up a key in a hash list and returns the value. - * - * @param [in] pHead pointer to the head of the target hash list. - * @param [in] key pointer to a UTF8 NUL-terminated string to find. - * @param [in,out] pValueLen @p *pValueLen is set to the number of bytes of - * data in the returned value. - * @param [in,out] ppValue @p *ppValue is set to the point to the value for - * @p key. - * - * @return KTX_SUCCESS or one of the following error codes. - * - * @exception KTX_INVALID_VALUE if @p This, @p key or @p pValueLen or @p ppValue - * is NULL. - * @exception KTX_NOT_FOUND an entry matching @p key was not found. - */ -KTX_error_code -ktxHashList_FindValue(ktxHashList *pHead, const char* key, unsigned int* pValueLen, void** ppValue) -{ - if (pHead && key && pValueLen && ppValue) { - ktxKVListEntry* kv; - /* ktxKVListEntry* head = *(ktxKVListEntry**)This; */ - - HASH_FIND_STR( *pHead, key, kv ); /* kv: output pointer */ - - if (kv) { - *pValueLen = kv->valueLen; - *ppValue = kv->value; - return KTX_SUCCESS; - } else - return KTX_NOT_FOUND; - } else - return KTX_INVALID_VALUE; -} - - -/** - * @memberof ktxHashList @public - * @~English - * @brief Serialize a hash list to a block of data suitable for writing - * to a file. - * - * The caller is responsible for freeing the data block returned by this - * function. - * - * @param [in] pHead pointer to the head of the target hash list. - * @param [in,out] pKvdLen @p *pKvdLen is set to the number of bytes of - * data in the returned data block. - * @param [in,out] ppKvd @p *ppKvd is set to the point to the block of - * memory containing the serialized data. - * - * @return KTX_SUCCESS or one of the following error codes. - * - * @exception KTX_INVALID_VALUE if @p This, @p pKvdLen or @p ppKvd is NULL. - * @exception KTX_OUT_OF_MEMORY there was not enough memory to serialize the - * data. - */ -KTX_error_code -ktxHashList_Serialize(ktxHashList* pHead, - unsigned int* pKvdLen, unsigned char** ppKvd) -{ - - if (pHead && pKvdLen && ppKvd) { - ktxKVListEntry* kv; - unsigned int bytesOfKeyValueData = 0; - unsigned int keyValueLen; - unsigned char* sd; - char padding[4] = {0, 0, 0, 0}; - - for (kv = *pHead; kv != NULL; kv = kv->hh.next) { - /* sizeof(sd) is to make space to write keyAndValueByteSize */ - keyValueLen = kv->keyLen + kv->valueLen + sizeof(ktx_uint32_t); - /* Add valuePadding */ - keyValueLen = _KTX_PAD4(keyValueLen); - bytesOfKeyValueData += keyValueLen; - } - sd = malloc(bytesOfKeyValueData); - if (!sd) - return KTX_OUT_OF_MEMORY; - - *pKvdLen = bytesOfKeyValueData; - *ppKvd = sd; - - for (kv = *pHead; kv != NULL; kv = kv->hh.next) { - int padLen; - - keyValueLen = kv->keyLen + kv->valueLen; - *(ktx_uint32_t*)sd = keyValueLen; - sd += sizeof(ktx_uint32_t); - memcpy(sd, kv->key, kv->keyLen); - sd += kv->keyLen; - memcpy(sd, kv->value, kv->valueLen); - sd += kv->valueLen; - padLen = _KTX_PAD4_LEN(keyValueLen); - memcpy(sd, padding, padLen); - sd += padLen; - } - return KTX_SUCCESS; - } else - return KTX_INVALID_VALUE; -} - - -/** - * @memberof ktxHashList @public - * @~English - * @brief Construct a hash list from a block of serialized key-value - * data read from a file. - * @note The bytes of the 32-bit key-value lengths within the serialized data - * are expected to be in native endianness. - * - * @param [in] pHead pointer to the head of the target hash list. - * @param [in] kvdLen the length of the serialized key-value data. - * @param [in] pKvd pointer to the serialized key-value data. - * table. - * - * @return KTX_SUCCESS or one of the following error codes. - * - * @exception KTX_INVALID_OPERATION if @p pHead does not point to an empty list. - * @exception KTX_INVALID_VALUE if @p pKvd or @p pHt is NULL or kvdLen == 0. - * @exception KTX_OUT_OF_MEMORY there was not enough memory to create the hash - * table. - */ -KTX_error_code -ktxHashList_Deserialize(ktxHashList* pHead, unsigned int kvdLen, void* pKvd) -{ - char* src = pKvd; - KTX_error_code result; - - if (kvdLen == 0 || pKvd == NULL || pHead == NULL) - return KTX_INVALID_VALUE; - - if (*pHead != NULL) - return KTX_INVALID_OPERATION; - - result = KTX_SUCCESS; - while (result == KTX_SUCCESS && src < (char *)pKvd + kvdLen) { - char* key; - unsigned int keyLen; - void* value; - ktx_uint32_t keyAndValueByteSize = *((ktx_uint32_t*)src); - - src += sizeof(keyAndValueByteSize); - key = src; - keyLen = (unsigned int)strlen(key) + 1; - value = key + keyLen; - - result = ktxHashList_AddKVPair(pHead, key, keyAndValueByteSize - keyLen, - value); - if (result == KTX_SUCCESS) { - src += _KTX_PAD4(keyAndValueByteSize); - } - } - return result; -} - - diff --git a/external/KTX-Software-master/lib/hashtable.c b/external/KTX-Software-master/lib/hashtable.c deleted file mode 100644 index e9a42f1..0000000 --- a/external/KTX-Software-master/lib/hashtable.c +++ /dev/null @@ -1,97 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4 expandtab: */ - -/** - * @internal - * @file hashtable.c - * @~English - * - * @brief Functions for backward compatibility with libktx v1 - * hashtable API. - * - * @author Mark Callow, www.edgewise-consulting.com - */ - -/* - * ©2018 Mark Callow. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#include "ktx.h" - -/** - * @memberof KTX_hash_table - * @~English - * @deprecated Use ktxHashList_Create(). - */ -KTX_hash_table -ktxHashTable_Create(void) { - ktxHashList* hl; - (void)ktxHashList_Create(&hl); - return hl; -} - -/** - * @memberof KTX_hash_table - * @~English - * @deprecated Use ktxHashList_Serialize(). - * @brief Serializes the hash table to a block of memory suitable for - * writing to a KTX file. - */ -KTX_error_code -ktxHashTable_Serialize(KTX_hash_table This, - unsigned int* kvdLen, unsigned char** kvd) -{ - return ktxHashList_Serialize(This, kvdLen, kvd); -} - -/** - * @memberof KTX_hash_table - * @deprecated Use ktxHashList_Deserialize(). - * @~English - * @brief Create a new hash table from a block of serialized key-value - * data read from a file. - * - * The caller is responsible for freeing the returned hash table. - * - * @note The bytes of the 32-bit key-value lengths within the serialized data - * are expected to be in native endianness. - * - * @param[in] kvdLen the length of the serialized key-value data. - * @param[in] pKvd pointer to the serialized key-value data. - * @param[in,out] pHt @p *pHt is set to point to the created hash - * table. - * - * @return KTX_SUCCESS or one of the following error codes. - * - * @exception KTX_INVALID_VALUE if @p pKvd or @p pHt is NULL or kvdLen == 0. - * @exception KTX_OUT_OF_MEMORY there was not enough memory to create the hash - * table. - */ -KTX_error_code -ktxHashTable_Deserialize(unsigned int kvdLen, void* pKvd, KTX_hash_table* pHt) -{ - ktxHashList* pHl; - KTX_error_code result; - result = ktxHashList_Create(&pHl); - if (result != KTX_SUCCESS) - return result; - - result = ktxHashList_Deserialize(pHl, kvdLen, pKvd); - if (result == KTX_SUCCESS) - *pHt = pHl; - return result; -} - diff --git a/external/KTX-Software-master/lib/ktxgl.h b/external/KTX-Software-master/lib/ktxgl.h deleted file mode 100644 index c4674d4..0000000 --- a/external/KTX-Software-master/lib/ktxgl.h +++ /dev/null @@ -1,228 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4 expandtab: */ - -/* $Id: 94277b50a14992fc9e5a6e011ef5f9cdf28f0d89 $ */ - -/* - * Copyright (c) 2010-2018 The Khronos Group Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -/* - * Author: Mark Callow from original code by Georg Kolling - */ - -#ifndef KTXGL_H -#define KTXGL_H - -#ifndef SUPPORT_LEGACY_FORMAT_CONVERSION - #if KTX_OPENGL - #define SUPPORT_LEGACY_FORMAT_CONVERSION 1 - #elif KTX_OPENGL_ES1 - /* ES1, ES2 & ES3 support the legacy formats */ - #define SUPPORT_LEGACY_FORMAT_CONVERSION 0 - #endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * These defines are needed to compile the KTX library. When - * these things are not available in the GL header in use at - * compile time, the library provides its own support, handles - * the expected run-time errors or just needs the token value. - */ -#ifndef GL_LUMINANCE -#define GL_ALPHA 0x1906 -#define GL_LUMINANCE 0x1909 -#define GL_LUMINANCE_ALPHA 0x190A -#endif -#ifndef GL_INTENSITY -#define GL_INTENSITY 0x8049 -#endif -#if SUPPORT_LEGACY_FORMAT_CONVERSION -/* For loading legacy KTX files. */ -#ifndef GL_LUMINANCE4 -#define GL_ALPHA4 0x803B -#define GL_ALPHA8 0x803C -#define GL_ALPHA12 0x803D -#define GL_ALPHA16 0x803E -#define GL_LUMINANCE4 0x803F -#define GL_LUMINANCE8 0x8040 -#define GL_LUMINANCE12 0x8041 -#define GL_LUMINANCE16 0x8042 -#define GL_LUMINANCE4_ALPHA4 0x8043 -#define GL_LUMINANCE6_ALPHA2 0x8044 -#define GL_LUMINANCE8_ALPHA8 0x8045 -#define GL_LUMINANCE12_ALPHA4 0x8046 -#define GL_LUMINANCE12_ALPHA12 0x8047 -#define GL_LUMINANCE16_ALPHA16 0x8048 -#endif -#ifndef GL_INTENSITY4 -#define GL_INTENSITY4 0x804A -#define GL_INTENSITY8 0x804B -#define GL_INTENSITY12 0x804C -#define GL_INTENSITY16 0x804D -#endif -#ifndef GL_SLUMINANCE -#define GL_SLUMINANCE_ALPHA 0x8C44 -#define GL_SLUMINANCE8_ALPHA8 0x8C45 -#define GL_SLUMINANCE 0x8C46 -#define GL_SLUMINANCE8 0x8C47 -#endif -#endif /* SUPPORT_LEGACY_FORMAT_CONVERSION */ -#ifndef GL_TEXTURE_1D -#define GL_TEXTURE_1D 0x0DE0 -#endif -#ifndef GL_TEXTURE_3D -#define GL_TEXTURE_3D 0x806F -#endif -#ifndef GL_TEXTURE_CUBE_MAP -#define GL_TEXTURE_CUBE_MAP 0x8513 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 -#endif -#ifndef GL_TEXTURE_CUBE_MAP_ARRAY -#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 -#endif -/* from GL_EXT_texture_array */ -#ifndef GL_TEXTURE_1D_ARRAY_EXT -#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 -#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A -#endif -#ifndef GL_GENERATE_MIPMAP -#define GL_GENERATE_MIPMAP 0x8191 -#endif - -/* For writer.c */ -#if !defined(GL_BGR) -#define GL_BGR 0x80E0 -#define GL_BGRA 0x80E1 -#endif -#if !defined(GL_RED_INTEGER) -#define GL_RED_INTEGER 0x8D94 -#define GL_RGB_INTEGER 0x8D98 -#define GL_RGBA_INTEGER 0x8D99 -#endif -#if !defined(GL_GREEN_INTEGER) -#define GL_GREEN_INTEGER 0x8D95 -#define GL_BLUE_INTEGER 0x8D96 -#endif -#if !defined(GL_ALPHA_INTEGER) -#define GL_ALPHA_INTEGER 0x8D97 -#endif -#if !defined (GL_BGR_INTEGER) -#define GL_BGR_INTEGER 0x8D9A -#define GL_BGRA_INTEGER 0x8D9B -#endif -#if !defined(GL_INT) -#define GL_INT 0x1404 -#define GL_UNSIGNED_INT 0x1405 -#endif -#if !defined(GL_HALF_FLOAT) -typedef unsigned short GLhalf; -#define GL_HALF_FLOAT 0x140B -#endif -#if !defined(GL_UNSIGNED_BYTE_3_3_2) -#define GL_UNSIGNED_BYTE_3_3_2 0x8032 -#define GL_UNSIGNED_INT_8_8_8_8 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2 0x8036 -#endif -#if !defined(GL_UNSIGNED_BYTE_2_3_3_REV) -#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 -#endif -#if !defined(GL_UNSIGNED_INT_24_8) -#define GL_DEPTH_STENCIL 0x84F9 -#define GL_UNSIGNED_INT_24_8 0x84FA -#endif -#if !defined(GL_UNSIGNED_INT_5_9_9_9_REV) -#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E -#endif -#if !defined(GL_UNSIGNED_INT_10F_11F_11F_REV) -#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B -#endif -#if !defined (GL_FLOAT_32_UNSIGNED_INT_24_8_REV) -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD -#endif - -#ifndef GL_ETC1_RGB8_OES -#define GL_ETC1_RGB8_OES 0x8D64 -#endif - -#if SUPPORT_SOFTWARE_ETC_UNPACK -#ifndef GL_COMPRESSED_R11_EAC -#define GL_COMPRESSED_R11_EAC 0x9270 -#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 -#define GL_COMPRESSED_RG11_EAC 0x9272 -#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 -#define GL_COMPRESSED_RGB8_ETC2 0x9274 -#define GL_COMPRESSED_SRGB8_ETC2 0x9275 -#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 -#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 -#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 -#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 -#endif -#ifndef GL_R16_SNORM -#define GL_R16_SNORM 0x8F98 -#define GL_RG16_SNORM 0x8F99 -#endif -#ifndef GL_RED -#define GL_RED 0x1903 -#define GL_GREEN 0x1904 -#define GL_BLUE 0x1905 -#define GL_RG 0x8227 -#define GL_RG_INTEGER 0x8228 -#endif -#ifndef GL_R16 -#define GL_R16 0x822A -#define GL_RG16 0x822C -#endif -#ifndef GL_RGB8 -#define GL_RGB8 0x8051 -#define GL_RGBA8 0x8058 -#endif -#ifndef GL_SRGB8 -#define GL_SRGB8 0x8C41 -#define GL_SRGB8_ALPHA8 0x8C43 -#endif -#endif - -#ifndef GL_MAJOR_VERSION -#define GL_MAJOR_VERSION 0x821B -#define GL_MINOR_VERSION 0x821C -#endif - -#ifndef GL_CONTEXT_PROFILE_MASK -#define GL_CONTEXT_PROFILE_MASK 0x9126 -#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 -#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 -#endif - -#ifndef GL_NUM_EXTENSIONS -#define GL_NUM_EXTENSIONS 0x821D -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* KTXGL_H */ diff --git a/external/KTX-Software-master/lib/ktxint.h b/external/KTX-Software-master/lib/ktxint.h deleted file mode 100644 index a7e27fb..0000000 --- a/external/KTX-Software-master/lib/ktxint.h +++ /dev/null @@ -1,205 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4 expandtab: */ - -/* $Id: 3dd768b381113d67ca7e4bde10e6252900bff845 $ */ - -/* - * Copyright (c) 2010-2018 The Khronos Group Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -/* - * Author: Mark Callow from original code by Georg Kolling - */ - -#ifndef KTXINT_H -#define KTXINT_H - -/* Define this to include the ETC unpack software in the library. */ -#ifndef SUPPORT_SOFTWARE_ETC_UNPACK - /* Include for all GL versions because have seen OpenGL ES 3 - * implementaions that do not support ETC1 (ARM Mali emulator v1.0)! - */ - #define SUPPORT_SOFTWARE_ETC_UNPACK 1 -#endif - -#ifndef MAX -#define MAX(x, y) (((x) > (y)) ? (x) : (y)) -#endif - -#define KTX2_IDENTIFIER_REF { 0xAB, 0x4B, 0x54, 0x58, 0x20, 0x32, 0x30, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A } -#define KTX2_HEADER_SIZE (64) - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @internal - * @brief used to pass GL context capabilites to subroutines. - */ -#define _KTX_NO_R16_FORMATS 0x0 -#define _KTX_R16_FORMATS_NORM 0x1 -#define _KTX_R16_FORMATS_SNORM 0x2 -#define _KTX_ALL_R16_FORMATS (_KTX_R16_FORMATS_NORM | _KTX_R16_FORMATS_SNORM) -extern GLint _ktxR16Formats; -extern GLboolean _ktxSupportsSRGB; - -/** - * @internal - * @~English - * @brief KTX file header - * - * See the KTX specification for descriptions - */ -typedef struct KTX_header { - ktx_uint8_t identifier[12]; - ktx_uint32_t endianness; - ktx_uint32_t glType; - ktx_uint32_t glTypeSize; - ktx_uint32_t glFormat; - ktx_uint32_t glInternalformat; - ktx_uint32_t glBaseInternalformat; - ktx_uint32_t pixelWidth; - ktx_uint32_t pixelHeight; - ktx_uint32_t pixelDepth; - ktx_uint32_t numberOfArrayElements; - ktx_uint32_t numberOfFaces; - ktx_uint32_t numberOfMipmapLevels; - ktx_uint32_t bytesOfKeyValueData; -} KTX_header; - -/* This will cause compilation to fail if the struct size doesn't match */ -typedef int KTX_header_SIZE_ASSERT [sizeof(KTX_header) == KTX_HEADER_SIZE]; - -/** - * @internal - * @~English - * @brief Structure for supplemental information about the texture. - * - * _ktxCheckHeader returns supplemental information about the texture in this - * structure that is derived during checking of the file header. - */ -typedef struct KTX_supplemental_info -{ - ktx_uint8_t compressed; - ktx_uint8_t generateMipmaps; - ktx_uint16_t textureDimension; -} KTX_supplemental_info; -/** - * @internal - * @var ktx_uint8_t KTX_supplemental_info::compressed - * @~English - * @brief KTX_TRUE, if this a compressed texture, KTX_FALSE otherwise? - */ -/** - * @internal - * @var ktx_uint8_t KTX_supplemental_info::generateMipmaps - * @~English - * @brief KTX_TRUE, if mipmap generation is required, KTX_FALSE otherwise. - */ -/** - * @internal - * @var ktx_uint16_t KTX_supplemental_info::textureDimension - * @~English - * @brief The number of dimensions, 1, 2 or 3, of data in the texture image. - */ - -/* - * @internal - * CheckHeader - * - * Reads the KTX file header and performs some sanity checking on the values - */ -KTX_error_code _ktxCheckHeader(KTX_header* pHeader, - KTX_supplemental_info* pSuppInfo); - -/* - * SwapEndian16: Swaps endianness in an array of 16-bit values - */ -void _ktxSwapEndian16(ktx_uint16_t* pData16, int count); - -/* - * SwapEndian32: Swaps endianness in an array of 32-bit values - */ -void _ktxSwapEndian32(ktx_uint32_t* pData32, int count); - -/* - * UnpackETC: uncompresses an ETC compressed texture image - */ -KTX_error_code _ktxUnpackETC(const GLubyte* srcETC, const GLenum srcFormat, - ktx_uint32_t active_width, ktx_uint32_t active_height, - GLubyte** dstImage, - GLenum* format, GLenum* internalFormat, GLenum* type, - GLint R16Formats, GLboolean supportsSRGB); - -/* - * Pad nbytes to next multiple of n - */ -/* Equivalent to n * ceil(nbytes / n) */ -#define _KTX_PADN(n, nbytes) (nbytes + (n-1) & ~(ktx_uint32_t)(n-1)) -/* - * Calculate bytes of of padding needed to reach next multiple of n. - */ -/* Equivalent to (n * ceil(nbytes / n)) - nbytes */ -#define _KTX_PADN_LEN(n, nbytes) ((n-1) - (nbytes + (n-1) & (n-1))) - -/* - * Pad nbytes to next multiple of 4 - */ -#define _KTX_PAD4(nbytes) _KTX_PADN(4, nbytes) -/* - * Calculate bytes of of padding needed to reach next multiple of 4. - */ -#define _KTX_PAD4_LEN(nbytes) _KTX_PADN_LEN(4, nbytes) - -/* - * Pad nbytes to KTX_GL_UNPACK_ALIGNMENT - */ -#define _KTX_PAD_UNPACK_ALIGN(nbytes) \ - _KTX_PADN(KTX_GL_UNPACK_ALIGNMENT, nbytes) -/* - * Calculate bytes of of padding needed to reach KTX_GL_UNPACK_ALIGNMENT. - */ -#define _KTX_PAD_UNPACK_ALIGN_LEN(nbytes) \ - _KTX_PADN_LEN(KTX_GL_UNPACK_ALIGNMENT, nbytes) - -/* - ====================================== - Internal ktxTexture functions - ====================================== -*/ - -KTX_error_code -ktxTexture_iterateLoadedImages(ktxTexture* This, PFNKTXITERCB iterCb, - void* userdata); -KTX_error_code -ktxTexture_iterateSourceImages(ktxTexture* This, PFNKTXITERCB iterCb, - void* userdata); - -ktx_uint32_t ktxTexture_glTypeSize(ktxTexture* This); -ktx_size_t ktxTexture_imageSize(ktxTexture* This, ktx_uint32_t level); -ktx_bool_t ktxTexture_isActiveStream(ktxTexture* This); -ktx_size_t ktxTexture_levelSize(ktxTexture* This, ktx_uint32_t level); -ktx_size_t ktxTexture_faceLodSize(ktxTexture* This, ktx_uint32_t level); -void ktxTexture_rowInfo(ktxTexture* This, ktx_uint32_t level, - ktx_uint32_t* numRows, ktx_uint32_t* rowBytes, - ktx_uint32_t* rowPadding); - -#ifdef __cplusplus -} -#endif - -#endif /* KTXINT_H */ diff --git a/external/KTX-Software-master/lib/libktx.gypi b/external/KTX-Software-master/lib/libktx.gypi deleted file mode 100644 index 06c019b..0000000 --- a/external/KTX-Software-master/lib/libktx.gypi +++ /dev/null @@ -1,226 +0,0 @@ -## -# @internal -# @copyright © 2015, Mark Callow. For license see LICENSE.md. -# -# @brief Generate project to build KTX library for OpenGL. -# -{ - 'variables': { - 'sources': [ - # .h files are included so they will appear in IDEs' file lists. - '../include/ktx.h', - 'checkheader.c', - 'errstr.c', - 'etcdec.cxx', - 'etcunpack.cxx', - 'filestream.c', - 'filestream.h', - 'gl_format.h', - 'gl_funcptrs.h', - 'gles1_funcptrs.h', - 'gles2_funcptrs.h', - 'gles3_funcptrs.h', - 'glloader.c', - 'hashlist.c', - 'hashtable.c', - 'ktxgl.h', - 'ktxint.h', - 'memstream.c', - 'memstream.h', - 'stream.h', - 'swap.c', - 'texture.c', - 'uthash.h', - 'writer.c', - 'writer_v1.c' - ], - # Use _files to get the names relativized - 'vksource_files': [ - '../include/ktxvulkan.h', - 'vk_format.h', - 'vkloader.c', - 'vk_funclist.inl', - 'vk_funcs.c', - 'vk_funcs.h' - ], - 'include_dirs': [ - '../include', - '../other_include', - ], - }, # variables - - 'includes': [ - '../gyp_include/libgl.gypi', - '../gyp_include/libvulkan.gypi', - ], - 'targets': [ - { - 'target_name': 'libktx.gl', - 'type': '<(library)', - 'cflags': [ '-std=c99' ], - 'defines': [ 'KTX_OPENGL=1' ], - 'direct_dependent_settings': { - 'include_dirs': [ '<@(include_dirs)' ], - }, - 'include_dirs': [ '<@(include_dirs)' ], - 'mac_bundle': 0, - 'dependencies': [ 'vulkan_headers' ], - 'sources': [ - '<@(sources)', - '<@(vksource_files)', - ], - 'conditions': [ - ['_type == "shared_library"', { - 'dependencies': [ 'libgl', 'libvulkan.lazy' ], - 'conditions': [ - ['OS == "mac" or OS == "ios"', { - 'direct_dependent_settings': { - 'target_conditions': [ - ['_mac_bundle == 1', { - 'copies': [{ - 'xcode_code_sign': 1, - 'destination': '<(PRODUCT_DIR)/$(FRAMEWORKS_FOLDER_PATH)', - 'files': [ '<(PRODUCT_DIR)/<(_target_name)<(SHARED_LIB_SUFFIX)' ], - }], # copies - 'xcode_settings': { - # Tell DYLD where to search for this dylib. - # "man dyld" for more information. - 'LD_RUNPATH_SEARCH_PATHS': [ '@executable_path/../Frameworks' ], - }, - }, { - 'xcode_settings': { - 'LD_RUNPATH_SEARCH_PATHS': [ '@executable_path' ], - }, - }], # _mac_bundle == 1 - ], # target_conditions - }, # direct_dependent_settings - 'sources!': [ - 'vk_funclist.inl', - 'vk_funcs.c', - 'vk_funcs.h', - ], - 'xcode_settings': { - # This is so dyld can find the dylib when it is installed by - # the copy command above. - 'INSTALL_PATH': '@rpath', - }, - }, 'OS == "linux"', { - 'defines': [ 'KTX_USE_FUNCPTRS_FOR_VULKAN' ], - 'dependencies!': [ 'libvulkan.lazy' ], - }] # OS == "mac or OS == "ios" - ], # conditions - }] # _type == "shared_library" - ], # conditions - }, # libktx.gl target - { - 'target_name': 'libktx.es1', - 'type': 'static_library', - 'cflags': [ '-std=c99' ], - 'defines': [ 'KTX_OPENGL_ES1=1' ], - 'direct_dependent_settings': { - 'include_dirs': [ '<@(include_dirs)' ], - }, - 'sources': [ '<@(sources)' ], - 'include_dirs': [ '<@(include_dirs)' ], - }, # libktx.es1 - { - 'target_name': 'libktx.es3', - 'type': 'static_library', - 'cflags': [ '-std=c99' ], - 'defines': [ 'KTX_OPENGL_ES3=1' ], - 'dependencies': [ 'vulkan_headers' ], - 'direct_dependent_settings': { - 'include_dirs': [ '<@(include_dirs)' ], - }, - 'sources': [ - '<@(sources)', - '<@(vksource_files)', - ], - 'include_dirs': [ '<@(include_dirs)' ], - }, # libktx.es3 - ], # targets - 'conditions': [ - ['OS == "linux" or OS == "mac" or OS == "win"', { - # Can only build doc on desktops - 'targets': [ - { - 'target_name': 'libktx.doc', - 'type': 'none', - 'variables': { - 'variables': { # level 2 - 'output_dir': '../build/docs', - }, - 'output_dir': '<(output_dir)', - 'doxyConfig': 'libktx.doxy', - 'timestamp': '<(output_dir)/.libktx_gentimestamp', - }, - 'actions': [ - { - 'action_name': 'buildLibktxDoc', - 'message': 'Generating libktx documentation with Doxygen', - 'inputs': [ - '../<(doxyConfig)', - '../runDoxygen', - '../lib/mainpage.md', - '../LICENSE.md', - '../TODO.md', - '<@(sources)', - '<@(vksource_files)', - ], - # If other partial Doxygen outputs are included, e.g. - # (<(output_dir)/html/libktx), CMake's make generator - # on Linux (at least), makes timestamp dependent on - # those other outputs. If those outputs exist, then - # neither timestamp nor the document is updated. - 'outputs': [ '<(timestamp)' ], - # doxygen must be run in the top-level project directory - # so that ancestors of that directory will be removed - # from paths displayed in the documentation. That is - # the directory where the .doxy and .gyp files are stored. - # - # With Xcode, the current directory during project - # build is one we need so we're good to go. However - # we need to spawn another shell with -l so the - # startup (.bashrc, etc) files will be read. - # - # With MSVS the working directory will be the - # location of the vcxproj file. However when the - # action is using bash ('msvs_cygwin_shell': '1', - # the default, is set) no path relativization is - # performed on any command arguments. If forced, by - # using variable names such as '*_dir', paths will be - # made relative to the location of the .gyp file. - # - # A setup_env.bat file is run before the command. - # Apparently that .bat file is expected to be in the - # same location as the .gyp and to cd to - # its directory. That makes things work. - # - # Note that the same setup_env.bat is run by - # rules but rules relativize paths to the vcxproj - # location so cd to the .gyp home breaks rules. - # Therefore in rules set 'msvs_cygwin_shell': '0. - # - # If using cmd.exe ('msvs_cygwin_shell': '0') - # the MSVS generator will relativize to the vcxproj - # location *all* command arguments, that do not look - # like options. - # - # With `make`, cmake, etc, like Xcode, the current - # directory during project build is the one we need. - 'msvs_cygwin_shell': 1, - 'action': [ - './runDoxygen', - '-t', '<(timestamp)', - '-o', '<(output_dir)/html', - '<(doxyConfig)', - ], - }, # buildDoc action - ], # actions - }, # libktx.doc - ], # targets - }], # 'OS == "linux" or OS == "mac" or OS == "win"' - ], # conditions -} - -# vim:ai:ts=4:sts=4:sw=2:expandtab:textwidth=70 diff --git a/external/KTX-Software-master/lib/mainpage.md b/external/KTX-Software-master/lib/mainpage.md deleted file mode 100644 index b50ba9e..0000000 --- a/external/KTX-Software-master/lib/mainpage.md +++ /dev/null @@ -1,214 +0,0 @@ -Introduction {#mainpage} -========= - -libktx is a small library of functions for creating and reading KTX (Khronos -TeXture) files and instantiating OpenGL® and OpenGL® ES -textures and Vulkan images from them. - -For information about the KTX format see the -<a href="http://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/"> -formal specification.</a> - -The library is open source software. Source code is available at -<a href="https://github.com/KhronosGroup/KTX">GitHub</a>. Most of the source -code and the documentation is licensed under the Apache 2.0 license. See @ref license -for details. When distributing the library, whether in source or binary form, this -documentation must be included in the distribution or otherwise made available to -recipients. - -See @ref libktx_history for the list of changes. - -See @ref todo for the current To Do list. - -@authors -Mark Callow, <a href="http://www.edgewise-consulting.com">Edgewise Consulting</a>, - formerly at <a href="http://www.hicorp.co.jp">HI Corporation</a>\n -Georg Kolling, <a href="http://www.imgtec.com">Imagination Technology</a>\n -Jacob Ström, <a href="http://www.ericsson.com">Ericsson AB</a> - -@version 3.0.0 - -$Date$ - -# Usage Overview {#overview} - -## Reading a KTX file for non-GL and non-Vulkan Use {#readktx} - -~~~~~~~~~~~~~~~~{.c} -#include <ktx.h> - -ktxTexture* texture; -KTX_error_code result; -ktx_size_t offset; -ktx_uint8_t* image; -ktx_uint32_t level, layer, faceSlice; - -result = ktxTexture_CreateFromNamedFile("mytex3d.ktx", - KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT, - &texture); - -// Retrieve information about the texture from fields in the ktxTexture -// such as: -ktx_uint32 numLevels = texture->numLevels; -ktx_uint32 baseWidth = texture->baseWidth; -ktx_bool_t isArray = texture->isArray; - -// Retrieve a pointer to the image for a specific mip level, array layer -// & face or depth slice. -level = 1; layer = 0; faceSlice = 3; -result = ktxTexture_GetImageOffset(texture, level, layer, faceSlice, &offset); -image = ktxTexture_GetData(texture) + offset; -// ... -// Do something with the texture image. -// ... -ktxTexture_Destroy(texture); -~~~~~~~~~~~~~~~~ - -## Creating a GL texture object from a KTX file. {#createGL} - -~~~~~~~~~~~~~~~~{.c} -#include <ktx.h> - -ktxTexture* kTexture; -KTX_error_code result; -ktx_size_t offset; -ktx_uint8_t* image; -ktx_uint32_t level, layer, faceSlice; -GLuint texture = 0; -GLenum target, glerror; - -result = ktxTexture_CreateFromNamedFile("mytex3d.ktx", - KTX_TEXTURE_CREATE_NO_FLAGS, - &kTexture); -glGenTextures(1, &texture); // Optional. GLUpload can generate a texture. -result = ktxtexture_GLUpload(kTexture, &texture, &target, &glerror); -ktxTexture_Destroy(texture); -// ... -// GL rendering using the texture -// ... -~~~~~~~~~~~~~~~~ - -## Creating a Vulkan image object from a KTX file. {#createVulkan} - -~~~~~~~~~~~~~~~~{.c} -#include <ktxvulkan.h> - -ktxTexture* kTexture; -KTX_error_code result; -ktx_size_t offset; -ktx_uint8_t* image; -ktx_uint32_t level, layer, faceSlice; -ktxVulkanDeviceInfo vdi; -ktxVulkanTexture texture; - -// Set up Vulkan physical device (gpu), logical device (device), queue -// and command pool. Save the handles to these in a struct called vkctx. -// ktx VulkanDeviceInfo is used to pass these with the expectation that -// apps are likely to upload a large number of textures. -ktxVulkanDeviceInfo_Construct(&vdi, vkctx.gpu, vkctx.device, - vkctx.queue, vkctx.commandPool, nullptr); - -ktxresult = ktxTexture_CreateFromNamedFile("mytex3d.ktx", - KTX_TEXTURE_CREATE_NO_FLAGS, - &kTexture); - -ktxresult = ktxTexture_VkUploadEx(kTexture, &vdi, &texture, - VK_IMAGE_TILING_OPTIMAL, - VK_IMAGE_USAGE_SAMPLED_BIT, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - -ktxTexture_Destroy(kTexture); -ktxVulkanDeviceInfo_Destruct(&vdi); -// ... -// Vulkan rendering using the texture -// ... -// When done using the image in Vulkan... -ktxVulkanTexture_Destruct(&texture, vkctx.device, nullptr); -~~~~~~~~~~~~~~~~ - -## Extracting Metadata {#subsection} - -Once a ktxTexture object has been created, metadata can be easily found -and extracted. The following can be added to any of the above. - -~~~~~~~~~~~~~~~~{.c} -char* pValue; -uint32_t valueLen; -if (KTX_SUCCESS == ktxHashList_FindValue(&kTexture->kvDataHead, - KTX_ORIENTATION_KEY, - &valueLen, (void**)&pValue)) - { - char s, t; - - if (sscanf(pValue, KTX_ORIENTATION2_FMT, &s, &t) == 2) { - ... - } - } -~~~~~~~~~~~~~~~~ - -## Writing a KTX file {#writektx} - -~~~~~~~~~~~~~~~~{.c} -#include <ktx.h> - -ktxTexture* texture; -ktxTextureCreateInfo createInfo; -KTX_error_code result; -ktx_uint32_t level, layer, faceSlice; -FILE* src; -ktx_size_t srcSize; - -createInfo.glInternalformat = GL_RGB8; -createInfo.baseWidth = 2048; -createInfo.baseHeight = 1024; -createInfo.baseDepth = 16; -createInfo.numDimensions = 3. -// Note: it is not necessary to provide a full mipmap pyramid. -createInfo.numLevels = log2(createInfo.baseWidth) + 1 -createInfo.numLayers = 1; -createInfo.numFaces = 1; -createInfo.isArray = KTX_FALSE; -createInfo.generateMipmaps = KTX_FALSE; - -result = ktxTexture_Create(createInfo, - KTX_TEXTURE_CREATE_ALLOC_STORAGE, - &texture); - -src = // Open a stdio FILE* on the baseLevel image, slice 0. -srcSize = // Query size of the file. -level = 0; -layer = 0; -faceSlice = 0; -result = ktxTexture_SetImageFromMemory(texture, level, layer, faceSlice, - src, srcSize); -// Repeat for the other 15 slices of the base level and all other levels -// up to createInfo.numLevels. - -ktxTexture_WriteToNamedFile(texture, "mytex3d.ktx"); -ktxTexture_Destroy(texture); -~~~~~~~~~~~~~~~~ - -## Modifying a KTX file {#modifyktx} - -~~~~~~~~~~~~~~~~{.c} -#include <ktx.h> - -ktxTexture* texture; -KTX_error_code result; -ktx_size_t offset; -ktx_uint8_t* image; -ktx_uint32_t level, layer, faceSlice; - -result = ktxTexture_CreateFromNamedFile("mytex3d.ktx", - KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT, - &texture); -// The file is closed after all the data has been read. - -// It is the responsibilty of the application to make sure its -// modifications are valid. -texture->generateMipmaps = KTX_TRUE; - -ktxTexture_WriteToNamedFile(texture, "mytex3d.ktx"); -ktxTexture_Destroy(texture); -~~~~~~~~~~~~~~~~ - diff --git a/external/KTX-Software-master/lib/memstream.c b/external/KTX-Software-master/lib/memstream.c deleted file mode 100644 index 523b551..0000000 --- a/external/KTX-Software-master/lib/memstream.c +++ /dev/null @@ -1,588 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4 expandtab: */ - -/* - * Copyright (c) 2010-2018 The Khronos Group Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @internal - * @file - * @~English - * - * @brief Implementation of ktxStream for memory. - * - * @author Maksim Kolesin, Under Development - * @author Georg Kolling, Imagination Technology - * @author Mark Callow, HI Corporation - */ - -#include <assert.h> -#include <string.h> -#include <stdlib.h> - -#include "ktx.h" -#include "ktxint.h" -#include "memstream.h" - -/** -* @brief Default allocation size for a ktxMemStream. -*/ -#define KTX_MEM_DEFAULT_ALLOCATED_SIZE 256 - -/** - * @internal - * @brief Structure to store information about data allocated for ktxMemStream. - */ -struct ktxMem -{ - const ktx_uint8_t* robytes;/*!< pointer to read-only data */ - ktx_uint8_t* bytes; /*!< pointer to rw data. */ - ktx_size_t alloc_size; /*!< allocated size of the memory block. */ - ktx_size_t used_size; /*!< bytes used. Effectively the write position. */ - ktx_off_t pos; /*!< read position. */ -}; - -static KTX_error_code ktxMem_expand(ktxMem* pMem, const ktx_size_t size); - -/** - * @internal - * @brief Initialize a ktxMem struct for read-write. - * - * Memory for the stream data is allocated internally but the - * caller is responsible for freeing the memory. A pointer to - * the memory can be obtained with ktxMem_getdata(). - * - * @sa ktxMem_getdata. - * - * @param [in] pMem pointer to the @c ktxMem to initialize. - */ -static KTX_error_code -ktxMem_construct(ktxMem* pMem) -{ - pMem->pos = 0; - pMem->alloc_size = 0; - pMem->robytes = 0; - pMem->bytes = 0; - pMem->used_size = 0; - return ktxMem_expand(pMem, KTX_MEM_DEFAULT_ALLOCATED_SIZE); -} - -/** - * @internal - * @brief Create & initialize a ktxMem struct for read-write. - * - * @sa ktxMem_construct. - * - * @param [in,out] ppMem pointer to the location in which to return - * a pointer to the newly created @c ktxMem. - * - * @return KTX_SUCCESS on success, KTX_OUT_OF_MEMORY on error. - * - * @exception KTX_OUT_OF_MEMORY System failed to allocate sufficient pMemory. - */ -static KTX_error_code -ktxMem_create(ktxMem** ppMem) -{ - ktxMem* pNewMem = (ktxMem*)malloc(sizeof(ktxMem)); - if (pNewMem) { - KTX_error_code result = ktxMem_construct(pNewMem); - if (result == KTX_SUCCESS) - *ppMem = pNewMem; - return result; - } - else { - return KTX_OUT_OF_MEMORY; - } -} - -/** - * @internal - * @brief Initialize a ktxMem struct for read-only. - * - * @param [in] pMem pointer to the @c ktxMem to initialize. - * @param [in] bytes pointer to the data to be read. - * @param [in] numBytes number of bytes of data. - */ -static void -ktxMem_construct_ro(ktxMem* pMem, const void* bytes, ktx_size_t numBytes) -{ - pMem->pos = 0; - pMem->robytes = bytes; - pMem->bytes = 0; - pMem->used_size = numBytes; - pMem->alloc_size = numBytes; -} - -/** - * @internal - * @brief Create & initialize a ktxMem struct for read-only. - * - * @sa ktxMem_construct. - * - * @param [in,out] ppMem pointer to the location in which to return - * a pointer to the newly created @c ktxMem. - * @param [in] bytes pointer to the data to be read. - * @param [in] numBytes number of bytes of data. - * - * @return KTX_SUCCESS on success, KTX_OUT_OF_MEMORY on error. - * - * @exception KTX_OUT_OF_MEMORY System failed to allocate sufficient pMemory. - */ -static KTX_error_code -ktxMem_create_ro(ktxMem** ppMem, const void* bytes, ktx_size_t numBytes) -{ - ktxMem* pNewMem = (ktxMem*)malloc(sizeof(ktxMem)); - if (pNewMem) { - ktxMem_construct_ro(pNewMem, bytes, numBytes); - *ppMem = pNewMem; - return KTX_SUCCESS; - } - else { - return KTX_OUT_OF_MEMORY; - } -} - -/* - * ktxMem_destruct not needed as ktxMem_construct caller is reponsible - * for freeing the data written. - */ - -/** - * @internal - * @brief Free the memory of a struct ktxMem. - * - * @param pMem pointer to ktxMem to free. - */ -static void -ktxMem_destroy(ktxMem* pMem, ktx_bool_t freeData) -{ - assert(pMem != NULL); - if (freeData) { - free(pMem->bytes); - } - free(pMem); -} - -#ifdef KTXMEM_CLEAR_USED -/** - * @internal - * @brief Clear the data of a memory stream. - * - * @param pMem pointer to ktxMem to clear. - */ -static void -ktxMem_clear(ktxMem* pMem) -{ - assert(pMem != NULL); - memset(pMem, 0, sizeof(ktxMem)); -} -#endif - -/** - * @internal - * @~English - * @brief Expand a ktxMem to fit to a new size. - * - * @param [in] pMem pointer to ktxMem struct to expand. - * @param [in] newsize minimum new size required. - * - * @return KTX_SUCCESS on success, KTX_OUT_OF_MEMORY on error. - * - * @exception KTX_OUT_OF_MEMORY System failed to allocate sufficient pMemory. - */ -static KTX_error_code -ktxMem_expand(ktxMem *pMem, const ktx_size_t newsize) -{ - ktx_size_t new_alloc_size; - - assert(pMem != NULL && newsize != 0); - - new_alloc_size = pMem->alloc_size == 0 ? - KTX_MEM_DEFAULT_ALLOCATED_SIZE : pMem->alloc_size; - while (new_alloc_size < newsize) { - ktx_size_t alloc_size = new_alloc_size; - new_alloc_size <<= 1; - if (new_alloc_size < alloc_size) { - /* Overflow. Set to maximum size. newsize can't be larger. */ - new_alloc_size = (ktx_size_t)-1L; - } - } - - if (new_alloc_size == pMem->alloc_size) - return KTX_SUCCESS; - - if (!pMem->bytes) - pMem->bytes = (ktx_uint8_t*)malloc(new_alloc_size); - else - pMem->bytes = (ktx_uint8_t*)realloc(pMem->bytes, new_alloc_size); - - if (!pMem->bytes) - { - pMem->alloc_size = 0; - pMem->used_size = 0; - return KTX_OUT_OF_MEMORY; - } - - pMem->alloc_size = new_alloc_size; - return KTX_SUCCESS; -} - -/** - * @internal - * @~English - * @brief Read bytes from a ktxMemStream. - * - * @param [in] str pointer to ktxMem struct, converted to a void*, that - * specifies an input stream. - * @param [in,out] dst pointer to memory where to copy read bytes. - * @param [in,out] count pointer to number of bytes to read. - * - * @return KTX_SUCCESS on success, KTX_INVALID_VALUE on error. - * - * @exception KTX_INVALID_VALUE @p str or @p dst is @c NULL or @p str->data is - * @c NULL. - * @exception KTX_FILE_UNEXPECTED_EOF not enough data to satisfy the request. - */ -static -KTX_error_code ktxMemStream_read(ktxStream* str, void* dst, const ktx_size_t count) -{ - ktxMem* mem; - ktx_off_t newpos; - const ktx_uint8_t* bytes; - - - if (!str || !(mem = str->data.mem)) - return KTX_INVALID_VALUE; - - newpos = mem->pos + count; - /* The first clause checks for overflow. */ - if (newpos < mem->pos || newpos > mem->used_size) - return KTX_FILE_UNEXPECTED_EOF; - - bytes = mem->robytes ? mem->robytes : mem->bytes; - memcpy(dst, bytes + mem->pos, count); - mem->pos = newpos; - - return KTX_SUCCESS; -} - -/** - * @internal - * @~English - * @brief Skip bytes in a ktxMemStream. - * - * @param [in] str pointer to the ktxStream on which to operate. - * @param [in] count number of bytes to skip. - * - * @return KTX_SUCCESS on success, KTX_INVALID_VALUE on error. - * - * @exception KTX_INVALID_VALUE @p str or @p mem is @c NULL or sufficient - * data is not available in ktxMem. - * @exception KTX_FILE_UNEXPECTED_EOF not enough data to satisfy the request. - */ -static -KTX_error_code ktxMemStream_skip(ktxStream* str, const ktx_size_t count) -{ - ktxMem* mem; - ktx_off_t newpos; - - if (!str || !(mem = str->data.mem)) - return KTX_INVALID_VALUE; - - newpos = mem->pos + count; - /* The first clause checks for overflow. */ - if (newpos < mem->pos || newpos > mem->used_size) - return KTX_FILE_UNEXPECTED_EOF; - - mem->pos = newpos; - - return KTX_SUCCESS; -} - -/** - * @internal - * @~English - * @brief Write bytes to a ktxMemStream. - * - * @param [out] str pointer to the ktxStream that specifies the destination. - * @param [in] src pointer to the array of elements to be written, - * converted to a const void*. - * @param [in] size size in bytes of each element to be written. - * @param [in] count number of elements, each one with a @p size of size - * bytes. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_FILE_OVERFLOW write would result in file exceeding the - * maximum permissible size. - * @exception KTX_INVALID_OPERATION @p str is a read-only stream. - * @exception KTX_INVALID_VALUE @p dst is @c NULL or @p mem is @c NULL. - * @exception KTX_OUT_OF_MEMORY See ktxMem_expand() for causes. - */ -static -KTX_error_code ktxMemStream_write(ktxStream* str, const void* src, - const ktx_size_t size, const ktx_size_t count) -{ - ktxMem* mem; - KTX_error_code rc = KTX_SUCCESS; - ktx_size_t new_size; - - if (!str || !(mem = str->data.mem)) - return KTX_INVALID_VALUE; - - if (mem->robytes) - return KTX_INVALID_OPERATION; /* read-only */ - - new_size = mem->used_size + size*count; - if (new_size < mem->used_size) - return KTX_FILE_OVERFLOW; - - if (mem->alloc_size < new_size) { - rc = ktxMem_expand(mem, new_size); - if (rc != KTX_SUCCESS) - return rc; - } - - memcpy(mem->bytes + mem->used_size, src, size*count); - mem->used_size += size*count; - - return KTX_SUCCESS; -} - -/** - * @internal - * @~English - * @brief Get the current read/write position in a ktxMemStream. - * - * @param [in] str pointer to the ktxStream to query. - * @param [in,out] off pointer to variable to receive the offset value. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @p str or @p pos is @c NULL. - */ -static -KTX_error_code ktxMemStream_getpos(ktxStream* str, ktx_off_t* const pos) -{ - if (!str || !pos) - return KTX_INVALID_VALUE; - - assert(str->type == eStreamTypeMemory); - - *pos = str->data.mem->pos; - return KTX_SUCCESS; -} - -/** - * @internal - * @~English - * @brief Set the current read/write position in a ktxMemStream. - * - * Offset of 0 is the start of the file. - * - * @param [in] str pointer to the ktxStream whose r/w position is to be set. - * @param [in] off pointer to the offset value to set. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @p str is @c NULL. - * @exception KTX_INVALID_OPERATION @p pos > size of the allocated memory. - */ -static -KTX_error_code ktxMemStream_setpos(ktxStream* str, ktx_off_t pos) -{ - if (!str) - return KTX_INVALID_VALUE; - - assert(str->type == eStreamTypeMemory); - - if (pos > str->data.mem->alloc_size) - return KTX_INVALID_OPERATION; - - str->data.mem->pos = pos; - return KTX_SUCCESS; -} - -/** - * @internal - * @~English - * @brief Get a pointer to a ktxMemStream's data. - * - * Gets a pointer to data that has been written to the stream. Returned - * pointer will be 0 if stream is read-only. - * - * @param [in] str pointer to the ktxStream whose data pointer is to - * be queried. - * @param [in,out] size pointer to a variable in which the data pointer - * will be written. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @p str or @p ppBytes is @c NULL. - */ -KTX_error_code ktxMemStream_getdata(ktxStream* str, ktx_uint8_t** ppBytes) -{ - if (!str || !ppBytes) - return KTX_INVALID_VALUE; - - assert(str->type == eStreamTypeMemory); - - *ppBytes = str->data.mem->bytes; - return KTX_SUCCESS; -} - -/** - * @internal - * @~English - * @brief Get the size of a ktxMemStream in bytes. - * - * @param [in] str pointer to the ktxStream whose size is to be queried. - * @param [in,out] size pointer to a variable in which size will be written. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @p str or @p pSize is @c NULL. - */ -static -KTX_error_code ktxMemStream_getsize(ktxStream* str, ktx_size_t* pSize) -{ - if (!str || !pSize) - return KTX_INVALID_VALUE; - - assert(str->type == eStreamTypeMemory); - - *pSize = str->data.mem->used_size; - return KTX_SUCCESS; -} - -/** - * @internal - * @~English - * @brief Setup ktxMemStream function pointers. - */ -void -ktxMemStream_setup(ktxStream* str) -{ - str->type = eStreamTypeMemory; - str->read = ktxMemStream_read; - str->skip = ktxMemStream_skip; - str->write = ktxMemStream_write; - str->getpos = ktxMemStream_getpos; - str->setpos = ktxMemStream_setpos; - str->getsize = ktxMemStream_getsize; - str->destruct = ktxMemStream_destruct; -} - -/** - * @internal - * @~English - * @brief Initialize a read-write ktxMemStream. - * - * Memory is allocated as data is written. The caller of this is - * responsible for freeing this memory unless @a freeOnDestruct - * is not KTX_FALSE. - * - * @param [in] str pointer to a ktxStream struct to initialize. - * @param [in] freeOnDestruct If not KTX_FALSE memory holding the data will - * be freed by the destructor. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @p str is @c NULL. - * @exception KTX_OUT_OF_MEMORY system failed to allocate sufficient memory. - */ -KTX_error_code ktxMemStream_construct(ktxStream* str, - ktx_bool_t freeOnDestruct) -{ - ktxMem* mem; - KTX_error_code result = KTX_SUCCESS; - - if (!str) - return KTX_INVALID_VALUE; - - result = ktxMem_create(&mem); - - if (KTX_SUCCESS == result) { - str->data.mem = mem; - ktxMemStream_setup(str); - str->closeOnDestruct = freeOnDestruct; - } - - return result; -} - -/** - * @internal - * @~English - * @brief Initialize a read-only ktxMemStream. - * - * @param [in] str pointer to a ktxStream struct to initialize. - * @param [in] bytes pointer to an array of bytes containing the data. - * @param [in] size size of array of data for ktxMemStream. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @p str or @p mem is @c NULL or @p numBytes - * is 0. - * or @p size is less than 0. - * @exception KTX_OUT_OF_MEMORY system failed to allocate sufficient memory. - */ -KTX_error_code ktxMemStream_construct_ro(ktxStream* str, - const ktx_uint8_t* bytes, - const ktx_size_t numBytes) -{ - ktxMem* mem; - KTX_error_code result = KTX_SUCCESS; - - if (!str || !bytes || numBytes == 0) - return KTX_INVALID_VALUE; - - result = ktxMem_create_ro(&mem, bytes, numBytes); - - if (KTX_SUCCESS == result) { - str->data.mem = mem; - ktxMemStream_setup(str); - str->closeOnDestruct = KTX_FALSE; - } - - return result; -} - -/** - * @internal - * @~English - * @brief Free the memory used by a ktxMemStream. - * - * This only frees the memory used to store the data written to the stream, - * if the @c freeOnDestruct parameter to ktxMemStream_construct() was not - * @c KTX_FALSE. Otherwise it is the responsibility of the caller of - * ktxMemStream_construct() and a pointer to this memory should be retrieved - * using ktxMemStream_getdata() before calling this function. - * - * @sa ktxMemStream_construct, ktxMemStream_getdata. - * - * @param [in] str pointer to the ktxStream whose memory is - * to be freed. - */ -void -ktxMemStream_destruct(ktxStream* str) -{ - assert(str && str->type == eStreamTypeMemory); - - ktxMem_destroy(str->data.mem, str->closeOnDestruct); - str->data.mem = NULL; -} - diff --git a/external/KTX-Software-master/lib/memstream.h b/external/KTX-Software-master/lib/memstream.h deleted file mode 100644 index 3cd4e03..0000000 --- a/external/KTX-Software-master/lib/memstream.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4 expandtab: */ - -/* - * Copyright (c) 2010-2018 The Khronos Group Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @internal - * @file - * @~English - * - * @brief Interface of ktxStream for memory. - * - * @author Maksim Kolesin - * @author Georg Kolling, Imagination Technology - * @author Mark Callow, HI Corporation - */ - -#ifndef MEMSTREAM_H -#define MEMSTREAM_H - -#include "ktx.h" -#include "stream.h" - -/* - * Initialize a ktxStream to a ktxMemStream with internally - * allocated memory. Can be read or written. - */ -KTX_error_code ktxMemStream_construct(ktxStream* str, - ktx_bool_t freeOnDestruct); -/* - * Initialize a ktxStream to a read-only ktxMemStream reading - * from an array of bytes. - */ -KTX_error_code ktxMemStream_construct_ro(ktxStream* str, - const ktx_uint8_t* pBytes, - const ktx_size_t size); -void ktxMemStream_destruct(ktxStream* str); - -KTX_error_code ktxMemStream_getdata(ktxStream* str, ktx_uint8_t** ppBytes); - -#endif /* MEMSTREAM_H */ diff --git a/external/KTX-Software-master/lib/stream.h b/external/KTX-Software-master/lib/stream.h deleted file mode 100644 index 9b9a727..0000000 --- a/external/KTX-Software-master/lib/stream.h +++ /dev/null @@ -1,137 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4 expandtab: */ - -/* - * Copyright (c) 2010-2018 The Khronos Group Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @internal - * @file - * @~English - * - * @brief Interface of ktxStream. - * - * @author Maksim Kolesin - * @author Georg Kolling, Imagination Technology - * @author Mark Callow, HI Corporation - */ - -#ifndef KTXSTREAM_H -#define KTXSTREAM_H - -#include <sys/types.h> -#include "ktx.h" - -/* - * This is unsigned to allow ktxmemstreams to use the - * full amount of memory available. Platforms will - * limit the size of ktxfilestreams to, e.g, MAX_LONG - * on 32-bit and ktxfilestreams raises errors if - * offset values exceed the limits. This choice may - * need to be revisited if we ever start needing -ve - * offsets. - * - * Should the 2GB file size handling limit on 32-bit - * platforms become a problem, ktxfilestream will have - * to be changed to explicitly handle large files by - * using the 64-bit stream functions. - */ -#if defined(_MSC_VER) && defined(_WIN64) - typedef unsigned __int64 ktx_off_t; -#else - typedef size_t ktx_off_t; -#endif -typedef struct ktxMem ktxMem; -typedef struct ktxStream ktxStream; - -enum streamType { eStreamTypeFile = 1, eStreamTypeMemory = 2 }; - -/** - * @internal - * @~English - * @brief type for a pointer to a stream reading function - */ -typedef KTX_error_code (*ktxStream_read)(ktxStream* str, void* dst, - const ktx_size_t count); -/** - * @internal - * @~English - * @brief type for a pointer to a stream skipping function - */ -typedef KTX_error_code (*ktxStream_skip)(ktxStream* str, - const ktx_size_t count); - -/** - * @internal - * @~English - * @brief type for a pointer to a stream reading function - */ -typedef KTX_error_code (*ktxStream_write)(ktxStream* str, const void *src, - const ktx_size_t size, - const ktx_size_t count); - -/** - * @internal - * @~English - * @brief type for a pointer to a stream position query function - */ -typedef KTX_error_code (*ktxStream_getpos)(ktxStream* str, ktx_off_t* const offset); - -/** - * @internal - * @~English - * @brief type for a pointer to a stream position query function - */ -typedef KTX_error_code (*ktxStream_setpos)(ktxStream* str, const ktx_off_t offset); - -/** - * @internal - * @~English - * @brief type for a pointer to a stream size query function - */ -typedef KTX_error_code (*ktxStream_getsize)(ktxStream* str, ktx_size_t* const size); - -/** - * @internal - * @~English - * @brief Destruct a stream - */ -typedef void (*ktxStream_destruct)(ktxStream* str); - -/** - * @internal - * @~English - * @brief KTX stream class - */ -struct ktxStream -{ - ktxStream_read read; /*!< @internal pointer to function for reading bytes. */ - ktxStream_skip skip; /*!< @internal pointer to function for skipping bytes. */ - ktxStream_write write; /*!< @internal pointer to function for writing bytes. */ - ktxStream_getpos getpos; /*!< @internal pointer to function for getting current position in stream. */ - ktxStream_setpos setpos; /*!< @internal pointer to function for setting current position in stream. */ - ktxStream_getsize getsize; /*!< @internal pointer to function for querying size. */ - ktxStream_destruct destruct; /*!< @internal destruct the stream. */ - - enum streamType type; - union { - FILE* file; - ktxMem* mem; - } data; /**< @internal pointer to the stream data. */ - ktx_bool_t closeOnDestruct; /**< @internal Close FILE* or dispose of memory on destruct. */ -}; - -#endif /* KTXSTREAM_H */ diff --git a/external/KTX-Software-master/lib/swap.c b/external/KTX-Software-master/lib/swap.c deleted file mode 100644 index bb2579e..0000000 --- a/external/KTX-Software-master/lib/swap.c +++ /dev/null @@ -1,52 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4 expandtab: */ - -/* $Id: d858975c68f39438233f78cbf217f70fc5ddd316 $ */ - -/* - * Copyright (c) 2010 The Khronos Group Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "KHR/khrplatform.h" - -/* - * SwapEndian16: Swaps endianness in an array of 16-bit values - */ -void -_ktxSwapEndian16(khronos_uint16_t* pData16, int count) -{ - int i; - for (i = 0; i < count; ++i) - { - khronos_uint16_t x = *pData16; - *pData16++ = (x << 8) | (x >> 8); - } -} - -/* - * SwapEndian32: Swaps endianness in an array of 32-bit values - */ -void -_ktxSwapEndian32(khronos_uint32_t* pData32, int count) -{ - int i; - for (i = 0; i < count; ++i) - { - khronos_uint32_t x = *pData32; - *pData32++ = (x << 24) | ((x & 0xFF00) << 8) | ((x & 0xFF0000) >> 8) | (x >> 24); - } -} - - diff --git a/external/KTX-Software-master/lib/texture.c b/external/KTX-Software-master/lib/texture.c deleted file mode 100644 index 0bfa703..0000000 --- a/external/KTX-Software-master/lib/texture.c +++ /dev/null @@ -1,1636 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4 expandtab: */ - -/* - * ©2018 Mark Callow. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @internal - * @file writer.c - * @~English - * - * @brief ktxTexture implementation. - * - * @author Mark Callow, www.edgewise-consulting.com - */ - -#ifdef _WIN32 -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include <stdlib.h> - -#include "ktx.h" -#include "ktxint.h" -#include "stream.h" -#include "filestream.h" -#include "memstream.h" -#include "gl_format.h" -#include "uthash.h" - -/** - * @internal - * @~English - * @brief Internal ktxTexture structure. - * - * This is kept hidden to avoid burdening applications with the definitions - * of GlFormatSize and ktxStream. - */ -typedef struct _ktxTextureInt { - ktxTexture super; /*!< Base ktxTexture class. */ - GlFormatSize formatInfo; /*!< Info about the image data format. */ - // The following are needed because image data reading can be delayed. - ktx_uint32_t glTypeSize; /*!< Size of the image data type in bytes. */ - ktxStream stream; /*!< Stream connected to KTX source. */ - ktx_bool_t needSwap; /*!< If KTX_TRUE, image data needs byte swapping. */ -} ktxTextureInt; - -ktx_size_t ktxTexture_GetSize(ktxTexture* This); -KTX_error_code ktxTexture_LoadImageData(ktxTexture* This, - ktx_uint8_t* pBuffer, - ktx_size_t bufSize); - -static ktx_size_t ktxTexture_calcDataSize(ktxTexture* This); -static ktx_uint32_t padRow(ktx_uint32_t* rowBytes); - - -/** - * @memberof ktxTexture @private - * @brief Construct (initialize) a ktxTexture. - * - * @param[in] This pointer to a ktxTextureInt-sized block of memory to - * initialize. - * @param[in] createInfo pointer to a ktxTextureCreateInfo struct with - * information describing the texture. - * @param[in] storageAllocation - * enum indicating whether or not to allocation storage - * for the texture images. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @c glInternalFormat in @p createInfo is not a - * valid OpenGL internal format value. - * @exception KTX_INVALID_VALUE @c numDimensions in @p createInfo is not 1, 2 - * or 3. - * @exception KTX_INVALID_VALUE One of <tt>base{Width,Height,Depth}</tt> in - * @p createInfo is 0. - * @exception KTX_INVALID_VALUE @c numFaces in @p createInfo is not 1 or 6. - * @exception KTX_INVALID_VALUE @c numLevels in @p createInfo is 0. - * @exception KTX_INVALID_OPERATION - * The <tt>base{Width,Height,Depth}</tt> specified - * in @p createInfo are inconsistent with - * @c numDimensions. - * @exception KTX_INVALID_OPERATION - * @p createInfo is requesting a 3D array or - * 3D cubemap texture. - * @exception KTX_INVALID_OPERATION - * @p createInfo is requesting a cubemap with - * non-square or non-2D images. - * @exception KTX_INVALID_OPERATION - * @p createInfo is requesting more mip levels - * than needed for the specified - * <tt>base{Width,Height,Depth}</tt>. - * @exception KTX_OUT_OF_MEMORY Not enough memory for the texture's images. - */ -static KTX_error_code -ktxTextureInt_construct(ktxTextureInt* This, ktxTextureCreateInfo* createInfo, - ktxTextureCreateStorageEnum storageAllocation) -{ - ktxTexture* super = (ktxTexture*)This; - GLuint typeSize; - GLenum glFormat; - - memset(This, 0, sizeof(*This)); - - super->glInternalformat = createInfo->glInternalformat; - glGetFormatSize(super->glInternalformat, &This->formatInfo);; - glFormat= glGetFormatFromInternalFormat(createInfo->glInternalformat); - if (glFormat == GL_INVALID_VALUE) - return KTX_INVALID_VALUE; - super->isCompressed - = (This->formatInfo.flags & GL_FORMAT_SIZE_COMPRESSED_BIT); - if (super->isCompressed) { - super->glFormat = 0; - super->glBaseInternalformat = glFormat; - super->glType = 0; - This->glTypeSize = 0; - } else { - super->glBaseInternalformat = super->glFormat = glFormat; - super->glType - = glGetTypeFromInternalFormat(createInfo->glInternalformat); - if (super->glType == GL_INVALID_VALUE) - return KTX_INVALID_VALUE; - typeSize = glGetTypeSizeFromType(super->glType); - assert(typeSize != GL_INVALID_VALUE); - - /* Do some sanity checking */ - if (typeSize != 1 && - typeSize != 2 && - typeSize != 4) - { - /* Only 8, 16, and 32-bit types are supported for byte-swapping. - * See UNPACK_SWAP_BYTES & table 8.4 in the OpenGL 4.4 spec. - */ - return KTX_INVALID_VALUE; - } - This->glTypeSize = typeSize; - } - - /* Check texture dimensions. KTX files can store 8 types of textures: - * 1D, 2D, 3D, cube, and array variants of these. - */ - if (createInfo->numDimensions < 1 || createInfo->numDimensions > 3) - return KTX_INVALID_VALUE; - - if (createInfo->baseWidth == 0 || createInfo->baseHeight == 0 - || createInfo->baseDepth == 0) - return KTX_INVALID_VALUE; - - super->baseWidth = createInfo->baseWidth; - switch (createInfo->numDimensions) { - case 1: - if (createInfo->baseHeight > 1 || createInfo->baseDepth > 1) - return KTX_INVALID_OPERATION; - break; - - case 2: - if (createInfo->baseDepth > 1) - return KTX_INVALID_OPERATION; - super->baseHeight = createInfo->baseHeight; - break; - - case 3: - /* 3D array textures and 3D cubemaps are not supported by either - * OpenGL or Vulkan. - */ - if (createInfo->isArray || createInfo->numFaces != 1 - || createInfo->numLayers != 1) - return KTX_INVALID_OPERATION; - super->baseDepth = createInfo->baseDepth; - super->baseHeight = createInfo->baseHeight; - break; - } - super->numDimensions = createInfo->numDimensions; - - if (createInfo->numLayers == 0) - return KTX_INVALID_VALUE; - super->numLayers = createInfo->numLayers; - - if (createInfo->numFaces == 6) { - if (super->numDimensions != 2) { - /* cube map needs 2D faces */ - return KTX_INVALID_OPERATION; - } - if (createInfo->baseWidth != createInfo->baseHeight) { - /* cube maps require square images */ - return KTX_INVALID_OPERATION; - } - super->isCubemap = KTX_TRUE; - } else if (createInfo->numFaces != 1) { - /* numFaces must be either 1 or 6 */ - return KTX_INVALID_VALUE; - } - super->numFaces = createInfo->numFaces; - - - /* Check number of mipmap levels */ - if (createInfo->numLevels == 0) - return KTX_INVALID_VALUE; - super->numLevels = createInfo->numLevels; - super->generateMipmaps = createInfo->generateMipmaps; - - if (createInfo->numLevels > 1) { - GLuint max_dim = MAX(MAX(createInfo->baseWidth, createInfo->baseHeight), createInfo->baseDepth); - if (max_dim < ((GLuint)1 << (super->numLevels - 1))) - { - /* Can't have more mip levels than 1 + log2(max(width, height, depth)) */ - return KTX_INVALID_OPERATION; - } - } - - super->numLayers = createInfo->numLayers; - super->isArray = createInfo->isArray; - - ktxHashList_Construct(&super->kvDataHead); - if (storageAllocation == KTX_TEXTURE_CREATE_ALLOC_STORAGE) { - super->dataSize = ktxTexture_calcDataSize(super); - super->pData = malloc(super->dataSize); - if (super->pData == NULL) - return KTX_OUT_OF_MEMORY; - } - return KTX_SUCCESS; -} - -/** - * @memberof ktxTexture @private - * @brief Construct a ktxTexture from a ktxStream reading from a KTX source. - * - * The caller constructs the stream inside the ktxTextureInt before calling - * this. - * - * The create flag KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT should not be set, - * if the ktxTexture is ultimately to be uploaded to OpenGL or Vulkan. This - * will minimize memory usage by allowing, for example, loading the images - * directly from the source into a Vulkan staging buffer. - * - * The create flag KTX_TEXTURE_CREATE_RAW_KVDATA_BIT should not be used. It is - * provided solely to enable implementation of the @e libktx v1 API on top of - * ktxTexture. - * - * @param[in] This pointer to a ktxTextureInt-sized block of memory to - * initialize. - * @param[in] createFlags bitmask requesting specific actions during creation. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_FILE_DATA_ERROR - * Source data is inconsistent with the KTX - * specification. - * @exception KTX_FILE_READ_ERROR - * An error occurred while reading the source. - * @exception KTX_FILE_UNEXPECTED_EOF - * Not enough data in the source. - * @exception KTX_OUT_OF_MEMORY Not enough memory to load either the images or - * the key-value data. - * @exception KTX_UNKNOWN_FILE_FORMAT - * The source is not in KTX format. - * @exception KTX_UNSUPPORTED_TEXTURE_TYPE - * The source describes a texture type not - * supported by OpenGL or Vulkan, e.g, a 3D array. - */ -static KTX_error_code -ktxTextureInt_constructFromStream(ktxTextureInt* This, - ktxTextureCreateFlags createFlags) -{ - ktxTexture* super = (ktxTexture*)This; - KTX_error_code result; - KTX_header header; - KTX_supplemental_info suppInfo; - ktxStream* stream; - ktx_off_t pos; - ktx_size_t size; - - assert(This != NULL); - assert(This->stream.data.mem != NULL); - assert(This->stream.type == eStreamTypeFile - || This->stream.type == eStreamTypeMemory); - stream = &This->stream; - - // Read header. - result = stream->read(stream, &header, KTX_HEADER_SIZE); - if (result != KTX_SUCCESS) - return result; - - result = _ktxCheckHeader(&header, &suppInfo); - if (result != KTX_SUCCESS) - return result; - - /* - * Initialize from header info. - */ - super->glFormat = header.glFormat; - super->glInternalformat = header.glInternalformat; - super->glType = header.glType; - glGetFormatSize(super->glInternalformat, &This->formatInfo); - super->glBaseInternalformat = header.glBaseInternalformat; - super->numDimensions = suppInfo.textureDimension; - super->baseWidth = header.pixelWidth; - assert(suppInfo.textureDimension > 0 && suppInfo.textureDimension < 4); - switch (suppInfo.textureDimension) { - case 1: - super->baseHeight = super->baseDepth = 1; - break; - case 2: - super->baseHeight = header.pixelHeight; - super->baseDepth = 1; - break; - case 3: - super->baseHeight = header.pixelHeight; - super->baseDepth = header.pixelDepth; - break; - } - if (header.numberOfArrayElements > 0) { - super->numLayers = header.numberOfArrayElements; - super->isArray = KTX_TRUE; - } else { - super->numLayers = 1; - super->isArray = KTX_FALSE; - } - super->numFaces = header.numberOfFaces; - if (header.numberOfFaces == 6) - super->isCubemap = KTX_TRUE; - else - super->isCubemap = KTX_FALSE; - super->numLevels = header.numberOfMipmapLevels; - super->isCompressed = suppInfo.compressed; - super->generateMipmaps = suppInfo.generateMipmaps; - if (header.endianness == KTX_ENDIAN_REF_REV) - This->needSwap = KTX_TRUE; - This->glTypeSize = header.glTypeSize; - - /* - * Make an empty hash list. - */ - ktxHashList_Construct(&super->kvDataHead); - /* - * Load KVData. - */ - if (header.bytesOfKeyValueData > 0) { - if (!(createFlags & KTX_TEXTURE_CREATE_SKIP_KVDATA_BIT)) { - ktx_uint32_t kvdLen = header.bytesOfKeyValueData; - ktx_uint8_t* pKvd; - - pKvd = malloc(kvdLen); - if (pKvd == NULL) - return KTX_OUT_OF_MEMORY; - - result = stream->read(stream, pKvd, kvdLen); - if (result != KTX_SUCCESS) - return result; - - if (This->needSwap) { - /* Swap the counts inside the key & value data. */ - ktx_uint8_t* src = pKvd; - ktx_uint8_t* end = pKvd + kvdLen; - while (src < end) { - ktx_uint32_t keyAndValueByteSize = *((ktx_uint32_t*)src); - _ktxSwapEndian32(&keyAndValueByteSize, 1); - src += _KTX_PAD4(keyAndValueByteSize); - } - } - - if (!(createFlags & KTX_TEXTURE_CREATE_RAW_KVDATA_BIT)) { - result = ktxHashList_Deserialize(&super->kvDataHead, - kvdLen, pKvd); - if (result != KTX_SUCCESS) { - free(pKvd); - return result; - } - } else { - super->kvDataLen = kvdLen; - super->kvData = pKvd; - } - } else { - stream->skip(stream, header.bytesOfKeyValueData); - } - } - - /* - * Get the size of the image data. - */ - result = stream->getsize(stream, &size); - if (result == KTX_SUCCESS) { - result = stream->getpos(stream, &pos); - if (result == KTX_SUCCESS) - super->dataSize = size - pos - /* Remove space for faceLodSize fields */ - - super->numLevels * sizeof(ktx_uint32_t); - } - - /* - * Load the images, if requested. - */ - if (result == KTX_SUCCESS - && (createFlags & KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT)) { - result = ktxTexture_LoadImageData((ktxTexture*)super, NULL, 0); - } - return result; -} - -/** - * @memberof ktxTexture @private - * @brief Construct a ktxTexture from a stdio stream reading from a KTX source. - * - * See ktxTextureInt_constructFromStream for details. - * - * @note Do not close the stdio stream until you are finished with the texture - * object. - * - * @param[in] This pointer to a ktxTextureInt-sized block of memory to - * initialize. - * @param[in] stdioStream a stdio FILE pointer opened on the source. - * @param[in] createFlags bitmask requesting specific actions during creation. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE Either @p stdiostream or @p This is null. - * - * For other exceptions, see ktxTexture_constructFromStream(). - */ -static KTX_error_code -ktxTextureInt_constructFromStdioStream(ktxTextureInt* This, FILE* stdioStream, - ktxTextureCreateFlags createFlags) -{ - KTX_error_code result; - - if (stdioStream == NULL || This == NULL) - return KTX_INVALID_VALUE; - - memset(This, 0, sizeof(*This)); - - result = ktxFileStream_construct(&This->stream, stdioStream, KTX_FALSE); - if (result == KTX_SUCCESS) - result = ktxTextureInt_constructFromStream(This, createFlags); - return result; -} - -/** - * @memberof ktxTexture @private - * @brief Construct a ktxTexture from a named KTX file. - * - * See ktxTextureInt_constructFromStream for details. - * - * @param[in] This pointer to a ktxTextureInt-sized block of memory to - * initialize. - * @param[in] filename pointer to a char array containing the file name. - * @param[in] createFlags bitmask requesting specific actions during creation. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_FILE_OPEN_FAILED The file could not be opened. - * @exception KTX_INVALID_VALUE @p filename is @c NULL. - * - * For other exceptions, see ktxTexture_constructFromStream(). - */ -static KTX_error_code -ktxTextureInt_constructFromNamedFile(ktxTextureInt* This, - const char* const filename, - ktxTextureCreateFlags createFlags) -{ - KTX_error_code result; - FILE* file; - - if (This == NULL || filename == NULL) - return KTX_INVALID_VALUE; - - memset(This, 0, sizeof(*This)); - - file = fopen(filename, "rb"); - if (!file) - return KTX_FILE_OPEN_FAILED; - - result = ktxFileStream_construct(&This->stream, file, KTX_TRUE); - if (result == KTX_SUCCESS) - result = ktxTextureInt_constructFromStream(This, createFlags); - - return result; -} - -/** - * @memberof ktxTexture @private - * @brief Construct a ktxTexture from KTX-formatted data in memory. - * - * See ktxTextureInt_constructFromStream for details. - * - * @param[in] This pointer to a ktxTextureInt-sized block of memory to - * initialize. - * @param[in] bytes pointer to the memory containing the serialized KTX data. - * @param[in] size length of the KTX data in bytes. - * @param[in] createFlags bitmask requesting specific actions during creation. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE Either @p bytes is NULL or @p size is 0. - * - * For other exceptions, see ktxTexture_constructFromStream(). - */ -static KTX_error_code -ktxTextureInt_constructFromMemory(ktxTextureInt* This, - const ktx_uint8_t* bytes, ktx_size_t size, - ktxTextureCreateFlags createFlags) -{ - KTX_error_code result; - - if (bytes == NULL || size == 0) - return KTX_INVALID_VALUE; - - memset(This, 0, sizeof(*This)); - - result = ktxMemStream_construct_ro(&This->stream, bytes, size); - if (result == KTX_SUCCESS) - result = ktxTextureInt_constructFromStream(This, createFlags); - - return result; -} - -/** - * @memberof ktxTexture @private - * @~English - * @brief Free the memory associated with the texture contents - * - * @param[in] This pointer to the ktxTextureInt whose texture contents are - * to be freed. - */ -void -ktxTextureInt_destruct(ktxTextureInt* This) -{ - ktxTexture* super = (ktxTexture*)This; - if (This->stream.data.file != NULL) - This->stream.destruct(&This->stream); - if (super->kvDataHead != NULL) - ktxHashList_Destruct(&super->kvDataHead); - if (super->kvData != NULL) - free(super->kvData); - if (super->pData != NULL) - free(super->pData); -} - -/** - * @memberof ktxTexture - * @ingroup writer - * @brief Create a new empty ktxTexture. - * - * The address of the newly created ktxTexture is written to the location - * pointed at by @p newTex. - * - * @param[in] createInfo pointer to a ktxTextureCreateInfo struct with - * information describing the texture. - * @param[in] storageAllocation - * enum indicating whether or not to allocate storage - * for the texture images. - * @param[in,out] newTex pointer to a location in which store the address of - * the newly created texture. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @c glInternalFormat in @p createInfo is not a - * valid OpenGL internal format value. - * @exception KTX_INVALID_VALUE @c numDimensions in @p createInfo is not 1, 2 - * or 3. - * @exception KTX_INVALID_VALUE One of <tt>base{Width,Height,Depth}</tt> in - * @p createInfo is 0. - * @exception KTX_INVALID_VALUE @c numFaces in @p createInfo is not 1 or 6. - * @exception KTX_INVALID_VALUE @c numLevels in @p createInfo is 0. - * @exception KTX_INVALID_OPERATION - * The <tt>base{Width,Height,Depth}</tt> specified - * in @p createInfo are inconsistent with - * @c numDimensions. - * @exception KTX_INVALID_OPERATION - * @p createInfo is requesting a 3D array or - * 3D cubemap texture. - * @exception KTX_INVALID_OPERATION - * @p createInfo is requesting a cubemap with - * non-square or non-2D images. - * @exception KTX_INVALID_OPERATION - * @p createInfo is requesting more mip levels - * than needed for the specified - * <tt>base{Width,Height,Depth}</tt>. - * @exception KTX_OUT_OF_MEMORY Not enough memory for the texture's images. - */ -KTX_error_code -ktxTexture_Create(ktxTextureCreateInfo* createInfo, - ktxTextureCreateStorageEnum storageAllocation, - ktxTexture** newTex) -{ - KTX_error_code result; - - if (newTex == NULL) - return KTX_INVALID_VALUE; - - ktxTextureInt* tex = (ktxTextureInt*)malloc(sizeof(ktxTextureInt)); - if (tex == NULL) - return KTX_OUT_OF_MEMORY; - - result = ktxTextureInt_construct(tex, createInfo, storageAllocation); - if (result == KTX_SUCCESS) - *newTex = (ktxTexture*)tex; - else { - free(tex); - *newTex = NULL; - } - return result; -} - -/** - * @defgroup reader Reader - * @brief Read KTX-formatted data. - * @{ - */ - -/** - * @memberof ktxTexture - * @~English - * @brief Create a ktxTexture from a stdio stream reading from a KTX source. - * - * The address of a newly created ktxTexture reflecting the contents of the - * stdio stream is written to the location pointed at by @p newTex. - * - * The create flag KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT should not be set, - * if the ktxTexture is ultimately to be uploaded to OpenGL or Vulkan. This - * will minimize memory usage by allowing, for example, loading the images - * directly from the source into a Vulkan staging buffer. - * - * The create flag KTX_TEXTURE_CREATE_RAW_KVDATA_BIT should not be used. It is - * provided solely to enable implementation of the @e libktx v1 API on top of - * ktxTexture. - * - * @param[in] stdioStream stdio FILE pointer created from the desired file. - * @param[in] createFlags bitmask requesting specific actions during creation. - * @param[in,out] newTex pointer to a location in which store the address of - * the newly created texture. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @p newTex is @c NULL. - * @exception KTX_FILE_DATA_ERROR - * Source data is inconsistent with the KTX - * specification. - * @exception KTX_FILE_READ_ERROR - * An error occurred while reading the source. - * @exception KTX_FILE_UNEXPECTED_EOF - * Not enough data in the source. - * @exception KTX_OUT_OF_MEMORY Not enough memory to create the texture object, - * load the images or load the key-value data. - * @exception KTX_UNKNOWN_FILE_FORMAT - * The source is not in KTX format. - * @exception KTX_UNSUPPORTED_TEXTURE_TYPE - * The source describes a texture type not - * supported by OpenGL or Vulkan, e.g, a 3D array. - */ -KTX_error_code -ktxTexture_CreateFromStdioStream(FILE* stdioStream, - ktxTextureCreateFlags createFlags, - ktxTexture** newTex) -{ - KTX_error_code result; - if (newTex == NULL) - return KTX_INVALID_VALUE; - - ktxTextureInt* tex = (ktxTextureInt*)malloc(sizeof(ktxTextureInt)); - if (tex == NULL) - return KTX_OUT_OF_MEMORY; - - result = ktxTextureInt_constructFromStdioStream(tex, stdioStream, - createFlags); - if (result == KTX_SUCCESS) - *newTex = (ktxTexture*)tex; - else { - free(tex); - *newTex = NULL; - } - return result; -} - -/** - * @memberof ktxTexture - * @~English - * @brief Create a ktxTexture from a named KTX file. - * - * The address of a newly created ktxTexture reflecting the contents of the - * file is written to the location pointed at by @p newTex. - * - * The create flag KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT should not be set, - * if the ktxTexture is ultimately to be uploaded to OpenGL or Vulkan. This - * will minimize memory usage by allowing, for example, loading the images - * directly from the source into a Vulkan staging buffer. - * - * The create flag KTX_TEXTURE_CREATE_RAW_KVDATA_BIT should not be used. It is - * provided solely to enable implementation of the @e libktx v1 API on top of - * ktxTexture. - * - * @param[in] filename pointer to a char array containing the file name. - * @param[in] createFlags bitmask requesting specific actions during creation. - * @param[in,out] newTex pointer to a location in which store the address of - * the newly created texture. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - - * @exception KTX_FILE_OPEN_FAILED The file could not be opened. - * @exception KTX_INVALID_VALUE @p filename is @c NULL. - * - * For other exceptions, see ktxTexture_CreateFromStdioStream(). - */ -KTX_error_code -ktxTexture_CreateFromNamedFile(const char* const filename, - ktxTextureCreateFlags createFlags, - ktxTexture** newTex) -{ - KTX_error_code result; - - if (newTex == NULL) - return KTX_INVALID_VALUE; - - ktxTextureInt* tex = (ktxTextureInt*)malloc(sizeof(ktxTextureInt)); - if (tex == NULL) - return KTX_OUT_OF_MEMORY; - - result = ktxTextureInt_constructFromNamedFile(tex, filename, createFlags); - if (result == KTX_SUCCESS) - *newTex = (ktxTexture*)tex; - else { - free(tex); - *newTex = NULL; - } - return result; -} - -/** - * @memberof ktxTexture - * @~English - * @brief Create a ktxTexture from KTX-formatted data in memory. - * - * The address of a newly created ktxTexture reflecting the contents of the - * serialized KTX data is written to the location pointed at by @p newTex. - * - * The create flag KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT should not be set, - * if the ktxTexture is ultimately to be uploaded to OpenGL or Vulkan. This - * will minimize memory usage by allowing, for example, loading the images - * directly from the source into a Vulkan staging buffer. - * - * The create flag KTX_TEXTURE_CREATE_RAW_KVDATA_BIT should not be used. It is - * provided solely to enable implementation of the @e libktx v1 API on top of - * ktxTexture. - * - * @param[in] bytes pointer to the memory containing the serialized KTX data. - * @param[in] size length of the KTX data in bytes. - * @param[in] createFlags bitmask requesting specific actions during creation. - * @param[in,out] newTex pointer to a location in which store the address of - * the newly created texture. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE Either @p bytes is NULL or @p size is 0. - * - * For other exceptions, see ktxTexture_CreateFromStdioStream(). - */ -KTX_error_code -ktxTexture_CreateFromMemory(const ktx_uint8_t* bytes, ktx_size_t size, - ktxTextureCreateFlags createFlags, - ktxTexture** newTex) -{ - KTX_error_code result; - if (newTex == NULL) - return KTX_INVALID_VALUE; - - ktxTextureInt* tex = (ktxTextureInt*)malloc(sizeof(ktxTextureInt)); - if (tex == NULL) - return KTX_OUT_OF_MEMORY; - - result = ktxTextureInt_constructFromMemory(tex, bytes, size, - createFlags); - if (result == KTX_SUCCESS) - *newTex = (ktxTexture*)tex; - else { - free(tex); - *newTex = NULL; - } - return result; -} - -/** - * @memberof ktxTexture - * @~English - * @brief Destroy a ktxTexture object. - * - * This frees the memory associated with the texture contents and the memory - * of the ktxTexture object. This does @e not delete any OpenGL or Vulkan - * texture objects created by ktxTexture_GLUpload or ktxTexture_VkUpload. - * - * @param[in] This pointer to the ktxTexture object to destroy - */ -void -ktxTexture_Destroy(ktxTexture* This) -{ - ktxTextureInt_destruct((ktxTextureInt*)This); - free(This); -} - -/** - * @memberof ktxTexture - * @~English - * @brief Return a pointer to the texture image data. - * - * @param[in] This pointer to the ktxTexture object of interest. - */ -ktx_uint8_t* -ktxTexture_GetData(ktxTexture* This) -{ - return This->pData; -} - -/** - * @memberof ktxTexture - * @~English - * @brief Return the total size of the texture image data in bytes. - * - * @param[in] This pointer to the ktxTexture object of interest. - */ -ktx_size_t -ktxTexture_GetSize(ktxTexture* This) -{ - assert(This != NULL); - return This->dataSize; -} - -/** - * @memberof ktxTexture - * @~English - * @brief Return the size in bytes of an elements of a texture's - * images. - * - * For uncompressed textures an element is one texel. For compressed - * textures it is one block. - * - * @param[in] This pointer to the ktxTexture object of interest. - */ -ktx_uint32_t -ktxTexture_GetElementSize(ktxTexture* This) -{ - GlFormatSize* formatInfo; - - assert (This != NULL); - - formatInfo = &((ktxTextureInt*)This)->formatInfo; - return (formatInfo->blockSizeInBits / 8); -} - -/** - * @memberof ktxTexture - * @~English - * @brief Calculate & return the size in bytes of an image at the specified - * mip level. - * - * For arrays, this is the size of layer, for cubemaps, the size of a face - * and for 3D textures, the size of a depth slice. - * - * The size reflects the padding of each row to KTX_GL_UNPACK_ALIGNMENT. - * - * @param[in] This pointer to the ktxTexture object of interest. - * @param[in] level level of interest. * - */ -ktx_size_t -ktxTexture_GetImageSize(ktxTexture* This, ktx_uint32_t level) -{ - GlFormatSize* formatInfo; - struct blockCount { - ktx_uint32_t x, y, z; - } blockCount; - ktx_uint32_t blockSizeInBytes; - ktx_uint32_t rowBytes; - - assert (This != NULL); - - formatInfo = &((ktxTextureInt*)This)->formatInfo; - blockCount.x = MAX(1, (This->baseWidth / formatInfo->blockWidth) >> level); - blockCount.y = MAX(1, (This->baseHeight / formatInfo->blockHeight) >> level); - blockSizeInBytes = formatInfo->blockSizeInBits / 8; - - if (formatInfo->flags & GL_FORMAT_SIZE_COMPRESSED_BIT) { - assert(This->isCompressed); - return blockCount.x * blockCount.y * blockSizeInBytes; - } else { - assert(formatInfo->blockWidth == formatInfo->blockHeight == formatInfo->blockDepth == 1); - rowBytes = blockCount.x * blockSizeInBytes; - (void)padRow(&rowBytes); - return rowBytes * blockCount.y; - } -} - -/** - * @memberof ktxTexture - * @~English - * @brief Load all the image data from the ktxTexture's source. - * - * The data is loaded into the provided buffer or to an internally allocated - * buffer, if @p pBuffer is @c NULL. - * - * @param[in] This pointer to the ktxTexture object of interest. - * @param[in] pBuffer pointer to the buffer in which to load the image data. - * @param[in] bufSize size of the buffer pointed at by @p pBuffer. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @p This is NULL. - * @exception KTX_INVALID_VALUE @p bufSize is less than the the image data size. - * @exception KTX_INVALID_OPERATION - * The data has already been loaded or the - * ktxTexture was not created from a KTX source. - * @exception KTX_OUT_OF_MEMORY Insufficient memory for the image data. - */ -KTX_error_code -ktxTexture_LoadImageData(ktxTexture* This, - ktx_uint8_t* pBuffer, ktx_size_t bufSize) -{ - ktxTextureInt* subthis = (ktxTextureInt*)This; - ktx_uint32_t miplevel; - ktx_uint8_t* pDest; - KTX_error_code result = KTX_SUCCESS; - - if (This == NULL) - return KTX_INVALID_VALUE; - - if (subthis->stream.data.file == NULL) - // This Texture not created from a stream or images already loaded; - return KTX_INVALID_OPERATION; - - if (pBuffer == NULL) { - This->pData = malloc(This->dataSize); - if (This->pData == NULL) - return KTX_OUT_OF_MEMORY; - pDest = This->pData; - } else if (bufSize < This->dataSize) { - return KTX_INVALID_VALUE; - } else { - pDest = pBuffer; - } - - // Need to loop through for correct byte swapping - for (miplevel = 0; miplevel < This->numLevels; ++miplevel) - { - ktx_uint32_t faceLodSize; - ktx_uint32_t faceLodSizePadded; - ktx_uint32_t face; - ktx_uint32_t innerIterations; - - result = subthis->stream.read(&subthis->stream, &faceLodSize, - sizeof(ktx_uint32_t)); - if (result != KTX_SUCCESS) { - goto cleanup; - } - if (subthis->needSwap) { - _ktxSwapEndian32(&faceLodSize, 1); - } -#if (KTX_GL_UNPACK_ALIGNMENT != 4) - faceLodSizePadded = _KTX_PAD4(faceLodSize); -#else - faceLodSizePadded = faceLodSize; -#endif - - if (This->isCubemap && !This->isArray) - innerIterations = This->numFaces; - else - innerIterations = 1; - for (face = 0; face < innerIterations; ++face) - { - result = subthis->stream.read(&subthis->stream, pDest, - faceLodSizePadded); - if (result != KTX_SUCCESS) { - goto cleanup; - } - - /* Perform endianness conversion on texture data */ - if (subthis->needSwap) { - if (subthis->glTypeSize == 2) - _ktxSwapEndian16((ktx_uint16_t*)pDest, faceLodSize / 2); - else if (subthis->glTypeSize == 4) - _ktxSwapEndian32((ktx_uint32_t*)pDest, faceLodSize / 4); - } - - pDest += faceLodSizePadded; - } - } - -cleanup: - // No further need for This-> - subthis->stream.destruct(&subthis->stream); - return result; -} - -/** - * @memberof ktxTexture - * @~English - * @brief Iterate over the images in a ktxTexture object. - * - * Blocks of image data are passed to an application-supplied callback - * function. This is not a strict per-image iteration. Rather it reflects how - * OpenGL needs the images. For most textures the block of data includes all - * images of a mip level which implies all layers of an array. However, for - * non-array cube map textures the block is a single face of the mip level, - * i.e the callback is called once for each face. - * - * This function works even if @p This->pData == 0 so it can be used to - * obtain offsets and sizes for each level by callers who have loaded the data - * externally. - * - * @param[in] This pointer to the ktxTexture object of interest. - * @param[in,out] iterCb the address of a callback function which is called - * with the data for each image block. - * @param[in,out] userdata the address of application-specific data which is - * passed to the callback along with the image data. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. The - * following are returned directly by this function. @p iterCb may - * return these for other causes or may return additional errors. - * - * @exception KTX_FILE_DATA_ERROR Mip level sizes are increasing not - * decreasing - * @exception KTX_INVALID_VALUE @p This is @c NULL or @p iterCb is @c NULL. - * - */ -KTX_error_code -ktxTexture_IterateLevelFaces(ktxTexture* This, PFNKTXITERCB iterCb, - void* userdata) -{ - ktx_uint32_t miplevel; - KTX_error_code result = KTX_SUCCESS; - - if (This == NULL) - return KTX_INVALID_VALUE; - - if (iterCb == NULL) - return KTX_INVALID_VALUE; - - for (miplevel = 0; miplevel < This->numLevels; ++miplevel) - { - ktx_uint32_t faceLodSize; - ktx_uint32_t face; - ktx_uint32_t innerIterations; - GLsizei width, height, depth; - - /* Array textures have the same number of layers at each mip level. */ - width = MAX(1, This->baseWidth >> miplevel); - height = MAX(1, This->baseHeight >> miplevel); - depth = MAX(1, This->baseDepth >> miplevel); - - faceLodSize = (ktx_uint32_t)ktxTexture_faceLodSize(This, miplevel); - - /* All array layers are passed in a group because that is how - * GL & Vulkan need them. Hence no - * for (layer = 0; layer < This->numLayers) - */ - if (This->isCubemap && !This->isArray) - innerIterations = This->numFaces; - else - innerIterations = 1; - for (face = 0; face < innerIterations; ++face) - { - /* And all z_slices are also passed as a group hence no - * for (slice = 0; slice < This->depth) - */ - ktx_size_t offset; - - ktxTexture_GetImageOffset(This, miplevel, 0, face, &offset); - result = iterCb(miplevel, face, - width, height, depth, - faceLodSize, This->pData + offset, userdata); - - if (result != KTX_SUCCESS) - break; - } - } - - return result; -} -/** - * @memberof ktxTexture - * @~English - * @brief Iterate over the images in a ktxTexture object while loading the - * image data. - * - * This operates similarly to ktxTexture_IterateLevelFaces() except that it - * loads the images from the ktxTexture's source to a temporary buffer - * while iterating. The callback function must copy the image data if it - * wishes to preserve it as the temporary buffer is reused for each level and - * is freed when this function exits. - * - * This function is helpful for reducing memory usage when uploading the data - * to a graphics API. - * - * @param[in] This pointer to the ktxTexture object of interest. - * @param[in,out] iterCb the address of a callback function which is called - * with the data for each image. - * @param[in,out] userdata the address of application-specific data which is - * passed to the callback along with the image data. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. The - * following are returned directly by this function. @p iterCb may - * return these for other causes or may return additional errors. - * - * @exception KTX_FILE_DATA_ERROR mip level sizes are increasing not - * decreasing - * @exception KTX_INVALID_OPERATION the ktxTexture was not created from a - * stream, i.e there is no data to load, or - * this ktxTexture's images have already - * been loaded. - * @exception KTX_INVALID_VALUE @p This is @c NULL or @p iterCb is @c NULL. - * @exception KTX_OUT_OF_MEMORY not enough memory to allocate a block to - * hold the base level image. - */ -KTX_error_code -ktxTexture_IterateLoadLevelFaces(ktxTexture* This, PFNKTXITERCB iterCb, - void* userdata) -{ - ktxTextureInt* subthis = (ktxTextureInt*)This; - ktx_uint32_t dataSize = 0; - ktx_uint32_t miplevel; - KTX_error_code result = KTX_SUCCESS; - void* data = NULL; - - if (This == NULL) - return KTX_INVALID_VALUE; - - if (iterCb == NULL) - return KTX_INVALID_VALUE; - - if (subthis->stream.data.file == NULL) - // This Texture not created from a stream or images are already loaded. - return KTX_INVALID_OPERATION; - - for (miplevel = 0; miplevel < This->numLevels; ++miplevel) - { - ktx_uint32_t faceLodSize; - ktx_uint32_t faceLodSizePadded; - ktx_uint32_t face; - ktx_uint32_t innerIterations; - GLsizei width, height, depth; - - /* Array textures have the same number of layers at each mip level. */ - width = MAX(1, This->baseWidth >> miplevel); - height = MAX(1, This->baseHeight >> miplevel); - depth = MAX(1, This->baseDepth >> miplevel); - - result = subthis->stream.read(&subthis->stream, &faceLodSize, - sizeof(ktx_uint32_t)); - if (result != KTX_SUCCESS) { - goto cleanup; - } - if (subthis->needSwap) { - _ktxSwapEndian32(&faceLodSize, 1); - } -#if (KTX_GL_UNPACK_ALIGNMENT != 4) - faceLodSizePadded = _KTX_PAD4(faceLodSize); -#else - faceLodSizePadded = faceLodSize; -#endif - if (!data) { - /* allocate memory sufficient for the base miplevel */ - data = malloc(faceLodSizePadded); - if (!data) { - result = KTX_OUT_OF_MEMORY; - goto cleanup; - } - dataSize = faceLodSizePadded; - } - else if (dataSize < faceLodSizePadded) { - /* subsequent miplevels cannot be larger than the base miplevel */ - result = KTX_FILE_DATA_ERROR; - goto cleanup; - } - - /* All array layers are passed in a group because that is how - * GL & Vulkan need them. Hence no - * for (layer = 0; layer < This->numLayers) - */ - if (This->isCubemap && !This->isArray) - innerIterations = This->numFaces; - else - innerIterations = 1; - for (face = 0; face < innerIterations; ++face) - { - /* And all z_slices are also passed as a group hence no - * for (z_slice = 0; z_slice < This->depth) - */ - result = subthis->stream.read(&subthis->stream, data, - faceLodSizePadded); - if (result != KTX_SUCCESS) { - goto cleanup; - } - - /* Perform endianness conversion on texture data */ - if (subthis->needSwap) { - if (subthis->glTypeSize == 2) - _ktxSwapEndian16((ktx_uint16_t*)data, faceLodSize / 2); - else if (subthis->glTypeSize == 4) - _ktxSwapEndian32((ktx_uint32_t*)data, faceLodSize / 4); - } - - result = iterCb(miplevel, face, - width, height, depth, - faceLodSize, data, userdata); - - if (result != KTX_SUCCESS) - goto cleanup; - } - } - -cleanup: - free(data); - // No further need for this. - subthis->stream.destruct(&subthis->stream); - - return result; -} - -/** - * @memberof ktxTexture - * @~English - * @brief Iterate over the mip levels in a ktxTexture object. - * - * This is almost identical to ktxTexture_IterateLevelFaces(). The difference is - * that the blocks of image data for non-array cube maps include all faces of - * a mip level. - * - * This function works even if @p This->pData == 0 so it can be used to - * obtain offsets and sizes for each level by callers who have loaded the data - * externally. - * - * @param[in] This handle of the ktxTexture opened on the data. - * @param[in,out] iterCb the address of a callback function which is called - * with the data for each image block. - * @param[in,out] userdata the address of application-specific data which is - * passed to the callback along with the image data. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. The - * following are returned directly by this function. @p iterCb may - * return these for other causes or may return additional errors. - * - * @exception KTX_FILE_DATA_ERROR Mip level sizes are increasing not - * decreasing - * @exception KTX_INVALID_VALUE @p This is @c NULL or @p iterCb is @c NULL. - * - */ -KTX_error_code -ktxTexture_IterateLevels(ktxTexture* This, PFNKTXITERCB iterCb, void* userdata) -{ - ktx_uint32_t miplevel; - KTX_error_code result = KTX_SUCCESS; - - if (This == NULL) - return KTX_INVALID_VALUE; - - if (iterCb == NULL) - return KTX_INVALID_VALUE; - - for (miplevel = 0; miplevel < This->numLevels; ++miplevel) - { - GLsizei width, height, depth; - ktx_uint32_t levelSize; - ktx_size_t offset; - - /* Array textures have the same number of layers at each mip level. */ - width = MAX(1, This->baseWidth >> miplevel); - height = MAX(1, This->baseHeight >> miplevel); - depth = MAX(1, This->baseDepth >> miplevel); - - levelSize = (ktx_uint32_t)ktxTexture_levelSize(This, miplevel); - - /* All array layers are passed in a group because that is how - * GL & Vulkan need them. Hence no - * for (layer = 0; layer < This->numLayers) - */ - ktxTexture_GetImageOffset(This, miplevel, 0, 0, &offset); - result = iterCb(miplevel, 0, width, height, depth, - levelSize, This->pData + offset, userdata); - if (result != KTX_SUCCESS) - break; - } - - return result; -} - -/** - * @internal - * @brief Calculate and apply the padding needed to comply with - * KTX_GL_UNPACK_ALIGNMENT. - * - * For uncompressed textures, KTX format specifies KTX_GL_UNPACK_ALIGNMENT = 4. - * - * @param[in,out] rowBytes pointer to variable containing the packed no. of - * bytes in a row. The no. of bytes after padding - * is written into this location. - * @return the no. of bytes of padding. - */ -static ktx_uint32_t -padRow(ktx_uint32_t* rowBytes) -{ - ktx_uint32_t rowPadding; - - assert (rowBytes != NULL); - - rowPadding = _KTX_PAD_UNPACK_ALIGN_LEN(*rowBytes); - *rowBytes += rowPadding; - return rowPadding; -} - -/** - * @memberof ktxTexture @private - * @~English - * @brief Calculate the size of an array layer at the specified mip level. - * - * The size of a layer is the size of an image * either the number of faces - * or the number of depth slices. This is the size of a layer as needed to - * find the offset within the array of images of a level and layer so the size - * reflects any @c cubePadding. - * - * @param[in] This pointer to the ktxTexture object of interest. - * @param[in] level level whose layer size to return. - * - * @return the layer size in bytes. - */ -static inline ktx_size_t -ktxTexture_layerSize(ktxTexture* This, ktx_uint32_t level) -{ - /* - * As there are no 3D cubemaps, the image's z block count will always be - * 1 for cubemaps and numFaces will always be 1 for 3D textures so the - * multiply is safe. 3D cubemaps, if they existed, would require - * imageSize * (blockCount.z + This->numFaces); - */ - GlFormatSize* formatInfo; - ktx_uint32_t blockCountZ; - ktx_size_t imageSize, layerSize; - - assert (This != NULL); - - formatInfo = &((ktxTextureInt*)This)->formatInfo; - blockCountZ = MAX(1, (This->baseDepth / formatInfo->blockDepth) >> level); - imageSize = ktxTexture_GetImageSize(This, level); - layerSize = imageSize * blockCountZ; -#if (KTX_GL_UNPACK_ALIGNMENT != 4) - if (This->isCubemap && !This->isArray) { - /* cubePadding. NOTE: this adds padding after the last face too. */ - _KTX_PAD4(layerSize); - } -#endif - return layerSize * This->numFaces; -} - -/** - * @memberof ktxTexture @private - * @~English - * @brief Calculate the size of the specified mip level. - * - * The size of a level is the size of a layer * the number of layers. - * - * @param[in] This pointer to the ktxTexture object of interest. - * @param[in] level level whose layer size to return. - * - * @return the level size in bytes. - */ -ktx_size_t -ktxTexture_levelSize(ktxTexture* This, ktx_uint32_t level) -{ - assert (This != NULL); - return ktxTexture_layerSize(This, level) * This->numLayers; -} - -/** - * @memberof ktxTexture @private - * @~English - * @brief Calculate the faceLodSize of the specified mip level. - * - * The faceLodSize of a level for most textures is the size of a level. For - * non-array cube map textures is the size of a face. This is the size that - * must be provided to OpenGL when uploading textures. Faces get uploaded 1 - * at a time while all layers of an array or all slices of a 3D texture are - * uploaded together. - * - * @param[in] This pointer to the ktxTexture object of interest. - * @param[in] level level whose layer size to return. - * - * @return the faceLodSize size in bytes. - */ -ktx_size_t -ktxTexture_faceLodSize(ktxTexture* This, ktx_uint32_t level) -{ - /* - * For non-array cubemaps this is the size of a face. For everything - * else it is the size of the level. - */ - if (This->isCubemap && !This->isArray) - return ktxTexture_GetImageSize(This, level); - else - return ktxTexture_levelSize(This, level); -} - -/** - * @memberof ktxTexture @private - * @~English - * @brief Calculate the size of the image data for the specified number - * of levels. - * - * The data size is the sum of the sizes of each level up to the number - * specified and includes any @c mipPadding. - * - * @param[in] This pointer to the ktxTexture object of interest. - * @param[in] levels number of levels whose data size to return. - * - * @return the data size in bytes. - */ -static inline ktx_size_t -ktxTexture_dataSize(ktxTexture* This, ktx_uint32_t levels) -{ - ktx_uint32_t i; - ktx_size_t dataSize = 0; - - assert (This != NULL); - for (i = 0; i < levels; i++) { - ktx_size_t levelSize = ktxTexture_levelSize(This, i); -#if (KTX_GL_UNPACK_ALIGNMENT != 4) - /* mipPadding. NOTE: this adds padding after the last level too. */ - dataSize += _KTX_PAD4(levelSize); -#else - dataSize += levelSize; -#endif - } - return dataSize; -} - -/** - * @memberof ktxTexture @private - * @~English - * @brief Return the number of bytes needed to store all the image data for - * a ktxTexture. - * - * The caclulated size does not include space for storing the @c imageSize - * fields of each mip level. - * - * @param[in] This pointer to the ktxTexture object of interest. - * - * @return the data size in bytes. - */ -static ktx_size_t -ktxTexture_calcDataSize(ktxTexture* This) -{ - assert (This != NULL); - return ktxTexture_dataSize(This, This->numLevels); -} - -/** - * @memberof ktxTexture @private - * @~English - * @brief Return the size of the primitive type of a single color component - * - * @param[in] This pointer to the ktxTexture object of interest. - * - * @return the type size in bytes. - */ -ktx_uint32_t -ktxTexture_glTypeSize(ktxTexture* This) -{ - assert(This != NULL); - return ((ktxTextureInt*)This)->glTypeSize; -} - -/** - * @memberof ktxTexture @private - * @~English - * @brief Get information about rows of an uncompresssed texture image at a - * specified level. - * - * For an image at @p level of a ktxTexture provide the number of rows, the - * packed (unpadded) number of bytes in a row and the padding necessary to - * comply with KTX_GL_UNPACK_ALIGNMENT. - * - * @param[in] This pointer to the ktxTexture object of interest. - * @param[in] level level of interest. - * @param[in,out] numRows pointer to location to store the number of rows. - * @param[in,out] pRowLengthBytes pointer to location to store number of bytes - * in a row. - * @param[in.out] pRowPadding pointer to location to store the number of bytes - * of padding. - */ -void -ktxTexture_rowInfo(ktxTexture* This, ktx_uint32_t level, - ktx_uint32_t* numRows, ktx_uint32_t* pRowLengthBytes, - ktx_uint32_t* pRowPadding) -{ - GlFormatSize* formatInfo; - struct blockCount { - ktx_uint32_t x; - } blockCount; - - assert (This != NULL); - - formatInfo = &((ktxTextureInt*)This)->formatInfo; - assert(!This->isCompressed); - assert(formatInfo->blockWidth == formatInfo->blockHeight == formatInfo->blockDepth == 1); - - blockCount.x = MAX(1, (This->baseWidth / formatInfo->blockWidth) >> level); - *numRows = MAX(1, (This->baseHeight / formatInfo->blockHeight) >> level); - - *pRowLengthBytes = blockCount.x * formatInfo->blockSizeInBits / 8; - *pRowPadding = padRow(pRowLengthBytes); -} - -/** - * @memberof ktxTexture - * @~English - * @brief Return pitch betweeb rows of a texture image level in bytes. - * - * For uncompressed textures the pitch is the number of bytes between - * rows of texels. For compressed textures it is the number of bytes - * between rows of blocks. The value is padded to GL_UNPACK_ALIGNMENT, - * if necessary. For all currently known compressed formats padding - * will not be necessary. - * - * @param[in] This pointer to the ktxTexture object of interest. - * @param[in] level level of interest. - * - * @return the row pitch in bytes. - */ - ktx_uint32_t - ktxTexture_GetRowPitch(ktxTexture* This, ktx_uint32_t level) - { - GlFormatSize* formatInfo; - struct blockCount { - ktx_uint32_t x; - } blockCount; - ktx_uint32_t pitch; - - formatInfo = &((ktxTextureInt*)This)->formatInfo; - blockCount.x = MAX(1, (This->baseWidth / formatInfo->blockWidth) >> level); - pitch = blockCount.x * formatInfo->blockSizeInBits / 8; - (void)padRow(&pitch); - - return pitch; - } - -/** - * @memberof ktxTexture @private - * @~English - * @brief Query if a ktxTexture has an active stream. - * - * Tests if a ktxTexture has unread image data. The internal stream is closed - * once all the images have been read. - * - * @param[in] This pointer to the ktxTexture object of interest. - * - * @return KTX_TRUE if there is an active stream, KTX_FALSE otherwise. - */ -ktx_bool_t -ktxTexture_isActiveStream(ktxTexture* This) -{ - assert(This != NULL); - return ((ktxTextureInt*)This)->stream.data.file != NULL; -} - - -/** - * @memberof ktxTexture - * @~English - * @brief Find the offset of an image within a ktxTexture's image data. - * - * As there is no such thing as a 3D cubemap we make the 3rd location parameter - * do double duty. - * - * @param[in] This pointer to the ktxTexture object of interest. - * @param[in] level mip level of the image. - * @param[in] layer array layer of the image. - * @param[in] faceSlice cube map face or depth slice of the image. - * @param[in,out] pOffset pointer to location to store the offset. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_OPERATION - * @p level, @p layer or @p faceSlice exceed the - * dimensions of the texture. - * @exception KTX_INVALID_VALID @p This is NULL. - */ -KTX_error_code -ktxTexture_GetImageOffset(ktxTexture* This, ktx_uint32_t level, - ktx_uint32_t layer, ktx_uint32_t faceSlice, - ktx_size_t* pOffset) -{ - if (This == NULL) - return KTX_INVALID_VALUE; - - if (level >= This->numLevels || layer >= This->numLayers) - return KTX_INVALID_OPERATION; - - if (This->isCubemap) { - if (faceSlice >= This->numFaces) - return KTX_INVALID_OPERATION; - } else { - ktx_uint32_t maxSlice = MAX(1, This->baseDepth >> level); - if (faceSlice >= maxSlice) - return KTX_INVALID_OPERATION; - } - - // Get the size of the data up to the start of the indexed level. - *pOffset = ktxTexture_dataSize(This, level); - - // All layers, faces & slices within a level are the same size. - if (layer != 0) { - ktx_size_t layerSize; - layerSize = ktxTexture_layerSize(This, level); - *pOffset += layer * layerSize; - } - if (faceSlice != 0) { - ktx_size_t imageSize; - imageSize = ktxTexture_GetImageSize(This, level); -#if (KTX_GL_UNPACK_ALIGNMENT != 4) - if (This->isCubemap) - _KTX_PAD4(imageSize); // Account for cubePadding. -#endif - *pOffset += faceSlice * imageSize; - } - - return KTX_SUCCESS; -} - -/** @} */ - diff --git a/external/KTX-Software-master/lib/uthash.h b/external/KTX-Software-master/lib/uthash.h deleted file mode 100644 index ddd50a7..0000000 --- a/external/KTX-Software-master/lib/uthash.h +++ /dev/null @@ -1,960 +0,0 @@ -/* -Copyright (c) 2003-2010, Troy D. Hanson http://uthash.sourceforge.net -All rights reserved. - -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. - -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. -*/ - -#ifndef UTHASH_H -#define UTHASH_H - -#include <string.h> /* memcmp,strlen */ -#include <stddef.h> /* ptrdiff_t */ - -/* These macros use decltype or the earlier __typeof GNU extension. - As decltype is only available in newer compilers (VS2010 or gcc 4.3+ - when compiling c++ source) this code uses whatever method is needed - or, for VS2008 where neither is available, uses casting workarounds. */ -#ifdef _MSC_VER /* MS compiler */ -#if _MSC_VER >= 1600 && __cplusplus /* VS2010 or newer in C++ mode */ -#define DECLTYPE(x) (decltype(x)) -#else /* VS2008 or older (or VS2010 in C mode) */ -#define NO_DECLTYPE -#define DECLTYPE(x) -#endif -#else /* GNU, Sun and other compilers */ -#define DECLTYPE(x) (__typeof(x)) -#endif - -#ifdef NO_DECLTYPE -#define DECLTYPE_ASSIGN(dst,src) \ -do { \ - char **_da_dst = (char**)(&(dst)); \ - *_da_dst = (char*)(src); \ -} while(0) -#else -#define DECLTYPE_ASSIGN(dst,src) \ -do { \ - (dst) = DECLTYPE(dst)(src); \ -} while(0) -#endif - -/* a number of the hash function use uint32_t which isn't defined on win32 */ -#ifdef _MSC_VER -typedef unsigned int uint32_t; -#else -#include <inttypes.h> /* uint32_t */ -#endif - -#define UTHASH_VERSION 1.9.1 - -#define uthash_fatal(msg) exit(-1) /* fatal error (out of memory,etc) */ -#define uthash_malloc(sz) malloc(sz) /* malloc fcn */ -#define uthash_free(ptr) free(ptr) /* free fcn */ - -#define uthash_noexpand_fyi(tbl) /* can be defined to log noexpand */ -#define uthash_expand_fyi(tbl) /* can be defined to log expands */ - -/* initial number of buckets */ -#define HASH_INITIAL_NUM_BUCKETS 32 /* initial number of buckets */ -#define HASH_INITIAL_NUM_BUCKETS_LOG2 5 /* lg2 of initial number of buckets */ -#define HASH_BKT_CAPACITY_THRESH 10 /* expand when bucket count reaches */ - -/* calculate the element whose hash handle address is hhe */ -#define ELMT_FROM_HH(tbl,hhp) ((void*)(((char*)(hhp)) - ((tbl)->hho))) - -#define HASH_FIND(hh,head,keyptr,keylen,out) \ -do { \ - unsigned _hf_bkt,_hf_hashv; \ - out=NULL; \ - if (head) { \ - HASH_FCN(keyptr,keylen, (head)->hh.tbl->num_buckets, _hf_hashv, _hf_bkt); \ - if (HASH_BLOOM_TEST((head)->hh.tbl, _hf_hashv)) { \ - HASH_FIND_IN_BKT((head)->hh.tbl, hh, (head)->hh.tbl->buckets[ _hf_bkt ], \ - keyptr,keylen,out); \ - } \ - } \ -} while (0) - -#ifdef HASH_BLOOM -#define HASH_BLOOM_BITLEN (1ULL << HASH_BLOOM) -#define HASH_BLOOM_BYTELEN (HASH_BLOOM_BITLEN/8) + ((HASH_BLOOM_BITLEN%8) ? 1:0) -#define HASH_BLOOM_MAKE(tbl) \ -do { \ - (tbl)->bloom_nbits = HASH_BLOOM; \ - (tbl)->bloom_bv = (uint8_t*)uthash_malloc(HASH_BLOOM_BYTELEN); \ - if (!((tbl)->bloom_bv)) { uthash_fatal( "out of memory"); } \ - memset((tbl)->bloom_bv, 0, HASH_BLOOM_BYTELEN); \ - (tbl)->bloom_sig = HASH_BLOOM_SIGNATURE; \ -} while (0); - -#define HASH_BLOOM_FREE(tbl) \ -do { \ - uthash_free((tbl)->bloom_bv); \ -} while (0); - -#define HASH_BLOOM_BITSET(bv,idx) (bv[(idx)/8] |= (1U << ((idx)%8))) -#define HASH_BLOOM_BITTEST(bv,idx) (bv[(idx)/8] & (1U << ((idx)%8))) - -#define HASH_BLOOM_ADD(tbl,hashv) \ - HASH_BLOOM_BITSET((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1))) - -#define HASH_BLOOM_TEST(tbl,hashv) \ - HASH_BLOOM_BITTEST((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1))) - -#else -#define HASH_BLOOM_MAKE(tbl) -#define HASH_BLOOM_FREE(tbl) -#define HASH_BLOOM_ADD(tbl,hashv) -#define HASH_BLOOM_TEST(tbl,hashv) (1) -#endif - -#define HASH_MAKE_TABLE(hh,head) \ -do { \ - (head)->hh.tbl = (UT_hash_table*)uthash_malloc( \ - sizeof(UT_hash_table)); \ - if (!((head)->hh.tbl)) { uthash_fatal( "out of memory"); } \ - memset((head)->hh.tbl, 0, sizeof(UT_hash_table)); \ - (head)->hh.tbl->tail = &((head)->hh); \ - (head)->hh.tbl->num_buckets = HASH_INITIAL_NUM_BUCKETS; \ - (head)->hh.tbl->log2_num_buckets = HASH_INITIAL_NUM_BUCKETS_LOG2; \ - (head)->hh.tbl->hho = (char*)(&(head)->hh) - (char*)(head); \ - (head)->hh.tbl->buckets = (UT_hash_bucket*)uthash_malloc( \ - HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket)); \ - if (! (head)->hh.tbl->buckets) { uthash_fatal( "out of memory"); } \ - memset((head)->hh.tbl->buckets, 0, \ - HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket)); \ - HASH_BLOOM_MAKE((head)->hh.tbl); \ - (head)->hh.tbl->signature = HASH_SIGNATURE; \ -} while(0) - -#define HASH_ADD(hh,head,fieldname,keylen_in,add) \ - HASH_ADD_KEYPTR(hh,head,&add->fieldname,keylen_in,add) - -#define HASH_ADD_KEYPTR(hh,head,keyptr,keylen_in,add) \ -do { \ - unsigned _ha_bkt; \ - (add)->hh.next = NULL; \ - (add)->hh.key = (char*)keyptr; \ - (add)->hh.keylen = keylen_in; \ - if (!(head)) { \ - head = (add); \ - (head)->hh.prev = NULL; \ - HASH_MAKE_TABLE(hh,head); \ - } else { \ - (head)->hh.tbl->tail->next = (add); \ - (add)->hh.prev = ELMT_FROM_HH((head)->hh.tbl, (head)->hh.tbl->tail); \ - (head)->hh.tbl->tail = &((add)->hh); \ - } \ - (head)->hh.tbl->num_items++; \ - (add)->hh.tbl = (head)->hh.tbl; \ - HASH_FCN(keyptr,keylen_in, (head)->hh.tbl->num_buckets, \ - (add)->hh.hashv, _ha_bkt); \ - HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt],&(add)->hh); \ - HASH_BLOOM_ADD((head)->hh.tbl,(add)->hh.hashv); \ - HASH_EMIT_KEY(hh,head,keyptr,keylen_in); \ - HASH_FSCK(hh,head); \ -} while(0) - -#define HASH_TO_BKT( hashv, num_bkts, bkt ) \ -do { \ - bkt = ((hashv) & ((num_bkts) - 1)); \ -} while(0) - -/* delete "delptr" from the hash table. - * "the usual" patch-up process for the app-order doubly-linked-list. - * The use of _hd_hh_del below deserves special explanation. - * These used to be expressed using (delptr) but that led to a bug - * if someone used the same symbol for the head and deletee, like - * HASH_DELETE(hh,users,users); - * We want that to work, but by changing the head (users) below - * we were forfeiting our ability to further refer to the deletee (users) - * in the patch-up process. Solution: use scratch space to - * copy the deletee pointer, then the latter references are via that - * scratch pointer rather than through the repointed (users) symbol. - */ -#define HASH_DELETE(hh,head,delptr) \ -do { \ - unsigned _hd_bkt; \ - struct UT_hash_handle *_hd_hh_del; \ - if ( ((delptr)->hh.prev == NULL) && ((delptr)->hh.next == NULL) ) { \ - uthash_free((head)->hh.tbl->buckets ); \ - HASH_BLOOM_FREE((head)->hh.tbl); \ - uthash_free((head)->hh.tbl); \ - head = NULL; \ - } else { \ - _hd_hh_del = &((delptr)->hh); \ - if ((delptr) == ELMT_FROM_HH((head)->hh.tbl,(head)->hh.tbl->tail)) { \ - (head)->hh.tbl->tail = \ - (UT_hash_handle*)((char*)((delptr)->hh.prev) + \ - (head)->hh.tbl->hho); \ - } \ - if ((delptr)->hh.prev) { \ - ((UT_hash_handle*)((char*)((delptr)->hh.prev) + \ - (head)->hh.tbl->hho))->next = (delptr)->hh.next; \ - } else { \ - DECLTYPE_ASSIGN(head,(delptr)->hh.next); \ - } \ - if (_hd_hh_del->next) { \ - ((UT_hash_handle*)((char*)_hd_hh_del->next + \ - (head)->hh.tbl->hho))->prev = \ - _hd_hh_del->prev; \ - } \ - HASH_TO_BKT( _hd_hh_del->hashv, (head)->hh.tbl->num_buckets, _hd_bkt); \ - HASH_DEL_IN_BKT(hh,(head)->hh.tbl->buckets[_hd_bkt], _hd_hh_del); \ - (head)->hh.tbl->num_items--; \ - } \ - HASH_FSCK(hh,head); \ -} while (0) - - -/* convenience forms of HASH_FIND/HASH_ADD/HASH_DEL */ -#define HASH_FIND_STR(head,findstr,out) \ - HASH_FIND(hh,head,findstr,strlen(findstr),out) -#define HASH_ADD_STR(head,strfield,add) \ - HASH_ADD(hh,head,strfield,strlen(add->strfield),add) -#define HASH_FIND_INT(head,findint,out) \ - HASH_FIND(hh,head,findint,sizeof(int),out) -#define HASH_ADD_INT(head,intfield,add) \ - HASH_ADD(hh,head,intfield,sizeof(int),add) -#define HASH_FIND_PTR(head,findptr,out) \ - HASH_FIND(hh,head,findptr,sizeof(void *),out) -#define HASH_ADD_PTR(head,ptrfield,add) \ - HASH_ADD(hh,head,ptrfield,sizeof(void *),add) -#define HASH_DEL(head,delptr) \ - HASH_DELETE(hh,head,delptr) - -/* HASH_FSCK checks hash integrity on every add/delete when HASH_DEBUG is defined. - * This is for uthash developer only; it compiles away if HASH_DEBUG isn't defined. - */ -#ifdef HASH_DEBUG -#define HASH_OOPS(...) do { fprintf(stderr,__VA_ARGS__); exit(-1); } while (0) -#define HASH_FSCK(hh,head) \ -do { \ - unsigned _bkt_i; \ - unsigned _count, _bkt_count; \ - char *_prev; \ - struct UT_hash_handle *_thh; \ - if (head) { \ - _count = 0; \ - for( _bkt_i = 0; _bkt_i < (head)->hh.tbl->num_buckets; _bkt_i++) { \ - _bkt_count = 0; \ - _thh = (head)->hh.tbl->buckets[_bkt_i].hh_head; \ - _prev = NULL; \ - while (_thh) { \ - if (_prev != (char*)(_thh->hh_prev)) { \ - HASH_OOPS("invalid hh_prev %p, actual %p\n", \ - _thh->hh_prev, _prev ); \ - } \ - _bkt_count++; \ - _prev = (char*)(_thh); \ - _thh = _thh->hh_next; \ - } \ - _count += _bkt_count; \ - if ((head)->hh.tbl->buckets[_bkt_i].count != _bkt_count) { \ - HASH_OOPS("invalid bucket count %d, actual %d\n", \ - (head)->hh.tbl->buckets[_bkt_i].count, _bkt_count); \ - } \ - } \ - if (_count != (head)->hh.tbl->num_items) { \ - HASH_OOPS("invalid hh item count %d, actual %d\n", \ - (head)->hh.tbl->num_items, _count ); \ - } \ - /* traverse hh in app order; check next/prev integrity, count */ \ - _count = 0; \ - _prev = NULL; \ - _thh = &(head)->hh; \ - while (_thh) { \ - _count++; \ - if (_prev !=(char*)(_thh->prev)) { \ - HASH_OOPS("invalid prev %p, actual %p\n", \ - _thh->prev, _prev ); \ - } \ - _prev = (char*)ELMT_FROM_HH((head)->hh.tbl, _thh); \ - _thh = ( _thh->next ? (UT_hash_handle*)((char*)(_thh->next) + \ - (head)->hh.tbl->hho) : NULL ); \ - } \ - if (_count != (head)->hh.tbl->num_items) { \ - HASH_OOPS("invalid app item count %d, actual %d\n", \ - (head)->hh.tbl->num_items, _count ); \ - } \ - } \ -} while (0) -#else -#define HASH_FSCK(hh,head) -#endif - -/* When compiled with -DHASH_EMIT_KEYS, length-prefixed keys are emitted to - * the descriptor to which this macro is defined for tuning the hash function. - * The app can #include <unistd.h> to get the prototype for write(2). */ -#ifdef HASH_EMIT_KEYS -#define HASH_EMIT_KEY(hh,head,keyptr,fieldlen) \ -do { \ - unsigned _klen = fieldlen; \ - write(HASH_EMIT_KEYS, &_klen, sizeof(_klen)); \ - write(HASH_EMIT_KEYS, keyptr, fieldlen); \ -} while (0) -#else -#define HASH_EMIT_KEY(hh,head,keyptr,fieldlen) -#endif - -/* default to Jenkin's hash unless overridden e.g. DHASH_FUNCTION=HASH_SAX */ -#ifdef HASH_FUNCTION -#define HASH_FCN HASH_FUNCTION -#else -#define HASH_FCN HASH_JEN -#endif - -/* The Bernstein hash function, used in Perl prior to v5.6 */ -#define HASH_BER(key,keylen,num_bkts,hashv,bkt) \ -do { \ - unsigned _hb_keylen=keylen; \ - char *_hb_key=(char*)key; \ - (hashv) = 0; \ - while (_hb_keylen--) { (hashv) = ((hashv) * 33) + *_hb_key++; } \ - bkt = (hashv) & (num_bkts-1); \ -} while (0) - - -/* SAX/FNV/OAT/JEN hash functions are macro variants of those listed at - * http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx */ -#define HASH_SAX(key,keylen,num_bkts,hashv,bkt) \ -do { \ - unsigned _sx_i; \ - char *_hs_key=(char*)key; \ - hashv = 0; \ - for(_sx_i=0; _sx_i < keylen; _sx_i++) \ - hashv ^= (hashv << 5) + (hashv >> 2) + _hs_key[_sx_i]; \ - bkt = hashv & (num_bkts-1); \ -} while (0) - -#define HASH_FNV(key,keylen,num_bkts,hashv,bkt) \ -do { \ - unsigned _fn_i; \ - char *_hf_key=(char*)key; \ - hashv = 2166136261UL; \ - for(_fn_i=0; _fn_i < keylen; _fn_i++) \ - hashv = (hashv * 16777619) ^ _hf_key[_fn_i]; \ - bkt = hashv & (num_bkts-1); \ -} while(0); - -#define HASH_OAT(key,keylen,num_bkts,hashv,bkt) \ -do { \ - unsigned _ho_i; \ - char *_ho_key=(char*)key; \ - hashv = 0; \ - for(_ho_i=0; _ho_i < keylen; _ho_i++) { \ - hashv += _ho_key[_ho_i]; \ - hashv += (hashv << 10); \ - hashv ^= (hashv >> 6); \ - } \ - hashv += (hashv << 3); \ - hashv ^= (hashv >> 11); \ - hashv += (hashv << 15); \ - bkt = hashv & (num_bkts-1); \ -} while(0) - -#define HASH_JEN_MIX(a,b,c) \ -do { \ - a -= b; a -= c; a ^= ( c >> 13 ); \ - b -= c; b -= a; b ^= ( a << 8 ); \ - c -= a; c -= b; c ^= ( b >> 13 ); \ - a -= b; a -= c; a ^= ( c >> 12 ); \ - b -= c; b -= a; b ^= ( a << 16 ); \ - c -= a; c -= b; c ^= ( b >> 5 ); \ - a -= b; a -= c; a ^= ( c >> 3 ); \ - b -= c; b -= a; b ^= ( a << 10 ); \ - c -= a; c -= b; c ^= ( b >> 15 ); \ -} while (0) - -#define HASH_JEN(key,keylen,num_bkts,hashv,bkt) \ -do { \ - unsigned _hj_i,_hj_j,_hj_k; \ - char *_hj_key=(char*)key; \ - hashv = 0xfeedbeef; \ - _hj_i = _hj_j = 0x9e3779b9; \ - _hj_k = keylen; \ - while (_hj_k >= 12) { \ - _hj_i += (_hj_key[0] + ( (unsigned)_hj_key[1] << 8 ) \ - + ( (unsigned)_hj_key[2] << 16 ) \ - + ( (unsigned)_hj_key[3] << 24 ) ); \ - _hj_j += (_hj_key[4] + ( (unsigned)_hj_key[5] << 8 ) \ - + ( (unsigned)_hj_key[6] << 16 ) \ - + ( (unsigned)_hj_key[7] << 24 ) ); \ - hashv += (_hj_key[8] + ( (unsigned)_hj_key[9] << 8 ) \ - + ( (unsigned)_hj_key[10] << 16 ) \ - + ( (unsigned)_hj_key[11] << 24 ) ); \ - \ - HASH_JEN_MIX(_hj_i, _hj_j, hashv); \ - \ - _hj_key += 12; \ - _hj_k -= 12; \ - } \ - hashv += keylen; \ - switch ( _hj_k ) { \ - case 11: hashv += ( (unsigned)_hj_key[10] << 24 ); \ - case 10: hashv += ( (unsigned)_hj_key[9] << 16 ); \ - case 9: hashv += ( (unsigned)_hj_key[8] << 8 ); \ - case 8: _hj_j += ( (unsigned)_hj_key[7] << 24 ); \ - case 7: _hj_j += ( (unsigned)_hj_key[6] << 16 ); \ - case 6: _hj_j += ( (unsigned)_hj_key[5] << 8 ); \ - case 5: _hj_j += _hj_key[4]; \ - case 4: _hj_i += ( (unsigned)_hj_key[3] << 24 ); \ - case 3: _hj_i += ( (unsigned)_hj_key[2] << 16 ); \ - case 2: _hj_i += ( (unsigned)_hj_key[1] << 8 ); \ - case 1: _hj_i += _hj_key[0]; \ - } \ - HASH_JEN_MIX(_hj_i, _hj_j, hashv); \ - bkt = hashv & (num_bkts-1); \ -} while(0) - -/* The Paul Hsieh hash function */ -#undef get16bits -#if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \ - || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__) -#define get16bits(d) (*((const uint16_t *) (d))) -#endif - -#if !defined (get16bits) -#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8) \ - +(uint32_t)(((const uint8_t *)(d))[0]) ) -#endif -#define HASH_SFH(key,keylen,num_bkts,hashv,bkt) \ -do { \ - char *_sfh_key=(char*)key; \ - uint32_t _sfh_tmp, _sfh_len = keylen; \ - \ - int _sfh_rem = _sfh_len & 3; \ - _sfh_len >>= 2; \ - hashv = 0xcafebabe; \ - \ - /* Main loop */ \ - for (;_sfh_len > 0; _sfh_len--) { \ - hashv += get16bits (_sfh_key); \ - _sfh_tmp = (get16bits (_sfh_key+2) << 11) ^ hashv; \ - hashv = (hashv << 16) ^ _sfh_tmp; \ - _sfh_key += 2*sizeof (uint16_t); \ - hashv += hashv >> 11; \ - } \ - \ - /* Handle end cases */ \ - switch (_sfh_rem) { \ - case 3: hashv += get16bits (_sfh_key); \ - hashv ^= hashv << 16; \ - hashv ^= _sfh_key[sizeof (uint16_t)] << 18; \ - hashv += hashv >> 11; \ - break; \ - case 2: hashv += get16bits (_sfh_key); \ - hashv ^= hashv << 11; \ - hashv += hashv >> 17; \ - break; \ - case 1: hashv += *_sfh_key; \ - hashv ^= hashv << 10; \ - hashv += hashv >> 1; \ - } \ - \ - /* Force "avalanching" of final 127 bits */ \ - hashv ^= hashv << 3; \ - hashv += hashv >> 5; \ - hashv ^= hashv << 4; \ - hashv += hashv >> 17; \ - hashv ^= hashv << 25; \ - hashv += hashv >> 6; \ - bkt = hashv & (num_bkts-1); \ -} while(0); - -#ifdef HASH_USING_NO_STRICT_ALIASING -/* The MurmurHash exploits some CPU's (e.g. x86) tolerance for unaligned reads. - * For other types of CPU's (e.g. Sparc) an unaligned read causes a bus error. - * So MurmurHash comes in two versions, the faster unaligned one and the slower - * aligned one. We only use the faster one on CPU's where we know it's safe. - * - * Note the preprocessor built-in defines can be emitted using: - * - * gcc -m64 -dM -E - < /dev/null (on gcc) - * cc -## a.c (where a.c is a simple test file) (Sun Studio) - */ -#if (defined(__i386__) || defined(__x86_64__)) -#define HASH_MUR HASH_MUR_UNALIGNED -#else -#define HASH_MUR HASH_MUR_ALIGNED -#endif - -/* Appleby's MurmurHash fast version for unaligned-tolerant archs like i386 */ -#define HASH_MUR_UNALIGNED(key,keylen,num_bkts,hashv,bkt) \ -do { \ - const unsigned int _mur_m = 0x5bd1e995; \ - const int _mur_r = 24; \ - hashv = 0xcafebabe ^ keylen; \ - char *_mur_key = (char *)key; \ - uint32_t _mur_tmp, _mur_len = keylen; \ - \ - for (;_mur_len >= 4; _mur_len-=4) { \ - _mur_tmp = *(uint32_t *)_mur_key; \ - _mur_tmp *= _mur_m; \ - _mur_tmp ^= _mur_tmp >> _mur_r; \ - _mur_tmp *= _mur_m; \ - hashv *= _mur_m; \ - hashv ^= _mur_tmp; \ - _mur_key += 4; \ - } \ - \ - switch(_mur_len) \ - { \ - case 3: hashv ^= _mur_key[2] << 16; \ - case 2: hashv ^= _mur_key[1] << 8; \ - case 1: hashv ^= _mur_key[0]; \ - hashv *= _mur_m; \ - }; \ - \ - hashv ^= hashv >> 13; \ - hashv *= _mur_m; \ - hashv ^= hashv >> 15; \ - \ - bkt = hashv & (num_bkts-1); \ -} while(0) - -/* Appleby's MurmurHash version for alignment-sensitive archs like Sparc */ -#define HASH_MUR_ALIGNED(key,keylen,num_bkts,hashv,bkt) \ -do { \ - const unsigned int _mur_m = 0x5bd1e995; \ - const int _mur_r = 24; \ - hashv = 0xcafebabe ^ keylen; \ - char *_mur_key = (char *)key; \ - uint32_t _mur_len = keylen; \ - int _mur_align = (int)_mur_key & 3; \ - \ - if (_mur_align && (_mur_len >= 4)) { \ - unsigned _mur_t = 0, _mur_d = 0; \ - switch(_mur_align) { \ - case 1: _mur_t |= _mur_key[2] << 16; \ - case 2: _mur_t |= _mur_key[1] << 8; \ - case 3: _mur_t |= _mur_key[0]; \ - } \ - _mur_t <<= (8 * _mur_align); \ - _mur_key += 4-_mur_align; \ - _mur_len -= 4-_mur_align; \ - int _mur_sl = 8 * (4-_mur_align); \ - int _mur_sr = 8 * _mur_align; \ - \ - for (;_mur_len >= 4; _mur_len-=4) { \ - _mur_d = *(unsigned *)_mur_key; \ - _mur_t = (_mur_t >> _mur_sr) | (_mur_d << _mur_sl); \ - unsigned _mur_k = _mur_t; \ - _mur_k *= _mur_m; \ - _mur_k ^= _mur_k >> _mur_r; \ - _mur_k *= _mur_m; \ - hashv *= _mur_m; \ - hashv ^= _mur_k; \ - _mur_t = _mur_d; \ - _mur_key += 4; \ - } \ - _mur_d = 0; \ - if(_mur_len >= _mur_align) { \ - switch(_mur_align) { \ - case 3: _mur_d |= _mur_key[2] << 16; \ - case 2: _mur_d |= _mur_key[1] << 8; \ - case 1: _mur_d |= _mur_key[0]; \ - } \ - unsigned _mur_k = (_mur_t >> _mur_sr) | (_mur_d << _mur_sl); \ - _mur_k *= _mur_m; \ - _mur_k ^= _mur_k >> _mur_r; \ - _mur_k *= _mur_m; \ - hashv *= _mur_m; \ - hashv ^= _mur_k; \ - _mur_k += _mur_align; \ - _mur_len -= _mur_align; \ - \ - switch(_mur_len) \ - { \ - case 3: hashv ^= _mur_key[2] << 16; \ - case 2: hashv ^= _mur_key[1] << 8; \ - case 1: hashv ^= _mur_key[0]; \ - hashv *= _mur_m; \ - } \ - } else { \ - switch(_mur_len) \ - { \ - case 3: _mur_d ^= _mur_key[2] << 16; \ - case 2: _mur_d ^= _mur_key[1] << 8; \ - case 1: _mur_d ^= _mur_key[0]; \ - case 0: hashv ^= (_mur_t >> _mur_sr) | (_mur_d << _mur_sl); \ - hashv *= _mur_m; \ - } \ - } \ - \ - hashv ^= hashv >> 13; \ - hashv *= _mur_m; \ - hashv ^= hashv >> 15; \ - } else { \ - for (;_mur_len >= 4; _mur_len-=4) { \ - unsigned _mur_k = *(unsigned*)_mur_key; \ - _mur_k *= _mur_m; \ - _mur_k ^= _mur_k >> _mur_r; \ - _mur_k *= _mur_m; \ - hashv *= _mur_m; \ - hashv ^= _mur_k; \ - _mur_key += 4; \ - } \ - switch(_mur_len) \ - { \ - case 3: hashv ^= _mur_key[2] << 16; \ - case 2: hashv ^= _mur_key[1] << 8; \ - case 1: hashv ^= _mur_key[0]; \ - hashv *= _mur_m; \ - } \ - \ - hashv ^= hashv >> 13; \ - hashv *= _mur_m; \ - hashv ^= hashv >> 15; \ - } \ - bkt = hashv & (num_bkts-1); \ -} while(0) -#endif /* HASH_USING_NO_STRICT_ALIASING */ - -/* key comparison function; return 0 if keys equal */ -#define HASH_KEYCMP(a,b,len) memcmp(a,b,len) - -/* iterate over items in a known bucket to find desired item */ -#define HASH_FIND_IN_BKT(tbl,hh,head,keyptr,keylen_in,out) \ -do { \ - if (head.hh_head) DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,head.hh_head)); \ - else out=NULL; \ - while (out) { \ - if (out->hh.keylen == keylen_in) { \ - if ((HASH_KEYCMP(out->hh.key,keyptr,keylen_in)) == 0) break; \ - } \ - if (out->hh.hh_next) DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,out->hh.hh_next)); \ - else out = NULL; \ - } \ -} while(0) - -/* add an item to a bucket */ -#define HASH_ADD_TO_BKT(head,addhh) \ -do { \ - head.count++; \ - (addhh)->hh_next = head.hh_head; \ - (addhh)->hh_prev = NULL; \ - if (head.hh_head) { (head).hh_head->hh_prev = (addhh); } \ - (head).hh_head=addhh; \ - if (head.count >= ((head.expand_mult+1) * HASH_BKT_CAPACITY_THRESH) \ - && (addhh)->tbl->noexpand != 1) { \ - HASH_EXPAND_BUCKETS((addhh)->tbl); \ - } \ -} while(0) - -/* remove an item from a given bucket */ -#define HASH_DEL_IN_BKT(hh,head,hh_del) \ - (head).count--; \ - if ((head).hh_head == hh_del) { \ - (head).hh_head = hh_del->hh_next; \ - } \ - if (hh_del->hh_prev) { \ - hh_del->hh_prev->hh_next = hh_del->hh_next; \ - } \ - if (hh_del->hh_next) { \ - hh_del->hh_next->hh_prev = hh_del->hh_prev; \ - } - -/* Bucket expansion has the effect of doubling the number of buckets - * and redistributing the items into the new buckets. Ideally the - * items will distribute more or less evenly into the new buckets - * (the extent to which this is true is a measure of the quality of - * the hash function as it applies to the key domain). - * - * With the items distributed into more buckets, the chain length - * (item count) in each bucket is reduced. Thus by expanding buckets - * the hash keeps a bound on the chain length. This bounded chain - * length is the essence of how a hash provides constant time lookup. - * - * The calculation of tbl->ideal_chain_maxlen below deserves some - * explanation. First, keep in mind that we're calculating the ideal - * maximum chain length based on the *new* (doubled) bucket count. - * In fractions this is just n/b (n=number of items,b=new num buckets). - * Since the ideal chain length is an integer, we want to calculate - * ceil(n/b). We don't depend on floating point arithmetic in this - * hash, so to calculate ceil(n/b) with integers we could write - * - * ceil(n/b) = (n/b) + ((n%b)?1:0) - * - * and in fact a previous version of this hash did just that. - * But now we have improved things a bit by recognizing that b is - * always a power of two. We keep its base 2 log handy (call it lb), - * so now we can write this with a bit shift and logical AND: - * - * ceil(n/b) = (n>>lb) + ( (n & (b-1)) ? 1:0) - * - */ -#define HASH_EXPAND_BUCKETS(tbl) \ -do { \ - unsigned _he_bkt; \ - unsigned _he_bkt_i; \ - struct UT_hash_handle *_he_thh, *_he_hh_nxt; \ - UT_hash_bucket *_he_new_buckets, *_he_newbkt; \ - _he_new_buckets = (UT_hash_bucket*)uthash_malloc( \ - 2 * tbl->num_buckets * sizeof(struct UT_hash_bucket)); \ - if (!_he_new_buckets) { uthash_fatal( "out of memory"); } \ - memset(_he_new_buckets, 0, \ - 2 * tbl->num_buckets * sizeof(struct UT_hash_bucket)); \ - tbl->ideal_chain_maxlen = \ - (tbl->num_items >> (tbl->log2_num_buckets+1)) + \ - ((tbl->num_items & ((tbl->num_buckets*2)-1)) ? 1 : 0); \ - tbl->nonideal_items = 0; \ - for(_he_bkt_i = 0; _he_bkt_i < tbl->num_buckets; _he_bkt_i++) \ - { \ - _he_thh = tbl->buckets[ _he_bkt_i ].hh_head; \ - while (_he_thh) { \ - _he_hh_nxt = _he_thh->hh_next; \ - HASH_TO_BKT( _he_thh->hashv, tbl->num_buckets*2, _he_bkt); \ - _he_newbkt = &(_he_new_buckets[ _he_bkt ]); \ - if (++(_he_newbkt->count) > tbl->ideal_chain_maxlen) { \ - tbl->nonideal_items++; \ - _he_newbkt->expand_mult = _he_newbkt->count / \ - tbl->ideal_chain_maxlen; \ - } \ - _he_thh->hh_prev = NULL; \ - _he_thh->hh_next = _he_newbkt->hh_head; \ - if (_he_newbkt->hh_head) _he_newbkt->hh_head->hh_prev = \ - _he_thh; \ - _he_newbkt->hh_head = _he_thh; \ - _he_thh = _he_hh_nxt; \ - } \ - } \ - tbl->num_buckets *= 2; \ - tbl->log2_num_buckets++; \ - uthash_free( tbl->buckets ); \ - tbl->buckets = _he_new_buckets; \ - tbl->ineff_expands = (tbl->nonideal_items > (tbl->num_items >> 1)) ? \ - (tbl->ineff_expands+1) : 0; \ - if (tbl->ineff_expands > 1) { \ - tbl->noexpand=1; \ - uthash_noexpand_fyi(tbl); \ - } \ - uthash_expand_fyi(tbl); \ -} while(0) - - -/* This is an adaptation of Simon Tatham's O(n log(n)) mergesort */ -/* Note that HASH_SORT assumes the hash handle name to be hh. - * HASH_SRT was added to allow the hash handle name to be passed in. */ -#define HASH_SORT(head,cmpfcn) HASH_SRT(hh,head,cmpfcn) -#define HASH_SRT(hh,head,cmpfcn) \ -do { \ - unsigned _hs_i; \ - unsigned _hs_looping,_hs_nmerges,_hs_insize,_hs_psize,_hs_qsize; \ - struct UT_hash_handle *_hs_p, *_hs_q, *_hs_e, *_hs_list, *_hs_tail; \ - if (head) { \ - _hs_insize = 1; \ - _hs_looping = 1; \ - _hs_list = &((head)->hh); \ - while (_hs_looping) { \ - _hs_p = _hs_list; \ - _hs_list = NULL; \ - _hs_tail = NULL; \ - _hs_nmerges = 0; \ - while (_hs_p) { \ - _hs_nmerges++; \ - _hs_q = _hs_p; \ - _hs_psize = 0; \ - for ( _hs_i = 0; _hs_i < _hs_insize; _hs_i++ ) { \ - _hs_psize++; \ - _hs_q = (UT_hash_handle*)((_hs_q->next) ? \ - ((void*)((char*)(_hs_q->next) + \ - (head)->hh.tbl->hho)) : NULL); \ - if (! (_hs_q) ) break; \ - } \ - _hs_qsize = _hs_insize; \ - while ((_hs_psize > 0) || ((_hs_qsize > 0) && _hs_q )) { \ - if (_hs_psize == 0) { \ - _hs_e = _hs_q; \ - _hs_q = (UT_hash_handle*)((_hs_q->next) ? \ - ((void*)((char*)(_hs_q->next) + \ - (head)->hh.tbl->hho)) : NULL); \ - _hs_qsize--; \ - } else if ( (_hs_qsize == 0) || !(_hs_q) ) { \ - _hs_e = _hs_p; \ - _hs_p = (UT_hash_handle*)((_hs_p->next) ? \ - ((void*)((char*)(_hs_p->next) + \ - (head)->hh.tbl->hho)) : NULL); \ - _hs_psize--; \ - } else if (( \ - cmpfcn(DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_p)), \ - DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_q))) \ - ) <= 0) { \ - _hs_e = _hs_p; \ - _hs_p = (UT_hash_handle*)((_hs_p->next) ? \ - ((void*)((char*)(_hs_p->next) + \ - (head)->hh.tbl->hho)) : NULL); \ - _hs_psize--; \ - } else { \ - _hs_e = _hs_q; \ - _hs_q = (UT_hash_handle*)((_hs_q->next) ? \ - ((void*)((char*)(_hs_q->next) + \ - (head)->hh.tbl->hho)) : NULL); \ - _hs_qsize--; \ - } \ - if ( _hs_tail ) { \ - _hs_tail->next = ((_hs_e) ? \ - ELMT_FROM_HH((head)->hh.tbl,_hs_e) : NULL); \ - } else { \ - _hs_list = _hs_e; \ - } \ - _hs_e->prev = ((_hs_tail) ? \ - ELMT_FROM_HH((head)->hh.tbl,_hs_tail) : NULL); \ - _hs_tail = _hs_e; \ - } \ - _hs_p = _hs_q; \ - } \ - _hs_tail->next = NULL; \ - if ( _hs_nmerges <= 1 ) { \ - _hs_looping=0; \ - (head)->hh.tbl->tail = _hs_tail; \ - DECLTYPE_ASSIGN(head,ELMT_FROM_HH((head)->hh.tbl, _hs_list)); \ - } \ - _hs_insize *= 2; \ - } \ - HASH_FSCK(hh,head); \ - } \ -} while (0) - -/* This function selects items from one hash into another hash. - * The end result is that the selected items have dual presence - * in both hashes. There is no copy of the items made; rather - * they are added into the new hash through a secondary hash - * hash handle that must be present in the structure. */ -#define HASH_SELECT(hh_dst, dst, hh_src, src, cond) \ -do { \ - unsigned _src_bkt, _dst_bkt; \ - void *_last_elt=NULL, *_elt; \ - UT_hash_handle *_src_hh, *_dst_hh, *_last_elt_hh=NULL; \ - ptrdiff_t _dst_hho = ((char*)(&(dst)->hh_dst) - (char*)(dst)); \ - if (src) { \ - for(_src_bkt=0; _src_bkt < (src)->hh_src.tbl->num_buckets; _src_bkt++) { \ - for(_src_hh = (src)->hh_src.tbl->buckets[_src_bkt].hh_head; \ - _src_hh; \ - _src_hh = _src_hh->hh_next) { \ - _elt = ELMT_FROM_HH((src)->hh_src.tbl, _src_hh); \ - if (cond(_elt)) { \ - _dst_hh = (UT_hash_handle*)(((char*)_elt) + _dst_hho); \ - _dst_hh->key = _src_hh->key; \ - _dst_hh->keylen = _src_hh->keylen; \ - _dst_hh->hashv = _src_hh->hashv; \ - _dst_hh->prev = _last_elt; \ - _dst_hh->next = NULL; \ - if (_last_elt_hh) { _last_elt_hh->next = _elt; } \ - if (!dst) { \ - DECLTYPE_ASSIGN(dst,_elt); \ - HASH_MAKE_TABLE(hh_dst,dst); \ - } else { \ - _dst_hh->tbl = (dst)->hh_dst.tbl; \ - } \ - HASH_TO_BKT(_dst_hh->hashv, _dst_hh->tbl->num_buckets, _dst_bkt); \ - HASH_ADD_TO_BKT(_dst_hh->tbl->buckets[_dst_bkt],_dst_hh); \ - (dst)->hh_dst.tbl->num_items++; \ - _last_elt = _elt; \ - _last_elt_hh = _dst_hh; \ - } \ - } \ - } \ - } \ - HASH_FSCK(hh_dst,dst); \ -} while (0) - -#define HASH_CLEAR(hh,head) \ -do { \ - if (head) { \ - uthash_free((head)->hh.tbl->buckets ); \ - uthash_free((head)->hh.tbl); \ - (head)=NULL; \ - } \ -} while(0) - -/* obtain a count of items in the hash */ -#define HASH_COUNT(head) HASH_CNT(hh,head) -#define HASH_CNT(hh,head) (head?(head->hh.tbl->num_items):0) - -typedef struct UT_hash_bucket { - struct UT_hash_handle *hh_head; - unsigned count; - - /* expand_mult is normally set to 0. In this situation, the max chain length - * threshold is enforced at its default value, HASH_BKT_CAPACITY_THRESH. (If - * the bucket's chain exceeds this length, bucket expansion is triggered). - * However, setting expand_mult to a non-zero value delays bucket expansion - * (that would be triggered by additions to this particular bucket) - * until its chain length reaches a *multiple* of HASH_BKT_CAPACITY_THRESH. - * (The multiplier is simply expand_mult+1). The whole idea of this - * multiplier is to reduce bucket expansions, since they are expensive, in - * situations where we know that a particular bucket tends to be overused. - * It is better to let its chain length grow to a longer yet-still-bounded - * value, than to do an O(n) bucket expansion too often. - */ - unsigned expand_mult; - -} UT_hash_bucket; - -/* random signature used only to find hash tables in external analysis */ -#define HASH_SIGNATURE 0xa0111fe1 -#define HASH_BLOOM_SIGNATURE 0xb12220f2 - -typedef struct UT_hash_table { - UT_hash_bucket *buckets; - unsigned num_buckets, log2_num_buckets; - unsigned num_items; - struct UT_hash_handle *tail; /* tail hh in app order, for fast append */ - ptrdiff_t hho; /* hash handle offset (byte pos of hash handle in element */ - - /* in an ideal situation (all buckets used equally), no bucket would have - * more than ceil(#items/#buckets) items. that's the ideal chain length. */ - unsigned ideal_chain_maxlen; - - /* nonideal_items is the number of items in the hash whose chain position - * exceeds the ideal chain maxlen. these items pay the penalty for an uneven - * hash distribution; reaching them in a chain traversal takes >ideal steps */ - unsigned nonideal_items; - - /* ineffective expands occur when a bucket doubling was performed, but - * afterward, more than half the items in the hash had nonideal chain - * positions. If this happens on two consecutive expansions we inhibit any - * further expansion, as it's not helping; this happens when the hash - * function isn't a good fit for the key domain. When expansion is inhibited - * the hash will still work, albeit no longer in constant time. */ - unsigned ineff_expands, noexpand; - - uint32_t signature; /* used only to find hash tables in external analysis */ -#ifdef HASH_BLOOM - uint32_t bloom_sig; /* used only to test bloom exists in external analysis */ - uint8_t *bloom_bv; - char bloom_nbits; -#endif - -} UT_hash_table; - -typedef struct UT_hash_handle { - struct UT_hash_table *tbl; - void *prev; /* prev element in app order */ - void *next; /* next element in app order */ - struct UT_hash_handle *hh_prev; /* previous hh in bucket order */ - struct UT_hash_handle *hh_next; /* next hh in bucket order */ - void *key; /* ptr to enclosing struct's key */ - unsigned keylen; /* enclosing struct's key len */ - unsigned hashv; /* result of hash-fcn(key) */ -} UT_hash_handle; - -#endif /* UTHASH_H */ diff --git a/external/KTX-Software-master/lib/vk_format.h b/external/KTX-Software-master/lib/vk_format.h deleted file mode 100644 index a13b705..0000000 --- a/external/KTX-Software-master/lib/vk_format.h +++ /dev/null @@ -1,1371 +0,0 @@ -/* -================================================================================================ - -Description : Vulkan format properties and conversion from OpenGL. -Author : J.M.P. van Waveren -Date : 07/17/2016 -Language : C99 -Format : Real tabs with the tab size equal to 4 spaces. -Copyright : Copyright (c) 2016 Oculus VR, LLC. All Rights reserved. - - -LICENSE -======= - -Copyright (c) 2016 Oculus VR, LLC. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - - -DESCRIPTION -=========== - -This header implements several support routines to convert OpenGL formats/types -to Vulkan formats. These routines are particularly useful for loading file -formats that store OpenGL formats/types such as KTX and glTF. - -The functions in this header file convert the format, internalFormat and type -that are used as parameters to the following OpenGL functions: - -void glTexImage2D( GLenum target, GLint level, GLint internalFormat, - GLsizei width, GLsizei height, GLint border, - GLenum format, GLenum type, const GLvoid * data ); -void glTexImage3D( GLenum target, GLint level, GLint internalFormat, - GLsizei width, GLsizei height, GLsizei depth, GLint border, - GLenum format, GLenum type, const GLvoid * data ); -void glCompressedTexImage2D( GLenum target, GLint level, GLenum internalformat, - GLsizei width, GLsizei height, GLint border, - GLsizei imageSize, const GLvoid * data ); -void glCompressedTexImage3D( GLenum target, GLint level, GLenum internalformat, - GLsizei width, GLsizei height, GLsizei depth, GLint border, - GLsizei imageSize, const GLvoid * data ); -void glTexStorage2D( GLenum target, GLsizei levels, GLenum internalformat, - GLsizei width, GLsizei height ); -void glTexStorage3D( GLenum target, GLsizei levels, GLenum internalformat, - GLsizei width, GLsizei height, GLsizei depth ); -void glVertexAttribPointer( GLuint index, GLint size, GLenum type, GLboolean normalized, - GLsizei stride, const GLvoid * pointer); - - -IMPLEMENTATION -============== - -This file does not include OpenGL / OpenGL ES headers because: - - 1. Including OpenGL / OpenGL ES headers is platform dependent and - may require a separate installation of an OpenGL SDK. - 2. The OpenGL format/type constants are the same between extensions and core. - 3. The OpenGL format/type constants are the same between OpenGL and OpenGL ES. - 4. File formats like KTX and glTF may use OpenGL formats and types that - are not supported by the OpenGL implementation on the platform but are - supported by the Vulkan implementation. - - -ENTRY POINTS -============ - -static inline VkFormat vkGetFormatFromOpenGLFormat( const GLenum format, const GLenum type ); -static inline VkFormat vkGetFormatFromOpenGLType( const GLenum type, const GLuint numComponents, const GLboolean normalized ); -static inline VkFormat vkGetFormatFromOpenGLInternalFormat( const GLenum internalFormat ); -static inline void vkGetFormatSize( const VkFormat format, VkFormatSize * pFormatSize ); - -================================================================================================ -*/ - -#if !defined( VK_FORMAT_H ) -#define VK_FORMAT_H - -#include "gl_format.h" - -static inline VkFormat vkGetFormatFromOpenGLFormat( const GLenum format, const GLenum type ) -{ - switch ( type ) - { - // - // 8 bits per component - // - case GL_UNSIGNED_BYTE: - { - switch ( format ) - { - case GL_RED: return VK_FORMAT_R8_UNORM; - case GL_RG: return VK_FORMAT_R8G8_UNORM; - case GL_RGB: return VK_FORMAT_R8G8B8_UNORM; - case GL_BGR: return VK_FORMAT_B8G8R8_UNORM; - case GL_RGBA: return VK_FORMAT_R8G8B8A8_UNORM; - case GL_BGRA: return VK_FORMAT_B8G8R8A8_UNORM; - case GL_RED_INTEGER: return VK_FORMAT_R8_UINT; - case GL_RG_INTEGER: return VK_FORMAT_R8G8_UINT; - case GL_RGB_INTEGER: return VK_FORMAT_R8G8B8_UINT; - case GL_BGR_INTEGER: return VK_FORMAT_B8G8R8_UINT; - case GL_RGBA_INTEGER: return VK_FORMAT_R8G8B8A8_UINT; - case GL_BGRA_INTEGER: return VK_FORMAT_B8G8R8A8_UINT; - case GL_STENCIL_INDEX: return VK_FORMAT_S8_UINT; - case GL_DEPTH_COMPONENT: return VK_FORMAT_UNDEFINED; - case GL_DEPTH_STENCIL: return VK_FORMAT_UNDEFINED; - } - break; - } - case GL_BYTE: - { - switch ( format ) - { - case GL_RED: return VK_FORMAT_R8_SNORM; - case GL_RG: return VK_FORMAT_R8G8_SNORM; - case GL_RGB: return VK_FORMAT_R8G8B8_SNORM; - case GL_BGR: return VK_FORMAT_B8G8R8_SNORM; - case GL_RGBA: return VK_FORMAT_R8G8B8A8_SNORM; - case GL_BGRA: return VK_FORMAT_B8G8R8A8_SNORM; - case GL_RED_INTEGER: return VK_FORMAT_R8_SINT; - case GL_RG_INTEGER: return VK_FORMAT_R8G8_SINT; - case GL_RGB_INTEGER: return VK_FORMAT_R8G8B8_SINT; - case GL_BGR_INTEGER: return VK_FORMAT_B8G8R8_SINT; - case GL_RGBA_INTEGER: return VK_FORMAT_R8G8B8A8_SINT; - case GL_BGRA_INTEGER: return VK_FORMAT_B8G8R8A8_SINT; - case GL_STENCIL_INDEX: return VK_FORMAT_UNDEFINED; - case GL_DEPTH_COMPONENT: return VK_FORMAT_UNDEFINED; - case GL_DEPTH_STENCIL: return VK_FORMAT_UNDEFINED; - } - break; - } - - // - // 16 bits per component - // - case GL_UNSIGNED_SHORT: - { - switch ( format ) - { - case GL_RED: return VK_FORMAT_R16_UNORM; - case GL_RG: return VK_FORMAT_R16G16_UNORM; - case GL_RGB: return VK_FORMAT_R16G16B16_UNORM; - case GL_BGR: return VK_FORMAT_UNDEFINED; - case GL_RGBA: return VK_FORMAT_R16G16B16A16_UNORM; - case GL_BGRA: return VK_FORMAT_UNDEFINED; - case GL_RED_INTEGER: return VK_FORMAT_R16_UINT; - case GL_RG_INTEGER: return VK_FORMAT_R16G16_UINT; - case GL_RGB_INTEGER: return VK_FORMAT_R16G16B16_UINT; - case GL_BGR_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_RGBA_INTEGER: return VK_FORMAT_R16G16B16A16_UINT; - case GL_BGRA_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_STENCIL_INDEX: return VK_FORMAT_UNDEFINED; - case GL_DEPTH_COMPONENT: return VK_FORMAT_D16_UNORM; - case GL_DEPTH_STENCIL: return VK_FORMAT_D16_UNORM_S8_UINT; - } - break; - } - case GL_SHORT: - { - switch ( format ) - { - case GL_RED: return VK_FORMAT_R16_SNORM; - case GL_RG: return VK_FORMAT_R16G16_SNORM; - case GL_RGB: return VK_FORMAT_R16G16B16_SNORM; - case GL_BGR: return VK_FORMAT_UNDEFINED; - case GL_RGBA: return VK_FORMAT_R16G16B16A16_SNORM; - case GL_BGRA: return VK_FORMAT_UNDEFINED; - case GL_RED_INTEGER: return VK_FORMAT_R16_SINT; - case GL_RG_INTEGER: return VK_FORMAT_R16G16_SINT; - case GL_RGB_INTEGER: return VK_FORMAT_R16G16B16_SINT; - case GL_BGR_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_RGBA_INTEGER: return VK_FORMAT_R16G16B16A16_SINT; - case GL_BGRA_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_STENCIL_INDEX: return VK_FORMAT_UNDEFINED; - case GL_DEPTH_COMPONENT: return VK_FORMAT_UNDEFINED; - case GL_DEPTH_STENCIL: return VK_FORMAT_UNDEFINED; - } - break; - } - case GL_HALF_FLOAT: - case GL_HALF_FLOAT_OES: - { - switch ( format ) - { - case GL_RED: return VK_FORMAT_R16_SFLOAT; - case GL_RG: return VK_FORMAT_R16G16_SFLOAT; - case GL_RGB: return VK_FORMAT_R16G16B16_SFLOAT; - case GL_BGR: return VK_FORMAT_UNDEFINED; - case GL_RGBA: return VK_FORMAT_R16G16B16A16_SFLOAT; - case GL_BGRA: return VK_FORMAT_UNDEFINED; - case GL_RED_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_RG_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_RGB_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_BGR_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_RGBA_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_BGRA_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_STENCIL_INDEX: return VK_FORMAT_UNDEFINED; - case GL_DEPTH_COMPONENT: return VK_FORMAT_UNDEFINED; - case GL_DEPTH_STENCIL: return VK_FORMAT_UNDEFINED; - } - break; - } - - // - // 32 bits per component - // - case GL_UNSIGNED_INT: - { - switch ( format ) - { - case GL_RED: return VK_FORMAT_R32_UINT; - case GL_RG: return VK_FORMAT_R32G32_UINT; - case GL_RGB: return VK_FORMAT_R32G32B32_UINT; - case GL_BGR: return VK_FORMAT_UNDEFINED; - case GL_RGBA: return VK_FORMAT_R32G32B32A32_UINT; - case GL_BGRA: return VK_FORMAT_UNDEFINED; - case GL_RED_INTEGER: return VK_FORMAT_R32_UINT; - case GL_RG_INTEGER: return VK_FORMAT_R32G32_UINT; - case GL_RGB_INTEGER: return VK_FORMAT_R32G32B32_UINT; - case GL_BGR_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_RGBA_INTEGER: return VK_FORMAT_R32G32B32A32_UINT; - case GL_BGRA_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_STENCIL_INDEX: return VK_FORMAT_UNDEFINED; - case GL_DEPTH_COMPONENT: return VK_FORMAT_X8_D24_UNORM_PACK32; - case GL_DEPTH_STENCIL: return VK_FORMAT_D24_UNORM_S8_UINT; - } - break; - } - case GL_INT: - { - switch ( format ) - { - case GL_RED: return VK_FORMAT_R32_SINT; - case GL_RG: return VK_FORMAT_R32G32_SINT; - case GL_RGB: return VK_FORMAT_R32G32B32_SINT; - case GL_BGR: return VK_FORMAT_UNDEFINED; - case GL_RGBA: return VK_FORMAT_R32G32B32A32_SINT; - case GL_BGRA: return VK_FORMAT_UNDEFINED; - case GL_RED_INTEGER: return VK_FORMAT_R32_SINT; - case GL_RG_INTEGER: return VK_FORMAT_R32G32_SINT; - case GL_RGB_INTEGER: return VK_FORMAT_R32G32B32_SINT; - case GL_BGR_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_RGBA_INTEGER: return VK_FORMAT_R32G32B32A32_SINT; - case GL_BGRA_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_STENCIL_INDEX: return VK_FORMAT_UNDEFINED; - case GL_DEPTH_COMPONENT: return VK_FORMAT_UNDEFINED; - case GL_DEPTH_STENCIL: return VK_FORMAT_UNDEFINED; - } - break; - } - case GL_FLOAT: - { - switch ( format ) - { - case GL_RED: return VK_FORMAT_R32_SFLOAT; - case GL_RG: return VK_FORMAT_R32G32_SFLOAT; - case GL_RGB: return VK_FORMAT_R32G32B32_SFLOAT; - case GL_BGR: return VK_FORMAT_UNDEFINED; - case GL_RGBA: return VK_FORMAT_R32G32B32A32_SFLOAT; - case GL_BGRA: return VK_FORMAT_UNDEFINED; - case GL_RED_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_RG_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_RGB_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_BGR_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_RGBA_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_BGRA_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_STENCIL_INDEX: return VK_FORMAT_UNDEFINED; - case GL_DEPTH_COMPONENT: return VK_FORMAT_D32_SFLOAT; - case GL_DEPTH_STENCIL: return VK_FORMAT_D32_SFLOAT_S8_UINT; - } - break; - } - - // - // 64 bits per component - // - case GL_UNSIGNED_INT64: - { - switch ( format ) - { - case GL_RED: return VK_FORMAT_R64_UINT; - case GL_RG: return VK_FORMAT_R64G64_UINT; - case GL_RGB: return VK_FORMAT_R64G64B64_UINT; - case GL_BGR: return VK_FORMAT_UNDEFINED; - case GL_RGBA: return VK_FORMAT_R64G64B64A64_UINT; - case GL_BGRA: return VK_FORMAT_UNDEFINED; - case GL_RED_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_RG_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_RGB_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_BGR_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_RGBA_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_BGRA_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_STENCIL_INDEX: return VK_FORMAT_UNDEFINED; - case GL_DEPTH_COMPONENT: return VK_FORMAT_UNDEFINED; - case GL_DEPTH_STENCIL: return VK_FORMAT_UNDEFINED; - } - break; - } - case GL_INT64: - { - switch ( format ) - { - case GL_RED: return VK_FORMAT_R64_SINT; - case GL_RG: return VK_FORMAT_R64G64_SINT; - case GL_RGB: return VK_FORMAT_R64G64B64_SINT; - case GL_BGR: return VK_FORMAT_UNDEFINED; - case GL_RGBA: return VK_FORMAT_R64G64B64A64_SINT; - case GL_BGRA: return VK_FORMAT_UNDEFINED; - case GL_RED_INTEGER: return VK_FORMAT_R64_SINT; - case GL_RG_INTEGER: return VK_FORMAT_R64G64_SINT; - case GL_RGB_INTEGER: return VK_FORMAT_R64G64B64_SINT; - case GL_BGR_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_RGBA_INTEGER: return VK_FORMAT_R64G64B64A64_SINT; - case GL_BGRA_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_STENCIL_INDEX: return VK_FORMAT_UNDEFINED; - case GL_DEPTH_COMPONENT: return VK_FORMAT_UNDEFINED; - case GL_DEPTH_STENCIL: return VK_FORMAT_UNDEFINED; - } - break; - } - case GL_DOUBLE: - { - switch ( format ) - { - case GL_RED: return VK_FORMAT_R64_SFLOAT; - case GL_RG: return VK_FORMAT_R64G64_SFLOAT; - case GL_RGB: return VK_FORMAT_R64G64B64_SFLOAT; - case GL_BGR: return VK_FORMAT_UNDEFINED; - case GL_RGBA: return VK_FORMAT_R64G64B64A64_SFLOAT; - case GL_BGRA: return VK_FORMAT_UNDEFINED; - case GL_RED_INTEGER: return VK_FORMAT_R64_SFLOAT; - case GL_RG_INTEGER: return VK_FORMAT_R64G64_SFLOAT; - case GL_RGB_INTEGER: return VK_FORMAT_R64G64B64_SFLOAT; - case GL_BGR_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_RGBA_INTEGER: return VK_FORMAT_R64G64B64A64_SFLOAT; - case GL_BGRA_INTEGER: return VK_FORMAT_UNDEFINED; - case GL_STENCIL_INDEX: return VK_FORMAT_UNDEFINED; - case GL_DEPTH_COMPONENT: return VK_FORMAT_UNDEFINED; - case GL_DEPTH_STENCIL: return VK_FORMAT_UNDEFINED; - } - break; - } - - // - // Packed - // - case GL_UNSIGNED_BYTE_3_3_2: - assert( format == GL_RGB || format == GL_RGB_INTEGER ); - return VK_FORMAT_UNDEFINED; - case GL_UNSIGNED_BYTE_2_3_3_REV: - assert( format == GL_BGR || format == GL_BGR_INTEGER ); - return VK_FORMAT_UNDEFINED; - case GL_UNSIGNED_SHORT_5_6_5: - assert( format == GL_RGB || format == GL_RGB_INTEGER ); - return VK_FORMAT_R5G6B5_UNORM_PACK16; - case GL_UNSIGNED_SHORT_5_6_5_REV: - assert( format == GL_BGR || format == GL_BGR_INTEGER ); - return VK_FORMAT_B5G6R5_UNORM_PACK16; - case GL_UNSIGNED_SHORT_4_4_4_4: - assert( format == GL_RGB || format == GL_BGRA || format == GL_RGB_INTEGER || format == GL_BGRA_INTEGER ); - return VK_FORMAT_R4G4B4A4_UNORM_PACK16; - case GL_UNSIGNED_SHORT_4_4_4_4_REV: - assert( format == GL_RGB || format == GL_BGRA || format == GL_RGB_INTEGER || format == GL_BGRA_INTEGER ); - return VK_FORMAT_B4G4R4A4_UNORM_PACK16; - case GL_UNSIGNED_SHORT_5_5_5_1: - assert( format == GL_RGB || format == GL_BGRA || format == GL_RGB_INTEGER || format == GL_BGRA_INTEGER ); - return VK_FORMAT_R5G5B5A1_UNORM_PACK16; - case GL_UNSIGNED_SHORT_1_5_5_5_REV: - assert( format == GL_RGB || format == GL_BGRA || format == GL_RGB_INTEGER || format == GL_BGRA_INTEGER ); - return VK_FORMAT_A1R5G5B5_UNORM_PACK16; - case GL_UNSIGNED_INT_8_8_8_8: - assert( format == GL_RGB || format == GL_BGRA || format == GL_RGB_INTEGER || format == GL_BGRA_INTEGER ); - return ( format == GL_RGB_INTEGER || format == GL_BGRA_INTEGER ) ? VK_FORMAT_R8G8B8A8_UINT : VK_FORMAT_R8G8B8A8_UNORM; - case GL_UNSIGNED_INT_8_8_8_8_REV: - assert( format == GL_RGB || format == GL_BGRA || format == GL_RGB_INTEGER || format == GL_BGRA_INTEGER ); - return ( format == GL_RGB_INTEGER || format == GL_BGRA_INTEGER ) ? VK_FORMAT_A8B8G8R8_UINT_PACK32 : VK_FORMAT_A8B8G8R8_UNORM_PACK32; - case GL_UNSIGNED_INT_10_10_10_2: - assert( format == GL_RGB || format == GL_BGRA || format == GL_RGB_INTEGER || format == GL_BGRA_INTEGER ); - return ( format == GL_RGB_INTEGER || format == GL_BGRA_INTEGER ) ? VK_FORMAT_A2R10G10B10_UINT_PACK32 : VK_FORMAT_A2R10G10B10_UNORM_PACK32; - case GL_UNSIGNED_INT_2_10_10_10_REV: - assert( format == GL_RGB || format == GL_BGRA || format == GL_RGB_INTEGER || format == GL_BGRA_INTEGER ); - return ( format == GL_RGB_INTEGER || format == GL_BGRA_INTEGER ) ? VK_FORMAT_A2B10G10R10_UINT_PACK32 : VK_FORMAT_A2B10G10R10_UNORM_PACK32; - case GL_UNSIGNED_INT_10F_11F_11F_REV: - assert( format == GL_RGB || format == GL_BGR ); - return VK_FORMAT_B10G11R11_UFLOAT_PACK32; - case GL_UNSIGNED_INT_5_9_9_9_REV: - assert( format == GL_RGB || format == GL_BGR ); - return VK_FORMAT_E5B9G9R9_UFLOAT_PACK32; - case GL_UNSIGNED_INT_24_8: - assert( format == GL_DEPTH_STENCIL ); - return VK_FORMAT_D24_UNORM_S8_UINT; - case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: - assert( format == GL_DEPTH_STENCIL ); - return VK_FORMAT_D32_SFLOAT_S8_UINT; - } - - return VK_FORMAT_UNDEFINED; -} - -static inline VkFormat vkGetFormatFromOpenGLType( const GLenum type, const GLuint numComponents, const GLboolean normalized ) -{ - switch ( type ) - { - // - // 8 bits per component - // - case GL_UNSIGNED_BYTE: - { - switch ( numComponents ) - { - case 1: return normalized ? VK_FORMAT_R8_UNORM : VK_FORMAT_R8_UINT; - case 2: return normalized ? VK_FORMAT_R8G8_UNORM : VK_FORMAT_R8G8_UINT; - case 3: return normalized ? VK_FORMAT_R8G8B8_UNORM : VK_FORMAT_R8G8B8_UINT; - case 4: return normalized ? VK_FORMAT_R8G8B8A8_UNORM : VK_FORMAT_R8G8B8A8_UINT; - } - break; - } - case GL_BYTE: - { - switch ( numComponents ) - { - case 1: return normalized ? VK_FORMAT_R8_SNORM : VK_FORMAT_R8_SINT; - case 2: return normalized ? VK_FORMAT_R8G8_SNORM : VK_FORMAT_R8G8_SINT; - case 3: return normalized ? VK_FORMAT_R8G8B8_SNORM : VK_FORMAT_R8G8B8_SINT; - case 4: return normalized ? VK_FORMAT_R8G8B8A8_SNORM : VK_FORMAT_R8G8B8A8_SINT; - } - break; - } - - // - // 16 bits per component - // - case GL_UNSIGNED_SHORT: - { - switch ( numComponents ) - { - case 1: return normalized ? VK_FORMAT_R16_UNORM : VK_FORMAT_R16_UINT; - case 2: return normalized ? VK_FORMAT_R16G16_UNORM : VK_FORMAT_R16G16_UINT; - case 3: return normalized ? VK_FORMAT_R16G16B16_UNORM : VK_FORMAT_R16G16B16_UINT; - case 4: return normalized ? VK_FORMAT_R16G16B16A16_UNORM : VK_FORMAT_R16G16B16A16_UINT; - } - break; - } - case GL_SHORT: - { - switch ( numComponents ) - { - case 1: return normalized ? VK_FORMAT_R16_SNORM : VK_FORMAT_R16_SINT; - case 2: return normalized ? VK_FORMAT_R16G16_SNORM : VK_FORMAT_R16G16_SINT; - case 3: return normalized ? VK_FORMAT_R16G16B16_SNORM : VK_FORMAT_R16G16B16_SINT; - case 4: return normalized ? VK_FORMAT_R16G16B16A16_SNORM : VK_FORMAT_R16G16B16A16_SINT; - } - break; - } - case GL_HALF_FLOAT: - case GL_HALF_FLOAT_OES: - { - switch ( numComponents ) - { - case 1: return VK_FORMAT_R16_SFLOAT; - case 2: return VK_FORMAT_R16G16_SFLOAT; - case 3: return VK_FORMAT_R16G16B16_SFLOAT; - case 4: return VK_FORMAT_R16G16B16A16_SFLOAT; - } - break; - } - - // - // 32 bits per component - // - case GL_UNSIGNED_INT: - { - switch ( numComponents ) - { - case 1: return VK_FORMAT_R32_UINT; - case 2: return VK_FORMAT_R32G32_UINT; - case 3: return VK_FORMAT_R32G32B32_UINT; - case 4: return VK_FORMAT_R32G32B32A32_UINT; - } - break; - } - case GL_INT: - { - switch ( numComponents ) - { - case 1: return VK_FORMAT_R32_SINT; - case 2: return VK_FORMAT_R32G32_SINT; - case 3: return VK_FORMAT_R32G32B32_SINT; - case 4: return VK_FORMAT_R32G32B32A32_SINT; - } - break; - } - case GL_FLOAT: - { - switch ( numComponents ) - { - case 1: return VK_FORMAT_R32_SFLOAT; - case 2: return VK_FORMAT_R32G32_SFLOAT; - case 3: return VK_FORMAT_R32G32B32_SFLOAT; - case 4: return VK_FORMAT_R32G32B32A32_SFLOAT; - } - break; - } - - // - // 64 bits per component - // - case GL_UNSIGNED_INT64: - { - switch ( numComponents ) - { - case 1: return VK_FORMAT_R64_UINT; - case 2: return VK_FORMAT_R64G64_UINT; - case 3: return VK_FORMAT_R64G64B64_UINT; - case 4: return VK_FORMAT_R64G64B64A64_UINT; - } - break; - } - case GL_INT64: - { - switch ( numComponents ) - { - case 1: return VK_FORMAT_R64_SINT; - case 2: return VK_FORMAT_R64G64_SINT; - case 3: return VK_FORMAT_R64G64B64_SINT; - case 4: return VK_FORMAT_R64G64B64A64_SINT; - } - break; - } - case GL_DOUBLE: - { - switch ( numComponents ) - { - case 1: return VK_FORMAT_R64_SFLOAT; - case 2: return VK_FORMAT_R64G64_SFLOAT; - case 3: return VK_FORMAT_R64G64B64_SFLOAT; - case 4: return VK_FORMAT_R64G64B64A64_SFLOAT; - } - break; - } - - // - // Packed - // - case GL_UNSIGNED_BYTE_3_3_2: return VK_FORMAT_UNDEFINED; - case GL_UNSIGNED_BYTE_2_3_3_REV: return VK_FORMAT_UNDEFINED; - case GL_UNSIGNED_SHORT_5_6_5: return VK_FORMAT_R5G6B5_UNORM_PACK16; - case GL_UNSIGNED_SHORT_5_6_5_REV: return VK_FORMAT_B5G6R5_UNORM_PACK16; - case GL_UNSIGNED_SHORT_4_4_4_4: return VK_FORMAT_R4G4B4A4_UNORM_PACK16; - case GL_UNSIGNED_SHORT_4_4_4_4_REV: return VK_FORMAT_B4G4R4A4_UNORM_PACK16; - case GL_UNSIGNED_SHORT_5_5_5_1: return VK_FORMAT_R5G5B5A1_UNORM_PACK16; - case GL_UNSIGNED_SHORT_1_5_5_5_REV: return VK_FORMAT_A1R5G5B5_UNORM_PACK16; - case GL_UNSIGNED_INT_8_8_8_8: return normalized ? VK_FORMAT_R8G8B8A8_UNORM : VK_FORMAT_R8G8B8A8_UINT; - case GL_UNSIGNED_INT_8_8_8_8_REV: return normalized ? VK_FORMAT_A8B8G8R8_UNORM_PACK32 : VK_FORMAT_A8B8G8R8_UINT_PACK32; - case GL_UNSIGNED_INT_10_10_10_2: return normalized ? VK_FORMAT_A2R10G10B10_UNORM_PACK32 : VK_FORMAT_A2R10G10B10_UINT_PACK32; - case GL_UNSIGNED_INT_2_10_10_10_REV: return normalized ? VK_FORMAT_A2B10G10R10_UNORM_PACK32 : VK_FORMAT_A2B10G10R10_UINT_PACK32; - case GL_UNSIGNED_INT_10F_11F_11F_REV: return VK_FORMAT_B10G11R11_UFLOAT_PACK32; - case GL_UNSIGNED_INT_5_9_9_9_REV: return VK_FORMAT_E5B9G9R9_UFLOAT_PACK32; - case GL_UNSIGNED_INT_24_8: return VK_FORMAT_D24_UNORM_S8_UINT; - case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: return VK_FORMAT_D32_SFLOAT_S8_UINT; - } - - return VK_FORMAT_UNDEFINED; -} - -static inline VkFormat vkGetFormatFromOpenGLInternalFormat( const GLenum internalFormat ) -{ - switch ( internalFormat ) - { - // - // 8 bits per component - // - case GL_R8: return VK_FORMAT_R8_UNORM; // 1-component, 8-bit unsigned normalized - case GL_RG8: return VK_FORMAT_R8G8_UNORM; // 2-component, 8-bit unsigned normalized - case GL_RGB8: return VK_FORMAT_R8G8B8_UNORM; // 3-component, 8-bit unsigned normalized - case GL_RGBA8: return VK_FORMAT_R8G8B8A8_UNORM; // 4-component, 8-bit unsigned normalized - - case GL_R8_SNORM: return VK_FORMAT_R8_SNORM; // 1-component, 8-bit signed normalized - case GL_RG8_SNORM: return VK_FORMAT_R8G8_SNORM; // 2-component, 8-bit signed normalized - case GL_RGB8_SNORM: return VK_FORMAT_R8G8B8_SNORM; // 3-component, 8-bit signed normalized - case GL_RGBA8_SNORM: return VK_FORMAT_R8G8B8A8_SNORM; // 4-component, 8-bit signed normalized - - case GL_R8UI: return VK_FORMAT_R8_UINT; // 1-component, 8-bit unsigned integer - case GL_RG8UI: return VK_FORMAT_R8G8_UINT; // 2-component, 8-bit unsigned integer - case GL_RGB8UI: return VK_FORMAT_R8G8B8_UINT; // 3-component, 8-bit unsigned integer - case GL_RGBA8UI: return VK_FORMAT_R8G8B8A8_UINT; // 4-component, 8-bit unsigned integer - - case GL_R8I: return VK_FORMAT_R8_SINT; // 1-component, 8-bit signed integer - case GL_RG8I: return VK_FORMAT_R8G8_SINT; // 2-component, 8-bit signed integer - case GL_RGB8I: return VK_FORMAT_R8G8B8_SINT; // 3-component, 8-bit signed integer - case GL_RGBA8I: return VK_FORMAT_R8G8B8A8_SINT; // 4-component, 8-bit signed integer - - case GL_SR8: return VK_FORMAT_R8_SRGB; // 1-component, 8-bit sRGB - case GL_SRG8: return VK_FORMAT_R8G8_SRGB; // 2-component, 8-bit sRGB - case GL_SRGB8: return VK_FORMAT_R8G8B8_SRGB; // 3-component, 8-bit sRGB - case GL_SRGB8_ALPHA8: return VK_FORMAT_R8G8B8A8_SRGB; // 4-component, 8-bit sRGB - - // - // 16 bits per component - // - case GL_R16: return VK_FORMAT_R16_UNORM; // 1-component, 16-bit unsigned normalized - case GL_RG16: return VK_FORMAT_R16G16_UNORM; // 2-component, 16-bit unsigned normalized - case GL_RGB16: return VK_FORMAT_R16G16B16_UNORM; // 3-component, 16-bit unsigned normalized - case GL_RGBA16: return VK_FORMAT_R16G16B16A16_UNORM; // 4-component, 16-bit unsigned normalized - - case GL_R16_SNORM: return VK_FORMAT_R16_SNORM; // 1-component, 16-bit signed normalized - case GL_RG16_SNORM: return VK_FORMAT_R16G16_SNORM; // 2-component, 16-bit signed normalized - case GL_RGB16_SNORM: return VK_FORMAT_R16G16B16_SNORM; // 3-component, 16-bit signed normalized - case GL_RGBA16_SNORM: return VK_FORMAT_R16G16B16A16_SNORM; // 4-component, 16-bit signed normalized - - case GL_R16UI: return VK_FORMAT_R16_UINT; // 1-component, 16-bit unsigned integer - case GL_RG16UI: return VK_FORMAT_R16G16_UINT; // 2-component, 16-bit unsigned integer - case GL_RGB16UI: return VK_FORMAT_R16G16B16_UINT; // 3-component, 16-bit unsigned integer - case GL_RGBA16UI: return VK_FORMAT_R16G16B16A16_UINT; // 4-component, 16-bit unsigned integer - - case GL_R16I: return VK_FORMAT_R16_SINT; // 1-component, 16-bit signed integer - case GL_RG16I: return VK_FORMAT_R16G16_SINT; // 2-component, 16-bit signed integer - case GL_RGB16I: return VK_FORMAT_R16G16B16_SINT; // 3-component, 16-bit signed integer - case GL_RGBA16I: return VK_FORMAT_R16G16B16A16_SINT; // 4-component, 16-bit signed integer - - case GL_R16F: return VK_FORMAT_R16_SFLOAT; // 1-component, 16-bit floating-point - case GL_RG16F: return VK_FORMAT_R16G16_SFLOAT; // 2-component, 16-bit floating-point - case GL_RGB16F: return VK_FORMAT_R16G16B16_SFLOAT; // 3-component, 16-bit floating-point - case GL_RGBA16F: return VK_FORMAT_R16G16B16A16_SFLOAT; // 4-component, 16-bit floating-point - - // - // 32 bits per component - // - case GL_R32UI: return VK_FORMAT_R32_UINT; // 1-component, 32-bit unsigned integer - case GL_RG32UI: return VK_FORMAT_R32G32_UINT; // 2-component, 32-bit unsigned integer - case GL_RGB32UI: return VK_FORMAT_R32G32B32_UINT; // 3-component, 32-bit unsigned integer - case GL_RGBA32UI: return VK_FORMAT_R32G32B32A32_UINT; // 4-component, 32-bit unsigned integer - - case GL_R32I: return VK_FORMAT_R32_SINT; // 1-component, 32-bit signed integer - case GL_RG32I: return VK_FORMAT_R32G32_SINT; // 2-component, 32-bit signed integer - case GL_RGB32I: return VK_FORMAT_R32G32B32_SINT; // 3-component, 32-bit signed integer - case GL_RGBA32I: return VK_FORMAT_R32G32B32A32_SINT; // 4-component, 32-bit signed integer - - case GL_R32F: return VK_FORMAT_R32_SFLOAT; // 1-component, 32-bit floating-point - case GL_RG32F: return VK_FORMAT_R32G32_SFLOAT; // 2-component, 32-bit floating-point - case GL_RGB32F: return VK_FORMAT_R32G32B32_SFLOAT; // 3-component, 32-bit floating-point - case GL_RGBA32F: return VK_FORMAT_R32G32B32A32_SFLOAT; // 4-component, 32-bit floating-point - - // - // Packed - // - case GL_R3_G3_B2: return VK_FORMAT_UNDEFINED; // 3-component 3:3:2, unsigned normalized - case GL_RGB4: return VK_FORMAT_UNDEFINED; // 3-component 4:4:4, unsigned normalized - case GL_RGB5: return VK_FORMAT_R5G5B5A1_UNORM_PACK16; // 3-component 5:5:5, unsigned normalized - case GL_RGB565: return VK_FORMAT_R5G6B5_UNORM_PACK16; // 3-component 5:6:5, unsigned normalized - case GL_RGB10: return VK_FORMAT_A2R10G10B10_UNORM_PACK32; // 3-component 10:10:10, unsigned normalized - case GL_RGB12: return VK_FORMAT_UNDEFINED; // 3-component 12:12:12, unsigned normalized - case GL_RGBA2: return VK_FORMAT_UNDEFINED; // 4-component 2:2:2:2, unsigned normalized - case GL_RGBA4: return VK_FORMAT_R4G4B4A4_UNORM_PACK16; // 4-component 4:4:4:4, unsigned normalized - case GL_RGBA12: return VK_FORMAT_UNDEFINED; // 4-component 12:12:12:12, unsigned normalized - case GL_RGB5_A1: return VK_FORMAT_A1R5G5B5_UNORM_PACK16; // 4-component 5:5:5:1, unsigned normalized - case GL_RGB10_A2: return VK_FORMAT_A2R10G10B10_UNORM_PACK32; // 4-component 10:10:10:2, unsigned normalized - case GL_RGB10_A2UI: return VK_FORMAT_A2R10G10B10_UINT_PACK32; // 4-component 10:10:10:2, unsigned integer - case GL_R11F_G11F_B10F: return VK_FORMAT_B10G11R11_UFLOAT_PACK32; // 3-component 11:11:10, floating-point - case GL_RGB9_E5: return VK_FORMAT_E5B9G9R9_UFLOAT_PACK32; // 3-component/exp 9:9:9/5, floating-point - - // - // S3TC/DXT/BC - // - - case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return VK_FORMAT_BC1_RGB_UNORM_BLOCK; // line through 3D space, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return VK_FORMAT_BC1_RGBA_UNORM_BLOCK; // line through 3D space plus 1-bit alpha, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: return VK_FORMAT_BC2_UNORM_BLOCK; // line through 3D space plus line through 1D space, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: return VK_FORMAT_BC3_UNORM_BLOCK; // line through 3D space plus 4-bit alpha, 4x4 blocks, unsigned normalized - - case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: return VK_FORMAT_BC1_RGB_SRGB_BLOCK; // line through 3D space, 4x4 blocks, sRGB - case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: return VK_FORMAT_BC1_RGBA_SRGB_BLOCK; // line through 3D space plus 1-bit alpha, 4x4 blocks, sRGB - case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: return VK_FORMAT_BC2_SRGB_BLOCK; // line through 3D space plus line through 1D space, 4x4 blocks, sRGB - case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: return VK_FORMAT_BC3_SRGB_BLOCK; // line through 3D space plus 4-bit alpha, 4x4 blocks, sRGB - - case GL_COMPRESSED_LUMINANCE_LATC1_EXT: return VK_FORMAT_BC4_UNORM_BLOCK; // line through 1D space, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT: return VK_FORMAT_BC5_UNORM_BLOCK; // two lines through 1D space, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT: return VK_FORMAT_BC4_SNORM_BLOCK; // line through 1D space, 4x4 blocks, signed normalized - case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT: return VK_FORMAT_BC5_SNORM_BLOCK; // two lines through 1D space, 4x4 blocks, signed normalized - - case GL_COMPRESSED_RED_RGTC1: return VK_FORMAT_BC4_UNORM_BLOCK; // line through 1D space, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RG_RGTC2: return VK_FORMAT_BC5_UNORM_BLOCK; // two lines through 1D space, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SIGNED_RED_RGTC1: return VK_FORMAT_BC4_SNORM_BLOCK; // line through 1D space, 4x4 blocks, signed normalized - case GL_COMPRESSED_SIGNED_RG_RGTC2: return VK_FORMAT_BC5_SNORM_BLOCK; // two lines through 1D space, 4x4 blocks, signed normalized - - case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT: return VK_FORMAT_BC6H_UFLOAT_BLOCK; // 3-component, 4x4 blocks, unsigned floating-point - case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT: return VK_FORMAT_BC6H_SFLOAT_BLOCK; // 3-component, 4x4 blocks, signed floating-point - case GL_COMPRESSED_RGBA_BPTC_UNORM: return VK_FORMAT_BC7_UNORM_BLOCK; // 4-component, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM: return VK_FORMAT_BC7_SRGB_BLOCK; // 4-component, 4x4 blocks, sRGB - - // - // ETC - // - case GL_ETC1_RGB8_OES: return VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK; // 3-component ETC1, 4x4 blocks, unsigned normalized - - case GL_COMPRESSED_RGB8_ETC2: return VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK; // 3-component ETC2, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: return VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK; // 4-component ETC2 with 1-bit alpha, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA8_ETC2_EAC: return VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK; // 4-component ETC2, 4x4 blocks, unsigned normalized - - case GL_COMPRESSED_SRGB8_ETC2: return VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK; // 3-component ETC2, 4x4 blocks, sRGB - case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: return VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK; // 4-component ETC2 with 1-bit alpha, 4x4 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: return VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK; // 4-component ETC2, 4x4 blocks, sRGB - - case GL_COMPRESSED_R11_EAC: return VK_FORMAT_EAC_R11_UNORM_BLOCK; // 1-component ETC, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RG11_EAC: return VK_FORMAT_EAC_R11G11_UNORM_BLOCK; // 2-component ETC, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_SIGNED_R11_EAC: return VK_FORMAT_EAC_R11_SNORM_BLOCK; // 1-component ETC, 4x4 blocks, signed normalized - case GL_COMPRESSED_SIGNED_RG11_EAC: return VK_FORMAT_EAC_R11G11_SNORM_BLOCK; // 2-component ETC, 4x4 blocks, signed normalized - - // - // PVRTC - // - case GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG: return VK_FORMAT_UNDEFINED; // 3-component PVRTC, 16x8 blocks, unsigned normalized - case GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG: return VK_FORMAT_UNDEFINED; // 3-component PVRTC, 8x8 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: return VK_FORMAT_UNDEFINED; // 4-component PVRTC, 16x8 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: return VK_FORMAT_UNDEFINED; // 4-component PVRTC, 8x8 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG: return VK_FORMAT_UNDEFINED; // 4-component PVRTC, 8x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG: return VK_FORMAT_UNDEFINED; // 4-component PVRTC, 4x4 blocks, unsigned normalized - - case GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT: return VK_FORMAT_UNDEFINED; // 3-component PVRTC, 16x8 blocks, sRGB - case GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT: return VK_FORMAT_UNDEFINED; // 3-component PVRTC, 8x8 blocks, sRGB - case GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT: return VK_FORMAT_UNDEFINED; // 4-component PVRTC, 16x8 blocks, sRGB - case GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT: return VK_FORMAT_UNDEFINED; // 4-component PVRTC, 8x8 blocks, sRGB - case GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV2_IMG: return VK_FORMAT_UNDEFINED; // 4-component PVRTC, 8x4 blocks, sRGB - case GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV2_IMG: return VK_FORMAT_UNDEFINED; // 4-component PVRTC, 4x4 blocks, sRGB - - // - // ASTC - // - case GL_COMPRESSED_RGBA_ASTC_4x4_KHR: return VK_FORMAT_ASTC_4x4_UNORM_BLOCK; // 4-component ASTC, 4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_5x4_KHR: return VK_FORMAT_ASTC_5x4_UNORM_BLOCK; // 4-component ASTC, 5x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_5x5_KHR: return VK_FORMAT_ASTC_5x5_UNORM_BLOCK; // 4-component ASTC, 5x5 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_6x5_KHR: return VK_FORMAT_ASTC_6x5_UNORM_BLOCK; // 4-component ASTC, 6x5 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_6x6_KHR: return VK_FORMAT_ASTC_6x6_UNORM_BLOCK; // 4-component ASTC, 6x6 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_8x5_KHR: return VK_FORMAT_ASTC_8x5_UNORM_BLOCK; // 4-component ASTC, 8x5 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_8x6_KHR: return VK_FORMAT_ASTC_8x6_UNORM_BLOCK; // 4-component ASTC, 8x6 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_8x8_KHR: return VK_FORMAT_ASTC_8x8_UNORM_BLOCK; // 4-component ASTC, 8x8 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_10x5_KHR: return VK_FORMAT_ASTC_10x5_UNORM_BLOCK; // 4-component ASTC, 10x5 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_10x6_KHR: return VK_FORMAT_ASTC_10x6_UNORM_BLOCK; // 4-component ASTC, 10x6 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_10x8_KHR: return VK_FORMAT_ASTC_10x8_UNORM_BLOCK; // 4-component ASTC, 10x8 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_10x10_KHR: return VK_FORMAT_ASTC_10x10_UNORM_BLOCK; // 4-component ASTC, 10x10 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_12x10_KHR: return VK_FORMAT_ASTC_12x10_UNORM_BLOCK; // 4-component ASTC, 12x10 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_12x12_KHR: return VK_FORMAT_ASTC_12x12_UNORM_BLOCK; // 4-component ASTC, 12x12 blocks, unsigned normalized - - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: return VK_FORMAT_ASTC_4x4_SRGB_BLOCK; // 4-component ASTC, 4x4 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: return VK_FORMAT_ASTC_5x4_SRGB_BLOCK; // 4-component ASTC, 5x4 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: return VK_FORMAT_ASTC_5x5_SRGB_BLOCK; // 4-component ASTC, 5x5 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: return VK_FORMAT_ASTC_6x5_SRGB_BLOCK; // 4-component ASTC, 6x5 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: return VK_FORMAT_ASTC_6x6_SRGB_BLOCK; // 4-component ASTC, 6x6 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: return VK_FORMAT_ASTC_8x5_SRGB_BLOCK; // 4-component ASTC, 8x5 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: return VK_FORMAT_ASTC_8x6_SRGB_BLOCK; // 4-component ASTC, 8x6 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: return VK_FORMAT_ASTC_8x8_SRGB_BLOCK; // 4-component ASTC, 8x8 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: return VK_FORMAT_ASTC_10x5_SRGB_BLOCK; // 4-component ASTC, 10x5 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: return VK_FORMAT_ASTC_10x6_SRGB_BLOCK; // 4-component ASTC, 10x6 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: return VK_FORMAT_ASTC_10x8_SRGB_BLOCK; // 4-component ASTC, 10x8 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: return VK_FORMAT_ASTC_10x10_SRGB_BLOCK; // 4-component ASTC, 10x10 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: return VK_FORMAT_ASTC_12x10_SRGB_BLOCK; // 4-component ASTC, 12x10 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: return VK_FORMAT_ASTC_12x12_SRGB_BLOCK; // 4-component ASTC, 12x12 blocks, sRGB - - case GL_COMPRESSED_RGBA_ASTC_3x3x3_OES: return VK_FORMAT_UNDEFINED; // 4-component ASTC, 3x3x3 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_4x3x3_OES: return VK_FORMAT_UNDEFINED; // 4-component ASTC, 4x3x3 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_4x4x3_OES: return VK_FORMAT_UNDEFINED; // 4-component ASTC, 4x4x3 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_4x4x4_OES: return VK_FORMAT_UNDEFINED; // 4-component ASTC, 4x4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_5x4x4_OES: return VK_FORMAT_UNDEFINED; // 4-component ASTC, 5x4x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_5x5x4_OES: return VK_FORMAT_UNDEFINED; // 4-component ASTC, 5x5x4 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_5x5x5_OES: return VK_FORMAT_UNDEFINED; // 4-component ASTC, 5x5x5 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_6x5x5_OES: return VK_FORMAT_UNDEFINED; // 4-component ASTC, 6x5x5 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_6x6x5_OES: return VK_FORMAT_UNDEFINED; // 4-component ASTC, 6x6x5 blocks, unsigned normalized - case GL_COMPRESSED_RGBA_ASTC_6x6x6_OES: return VK_FORMAT_UNDEFINED; // 4-component ASTC, 6x6x6 blocks, unsigned normalized - - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES: return VK_FORMAT_UNDEFINED; // 4-component ASTC, 3x3x3 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES: return VK_FORMAT_UNDEFINED; // 4-component ASTC, 4x3x3 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES: return VK_FORMAT_UNDEFINED; // 4-component ASTC, 4x4x3 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES: return VK_FORMAT_UNDEFINED; // 4-component ASTC, 4x4x4 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES: return VK_FORMAT_UNDEFINED; // 4-component ASTC, 5x4x4 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES: return VK_FORMAT_UNDEFINED; // 4-component ASTC, 5x5x4 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES: return VK_FORMAT_UNDEFINED; // 4-component ASTC, 5x5x5 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES: return VK_FORMAT_UNDEFINED; // 4-component ASTC, 6x5x5 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES: return VK_FORMAT_UNDEFINED; // 4-component ASTC, 6x6x5 blocks, sRGB - case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES: return VK_FORMAT_UNDEFINED; // 4-component ASTC, 6x6x6 blocks, sRGB - - // - // ATC - // - case GL_ATC_RGB_AMD: return VK_FORMAT_UNDEFINED; // 3-component, 4x4 blocks, unsigned normalized - case GL_ATC_RGBA_EXPLICIT_ALPHA_AMD: return VK_FORMAT_UNDEFINED; // 4-component, 4x4 blocks, unsigned normalized - case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD: return VK_FORMAT_UNDEFINED; // 4-component, 4x4 blocks, unsigned normalized - - // - // Palletized - // - case GL_PALETTE4_RGB8_OES: return VK_FORMAT_UNDEFINED; // 3-component 8:8:8, 4-bit palette, unsigned normalized - case GL_PALETTE4_RGBA8_OES: return VK_FORMAT_UNDEFINED; // 4-component 8:8:8:8, 4-bit palette, unsigned normalized - case GL_PALETTE4_R5_G6_B5_OES: return VK_FORMAT_UNDEFINED; // 3-component 5:6:5, 4-bit palette, unsigned normalized - case GL_PALETTE4_RGBA4_OES: return VK_FORMAT_UNDEFINED; // 4-component 4:4:4:4, 4-bit palette, unsigned normalized - case GL_PALETTE4_RGB5_A1_OES: return VK_FORMAT_UNDEFINED; // 4-component 5:5:5:1, 4-bit palette, unsigned normalized - case GL_PALETTE8_RGB8_OES: return VK_FORMAT_UNDEFINED; // 3-component 8:8:8, 8-bit palette, unsigned normalized - case GL_PALETTE8_RGBA8_OES: return VK_FORMAT_UNDEFINED; // 4-component 8:8:8:8, 8-bit palette, unsigned normalized - case GL_PALETTE8_R5_G6_B5_OES: return VK_FORMAT_UNDEFINED; // 3-component 5:6:5, 8-bit palette, unsigned normalized - case GL_PALETTE8_RGBA4_OES: return VK_FORMAT_UNDEFINED; // 4-component 4:4:4:4, 8-bit palette, unsigned normalized - case GL_PALETTE8_RGB5_A1_OES: return VK_FORMAT_UNDEFINED; // 4-component 5:5:5:1, 8-bit palette, unsigned normalized - - // - // Depth/stencil - // - case GL_DEPTH_COMPONENT16: return VK_FORMAT_D16_UNORM; - case GL_DEPTH_COMPONENT24: return VK_FORMAT_X8_D24_UNORM_PACK32; - case GL_DEPTH_COMPONENT32: return VK_FORMAT_UNDEFINED; - case GL_DEPTH_COMPONENT32F: return VK_FORMAT_D32_SFLOAT; - case GL_DEPTH_COMPONENT32F_NV: return VK_FORMAT_D32_SFLOAT; - case GL_STENCIL_INDEX1: return VK_FORMAT_UNDEFINED; - case GL_STENCIL_INDEX4: return VK_FORMAT_UNDEFINED; - case GL_STENCIL_INDEX8: return VK_FORMAT_S8_UINT; - case GL_STENCIL_INDEX16: return VK_FORMAT_UNDEFINED; - case GL_DEPTH24_STENCIL8: return VK_FORMAT_D24_UNORM_S8_UINT; - case GL_DEPTH32F_STENCIL8: return VK_FORMAT_D32_SFLOAT_S8_UINT; - case GL_DEPTH32F_STENCIL8_NV: return VK_FORMAT_D32_SFLOAT_S8_UINT; - - default: return VK_FORMAT_UNDEFINED; - } -} - -typedef enum VkFormatSizeFlagBits { - VK_FORMAT_SIZE_PACKED_BIT = 0x00000001, - VK_FORMAT_SIZE_COMPRESSED_BIT = 0x00000002, - VK_FORMAT_SIZE_PALETTIZED_BIT = 0x00000004, - VK_FORMAT_SIZE_DEPTH_BIT = 0x00000008, - VK_FORMAT_SIZE_STENCIL_BIT = 0x00000010, -} VkFormatSizeFlagBits; - -typedef VkFlags VkFormatSizeFlags; - -typedef struct VkFormatSize { - VkFormatSizeFlags flags; - unsigned int paletteSizeInBits; - unsigned int blockSizeInBits; - unsigned int blockWidth; // in texels - unsigned int blockHeight; // in texels - unsigned int blockDepth; // in texels -} VkFormatSize; - -static inline void vkGetFormatSize( const VkFormat format, VkFormatSize * pFormatSize ) -{ - switch ( format ) - { - case VK_FORMAT_R4G4_UNORM_PACK8: - pFormatSize->flags = VK_FORMAT_SIZE_PACKED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 1 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_R4G4B4A4_UNORM_PACK16: - case VK_FORMAT_B4G4R4A4_UNORM_PACK16: - case VK_FORMAT_R5G6B5_UNORM_PACK16: - case VK_FORMAT_B5G6R5_UNORM_PACK16: - case VK_FORMAT_R5G5B5A1_UNORM_PACK16: - case VK_FORMAT_B5G5R5A1_UNORM_PACK16: - case VK_FORMAT_A1R5G5B5_UNORM_PACK16: - pFormatSize->flags = VK_FORMAT_SIZE_PACKED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 2 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_R8_UNORM: - case VK_FORMAT_R8_SNORM: - case VK_FORMAT_R8_USCALED: - case VK_FORMAT_R8_SSCALED: - case VK_FORMAT_R8_UINT: - case VK_FORMAT_R8_SINT: - case VK_FORMAT_R8_SRGB: - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 1 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_R8G8_UNORM: - case VK_FORMAT_R8G8_SNORM: - case VK_FORMAT_R8G8_USCALED: - case VK_FORMAT_R8G8_SSCALED: - case VK_FORMAT_R8G8_UINT: - case VK_FORMAT_R8G8_SINT: - case VK_FORMAT_R8G8_SRGB: - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 2 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_R8G8B8_UNORM: - case VK_FORMAT_R8G8B8_SNORM: - case VK_FORMAT_R8G8B8_USCALED: - case VK_FORMAT_R8G8B8_SSCALED: - case VK_FORMAT_R8G8B8_UINT: - case VK_FORMAT_R8G8B8_SINT: - case VK_FORMAT_R8G8B8_SRGB: - case VK_FORMAT_B8G8R8_UNORM: - case VK_FORMAT_B8G8R8_SNORM: - case VK_FORMAT_B8G8R8_USCALED: - case VK_FORMAT_B8G8R8_SSCALED: - case VK_FORMAT_B8G8R8_UINT: - case VK_FORMAT_B8G8R8_SINT: - case VK_FORMAT_B8G8R8_SRGB: - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 3 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_R8G8B8A8_UNORM: - case VK_FORMAT_R8G8B8A8_SNORM: - case VK_FORMAT_R8G8B8A8_USCALED: - case VK_FORMAT_R8G8B8A8_SSCALED: - case VK_FORMAT_R8G8B8A8_UINT: - case VK_FORMAT_R8G8B8A8_SINT: - case VK_FORMAT_R8G8B8A8_SRGB: - case VK_FORMAT_B8G8R8A8_UNORM: - case VK_FORMAT_B8G8R8A8_SNORM: - case VK_FORMAT_B8G8R8A8_USCALED: - case VK_FORMAT_B8G8R8A8_SSCALED: - case VK_FORMAT_B8G8R8A8_UINT: - case VK_FORMAT_B8G8R8A8_SINT: - case VK_FORMAT_B8G8R8A8_SRGB: - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 4 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_A8B8G8R8_UNORM_PACK32: - case VK_FORMAT_A8B8G8R8_SNORM_PACK32: - case VK_FORMAT_A8B8G8R8_USCALED_PACK32: - case VK_FORMAT_A8B8G8R8_SSCALED_PACK32: - case VK_FORMAT_A8B8G8R8_UINT_PACK32: - case VK_FORMAT_A8B8G8R8_SINT_PACK32: - case VK_FORMAT_A8B8G8R8_SRGB_PACK32: - pFormatSize->flags = VK_FORMAT_SIZE_PACKED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 4 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_A2R10G10B10_UNORM_PACK32: - case VK_FORMAT_A2R10G10B10_SNORM_PACK32: - case VK_FORMAT_A2R10G10B10_USCALED_PACK32: - case VK_FORMAT_A2R10G10B10_SSCALED_PACK32: - case VK_FORMAT_A2R10G10B10_UINT_PACK32: - case VK_FORMAT_A2R10G10B10_SINT_PACK32: - case VK_FORMAT_A2B10G10R10_UNORM_PACK32: - case VK_FORMAT_A2B10G10R10_SNORM_PACK32: - case VK_FORMAT_A2B10G10R10_USCALED_PACK32: - case VK_FORMAT_A2B10G10R10_SSCALED_PACK32: - case VK_FORMAT_A2B10G10R10_UINT_PACK32: - case VK_FORMAT_A2B10G10R10_SINT_PACK32: - pFormatSize->flags = VK_FORMAT_SIZE_PACKED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 4 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_R16_UNORM: - case VK_FORMAT_R16_SNORM: - case VK_FORMAT_R16_USCALED: - case VK_FORMAT_R16_SSCALED: - case VK_FORMAT_R16_UINT: - case VK_FORMAT_R16_SINT: - case VK_FORMAT_R16_SFLOAT: - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 2 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_R16G16_UNORM: - case VK_FORMAT_R16G16_SNORM: - case VK_FORMAT_R16G16_USCALED: - case VK_FORMAT_R16G16_SSCALED: - case VK_FORMAT_R16G16_UINT: - case VK_FORMAT_R16G16_SINT: - case VK_FORMAT_R16G16_SFLOAT: - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 4 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_R16G16B16_UNORM: - case VK_FORMAT_R16G16B16_SNORM: - case VK_FORMAT_R16G16B16_USCALED: - case VK_FORMAT_R16G16B16_SSCALED: - case VK_FORMAT_R16G16B16_UINT: - case VK_FORMAT_R16G16B16_SINT: - case VK_FORMAT_R16G16B16_SFLOAT: - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 6 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_R16G16B16A16_UNORM: - case VK_FORMAT_R16G16B16A16_SNORM: - case VK_FORMAT_R16G16B16A16_USCALED: - case VK_FORMAT_R16G16B16A16_SSCALED: - case VK_FORMAT_R16G16B16A16_UINT: - case VK_FORMAT_R16G16B16A16_SINT: - case VK_FORMAT_R16G16B16A16_SFLOAT: - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 8 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_R32_UINT: - case VK_FORMAT_R32_SINT: - case VK_FORMAT_R32_SFLOAT: - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 4 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_R32G32_UINT: - case VK_FORMAT_R32G32_SINT: - case VK_FORMAT_R32G32_SFLOAT: - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 8 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_R32G32B32_UINT: - case VK_FORMAT_R32G32B32_SINT: - case VK_FORMAT_R32G32B32_SFLOAT: - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 12 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_R32G32B32A32_UINT: - case VK_FORMAT_R32G32B32A32_SINT: - case VK_FORMAT_R32G32B32A32_SFLOAT: - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 16 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_R64_UINT: - case VK_FORMAT_R64_SINT: - case VK_FORMAT_R64_SFLOAT: - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 8 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_R64G64_UINT: - case VK_FORMAT_R64G64_SINT: - case VK_FORMAT_R64G64_SFLOAT: - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 16 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_R64G64B64_UINT: - case VK_FORMAT_R64G64B64_SINT: - case VK_FORMAT_R64G64B64_SFLOAT: - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 24 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_R64G64B64A64_UINT: - case VK_FORMAT_R64G64B64A64_SINT: - case VK_FORMAT_R64G64B64A64_SFLOAT: - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 32 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_B10G11R11_UFLOAT_PACK32: - case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32: - pFormatSize->flags = VK_FORMAT_SIZE_PACKED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 4 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_D16_UNORM: - pFormatSize->flags = VK_FORMAT_SIZE_DEPTH_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 2 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_X8_D24_UNORM_PACK32: - pFormatSize->flags = VK_FORMAT_SIZE_PACKED_BIT | VK_FORMAT_SIZE_DEPTH_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 4 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_D32_SFLOAT: - pFormatSize->flags = VK_FORMAT_SIZE_DEPTH_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 4 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_S8_UINT: - pFormatSize->flags = VK_FORMAT_SIZE_STENCIL_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 1 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_D16_UNORM_S8_UINT: - pFormatSize->flags = VK_FORMAT_SIZE_DEPTH_BIT | VK_FORMAT_SIZE_STENCIL_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 3 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_D24_UNORM_S8_UINT: - pFormatSize->flags = VK_FORMAT_SIZE_DEPTH_BIT | VK_FORMAT_SIZE_STENCIL_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 4 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_D32_SFLOAT_S8_UINT: - pFormatSize->flags = VK_FORMAT_SIZE_DEPTH_BIT | VK_FORMAT_SIZE_STENCIL_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 8 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_BC1_RGB_UNORM_BLOCK: - case VK_FORMAT_BC1_RGB_SRGB_BLOCK: - case VK_FORMAT_BC1_RGBA_UNORM_BLOCK: - case VK_FORMAT_BC1_RGBA_SRGB_BLOCK: - pFormatSize->flags = VK_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 8 * 8; - pFormatSize->blockWidth = 4; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_BC2_UNORM_BLOCK: - case VK_FORMAT_BC2_SRGB_BLOCK: - case VK_FORMAT_BC3_UNORM_BLOCK: - case VK_FORMAT_BC3_SRGB_BLOCK: - case VK_FORMAT_BC4_UNORM_BLOCK: - case VK_FORMAT_BC4_SNORM_BLOCK: - case VK_FORMAT_BC5_UNORM_BLOCK: - case VK_FORMAT_BC5_SNORM_BLOCK: - case VK_FORMAT_BC6H_UFLOAT_BLOCK: - case VK_FORMAT_BC6H_SFLOAT_BLOCK: - case VK_FORMAT_BC7_UNORM_BLOCK: - case VK_FORMAT_BC7_SRGB_BLOCK: - pFormatSize->flags = VK_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 16 * 8; - pFormatSize->blockWidth = 4; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK: - case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK: - case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK: - case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK: - pFormatSize->flags = VK_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 8 * 8; - pFormatSize->blockWidth = 4; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK: - case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK: - case VK_FORMAT_EAC_R11_UNORM_BLOCK: - case VK_FORMAT_EAC_R11_SNORM_BLOCK: - case VK_FORMAT_EAC_R11G11_UNORM_BLOCK: - case VK_FORMAT_EAC_R11G11_SNORM_BLOCK: - pFormatSize->flags = VK_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 16 * 8; - pFormatSize->blockWidth = 4; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_ASTC_4x4_UNORM_BLOCK: - case VK_FORMAT_ASTC_4x4_SRGB_BLOCK: - pFormatSize->flags = VK_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 16 * 8; - pFormatSize->blockWidth = 4; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_ASTC_5x4_UNORM_BLOCK: - case VK_FORMAT_ASTC_5x4_SRGB_BLOCK: - pFormatSize->flags = VK_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 16 * 8; - pFormatSize->blockWidth = 5; - pFormatSize->blockHeight = 4; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_ASTC_5x5_UNORM_BLOCK: - case VK_FORMAT_ASTC_5x5_SRGB_BLOCK: - pFormatSize->flags = VK_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 16 * 8; - pFormatSize->blockWidth = 5; - pFormatSize->blockHeight = 5; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_ASTC_6x5_UNORM_BLOCK: - case VK_FORMAT_ASTC_6x5_SRGB_BLOCK: - pFormatSize->flags = VK_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 16 * 8; - pFormatSize->blockWidth = 6; - pFormatSize->blockHeight = 5; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_ASTC_6x6_UNORM_BLOCK: - case VK_FORMAT_ASTC_6x6_SRGB_BLOCK: - pFormatSize->flags = VK_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 16 * 8; - pFormatSize->blockWidth = 6; - pFormatSize->blockHeight = 6; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_ASTC_8x5_UNORM_BLOCK: - case VK_FORMAT_ASTC_8x5_SRGB_BLOCK: - pFormatSize->flags = VK_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 16 * 8; - pFormatSize->blockWidth = 8; - pFormatSize->blockHeight = 5; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_ASTC_8x6_UNORM_BLOCK: - case VK_FORMAT_ASTC_8x6_SRGB_BLOCK: - pFormatSize->flags = VK_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 16 * 8; - pFormatSize->blockWidth = 8; - pFormatSize->blockHeight = 6; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_ASTC_8x8_UNORM_BLOCK: - case VK_FORMAT_ASTC_8x8_SRGB_BLOCK: - pFormatSize->flags = VK_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 16 * 8; - pFormatSize->blockWidth = 8; - pFormatSize->blockHeight = 8; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_ASTC_10x5_UNORM_BLOCK: - case VK_FORMAT_ASTC_10x5_SRGB_BLOCK: - pFormatSize->flags = VK_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 16 * 8; - pFormatSize->blockWidth = 10; - pFormatSize->blockHeight = 5; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_ASTC_10x6_UNORM_BLOCK: - case VK_FORMAT_ASTC_10x6_SRGB_BLOCK: - pFormatSize->flags = VK_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 16 * 8; - pFormatSize->blockWidth = 10; - pFormatSize->blockHeight = 6; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_ASTC_10x8_UNORM_BLOCK: - case VK_FORMAT_ASTC_10x8_SRGB_BLOCK: - pFormatSize->flags = VK_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 16 * 8; - pFormatSize->blockWidth = 10; - pFormatSize->blockHeight = 8; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_ASTC_10x10_UNORM_BLOCK: - case VK_FORMAT_ASTC_10x10_SRGB_BLOCK: - pFormatSize->flags = VK_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 16 * 8; - pFormatSize->blockWidth = 10; - pFormatSize->blockHeight = 10; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_ASTC_12x10_UNORM_BLOCK: - case VK_FORMAT_ASTC_12x10_SRGB_BLOCK: - pFormatSize->flags = VK_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 16 * 8; - pFormatSize->blockWidth = 12; - pFormatSize->blockHeight = 10; - pFormatSize->blockDepth = 1; - break; - case VK_FORMAT_ASTC_12x12_UNORM_BLOCK: - case VK_FORMAT_ASTC_12x12_SRGB_BLOCK: - pFormatSize->flags = VK_FORMAT_SIZE_COMPRESSED_BIT; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 16 * 8; - pFormatSize->blockWidth = 12; - pFormatSize->blockHeight = 12; - pFormatSize->blockDepth = 1; - break; - default: - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 0 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - } -} - -#endif // !VK_FORMAT_H diff --git a/external/KTX-Software-master/lib/vk_funclist.inl b/external/KTX-Software-master/lib/vk_funclist.inl deleted file mode 100644 index 80c23c9..0000000 --- a/external/KTX-Software-master/lib/vk_funclist.inl +++ /dev/null @@ -1,55 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4 expandtab textwidth=70: */ - -/* - * ©2017 Mark Callow. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @internal - * @file vk_funclist.h - * @~English - * - * @brief List of Vulkan functions used by libktx. - */ - -VK_FUNCTION(vkAllocateCommandBuffers) -VK_FUNCTION(vkAllocateMemory) -VK_FUNCTION(vkBeginCommandBuffer) -VK_FUNCTION(vkBindBufferMemory) -VK_FUNCTION(vkBindImageMemory) -VK_FUNCTION(vkCmdBlitImage) -VK_FUNCTION(vkCmdCopyBufferToImage) -VK_FUNCTION(vkCmdPipelineBarrier) -VK_FUNCTION(vkCreateBuffer) -VK_FUNCTION(vkCreateFence) -VK_FUNCTION(vkCreateImage) -VK_FUNCTION(vkDestroyBuffer) -VK_FUNCTION(vkDestroyFence) -VK_FUNCTION(vkDestroyImage) -VK_FUNCTION(vkEndCommandBuffer) -VK_FUNCTION(vkFreeCommandBuffers) -VK_FUNCTION(vkFreeMemory) -VK_FUNCTION(vkGetBufferMemoryRequirements) -VK_FUNCTION(vkGetImageMemoryRequirements) -VK_FUNCTION(vkGetImageSubresourceLayout) -VK_FUNCTION(vkGetPhysicalDeviceImageFormatProperties) -VK_FUNCTION(vkGetPhysicalDeviceFormatProperties) -VK_FUNCTION(vkGetPhysicalDeviceMemoryProperties) -VK_FUNCTION(vkMapMemory) -VK_FUNCTION(vkQueueSubmit) -VK_FUNCTION(vkQueueWaitIdle) -VK_FUNCTION(vkUnmapMemory) -VK_FUNCTION(vkWaitForFences) diff --git a/external/KTX-Software-master/lib/vk_funcs.c b/external/KTX-Software-master/lib/vk_funcs.c deleted file mode 100644 index 7d75053..0000000 --- a/external/KTX-Software-master/lib/vk_funcs.c +++ /dev/null @@ -1,164 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4 expandtab textwidth=70: */ - -/* - * ©2017 Mark Callow. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @internal - * @file vk_funcs.c - * @~English - * - * @brief Retrieve Vulkan function pointers needed by libktx - */ - -#if defined(KTX_USE_FUNCPTRS_FOR_VULKAN) - -#define UNIX 0 -#define MACOS 0 -#define WINDOWS 0 - -#if defined(_WIN32) -#undef WINDOWS -#define WINDOWS 1 -#endif -#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__) -#undef UNIX -#define UNIX 1 -#endif -#if defined(linux) || defined(__linux) || defined(__linux__) -#undef UNIX -#define UNIX 1 -#endif -#if defined(__APPLE__) && defined(__x86_64__) -#undef MACOS -#define MACOS 1 -#endif - -#if (IOS + MACOS + UNIX + WINDOWS) > 1 -#error "Multiple OS\'s defined" -#endif - -#if WINDOWS -#define WINDOWS_LEAN_AND_MEAN -#include <windows.h> -#else -#include <dlfcn.h> -#endif -#include "ktx.h" -#include "vk_funcs.h" - -#if WINDOWS -HMODULE ktxVulkanLibary; -#define LoadLibrary LoadLibrary -#define LoadProcAddr GetProcAddress -#elif MACOS || UNIX -#define LoadLibrary dlopen -#define LoadProcAddr dlsym -void* ktxVulkanLibrary; -#else -#error "Don\'t know how to load symbols on this OS." -#endif - -#if WINDOWS -#define VULKANLIB "vulkan-1.dll" -#elif MACOS -#define VULKANLIB "vulkan.framework/vulkan" -#elif UNIX -#define VULKANLIB "libvulkan.so" -#endif - -static PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr; - -/* Define pointers for functions libktx is using. */ -#define VK_FUNCTION(fun) PFN_##fun ktx_##fun; - -#include "vk_funclist.inl" - -#undef VK_FUNCTION - -#if 0 -// The Vulkan spec. recommends using vkGetInstanceProcAddr over dlsym -// (or whatever). Doing so would require a backward incompatible -// change to the libktx API to provide the VkInstance. We have no -// choice but dlsym. We can't use vkGetDeviceProcAddr because libktx -// also uses none-device-level functions. -#define VK_FUNCTION(fun) \ - if ( !(ktx_##fun = (PFN_##fun)vkGetInstanceProcAddr(instance, #fun )) ) { \ - fprintf(stderr, "Could not load Vulkan command: %s!\n", #fun); \ - return KTX_FALSE; \ - } -#else -#if defined(__GNUC__) -// This strange casting is because dlsym returns a void* thus is not -// compatible with ISO C which forbids conversion of object pointers -// to function pointers. The cast masks the conversion from the -// compiler thus no warning even though -pedantic is set. Since the -// platform supports dlsym, conversion to function pointers must -// work, despite the mandated ISO C warning. -#define VK_FUNCTION(fun) \ - if ( !(*(void **)(&ktx_##fun) = LoadProcAddr(ktxVulkanLibrary, #fun)) ) {\ - fprintf(stderr, "Could not load Vulkan command: %s!\n", #fun); \ - return KTX_FALSE; \ - } -#else -#define VK_FUNCTION(fun) \ - if ( !(ktx_##fun = (PFN_##fun)LoadProcAddr(ktxVulkanLibrary, #fun)) ) { \ - fprintf(stderr, "Could not load Vulkan command: %s!\n", #fun); \ - return KTX_FALSE; \ - } -#endif -#endif - -ktx_bool_t -ktxVulkanLoadLibrary(void) -{ - if (ktxVulkanLibrary) - return KTX_TRUE; - - ktxVulkanLibrary = LoadLibrary(VULKANLIB, RTLD_LAZY); - if (ktxVulkanLibrary == NULL) { - fprintf(stderr, "Could not load Vulkan library.\n"); - return(KTX_FALSE); - } - -#if 0 - vkGetInstanceProcAddr = - (PFN_vkGetInstanceProcAddr)LoadProcAddr(ktxVulkanLibrary, - "vkGetInstanceProcAddr"); - if (!vkGetInstanceProcAddr) { - fprintf(stderr, "Could not load Vulkan command: %s!\n", - "vkGetInstanceProcAddr"); - return(KTX_FALSE); - } -#endif - -#include "vk_funclist.inl" - - return KTX_TRUE; -} - -#undef VK_FUNCTION - -#else - -extern -#if defined(__GNUC__) -__attribute__((unused)) -#endif -int keepISOCompilersHappy; - -#endif /* KTX_USE_FUNCPTRS_FOR_VULKAN */ diff --git a/external/KTX-Software-master/lib/vk_funcs.h b/external/KTX-Software-master/lib/vk_funcs.h deleted file mode 100644 index 07ea0c2..0000000 --- a/external/KTX-Software-master/lib/vk_funcs.h +++ /dev/null @@ -1,97 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4 expandtab textwidth=70: */ - -/* - * ©2017 Mark Callow. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @internal - * @file vk_funcs.h - * @~English - * - * @brief Declare pointers for Vulkan functions. - * - * Dynamically retrieving pointers avoids apps having to make sure a - * Vulkan library is availablei when using a shared libktx, even if - * not using libktx's Vulkan loader. - */ - -#ifndef _VK_FUNCS_H_ -#define _VK_FUNCS_H_ - -#if defined(KTX_USE_FUNCPTRS_FOR_VULKAN) -#define VK_NO_PROTOTYPES -#endif - -#include <vulkan/vulkan.h> -#include "ktx.h" - -#if defined(KTX_USE_FUNCPTRS_FOR_VULKAN) - -#if defined(_WIN32) -extern HMODULE ktxVulkanLibary; -#else -extern void* ktxVulkanLibrary; -#endif - -extern ktx_bool_t ktxVulkanLoadLibrary(void); - -/* Declare pointers for functions libktx is using. */ -#define VK_FUNCTION(fun) extern PFN_##fun ktx_##fun; - -#include "vk_funclist.inl" - -#undef VK_FUNCTION - -/* - * Define prefixed names to prevent collisions with other libraries or apps - * finding our pointers when searching the module for function addresses. - */ -#define vkAllocateCommandBuffers ktx_vkAllocateCommandBuffers -#define vkAllocateMemory ktx_vkAllocateMemory -#define vkBeginCommandBuffer ktx_vkBeginCommandBuffer -#define vkBindBufferMemory ktx_vkBindBufferMemory -#define vkBindImageMemory ktx_vkBindImageMemory -#define vkCmdBlitImage ktx_vkCmdBlitImage -#define vkCmdCopyBufferToImage ktx_vkCmdCopyBufferToImage -#define vkCmdPipelineBarrier ktx_vkCmdPipelineBarrier -#define vkCreateBuffer ktx_vkCreateBuffer -#define vkCreateFence ktx_vkCreateFence -#define vkCreateImage ktx_vkCreateImage -#define vkDestroyBuffer ktx_vkDestroyBuffer -#define vkDestroyFence ktx_vkDestroyFence -#define vkDestroyImage ktx_vkDestroyImage -#define vkEndCommandBuffer ktx_vkEndCommandBuffer -#define vkFreeCommandBuffers ktx_vkFreeCommandBuffers -#define vkFreeMemory ktx_vkFreeMemory -#define vkGetBufferMemoryRequirements ktx_vkGetBufferMemoryRequirements -#define vkGetImageMemoryRequirements ktx_vkGetImageMemoryRequirements -#define vkGetImageSubresourceLayout ktx_vkGetImageSubresourceLayout -#define vkGetPhysicalDeviceImageFormatProperties ktx_vkGetPhysicalDeviceImageFormatProperties -#define vkGetPhysicalDeviceFormatProperties ktx_vkGetPhysicalDeviceFormatProperties -#define vkGetPhysicalDeviceMemoryProperties ktx_vkGetPhysicalDeviceMemoryProperties -#define vkMapMemory ktx_vkMapMemory -#define vkQueueSubmit ktx_vkQueueSubmit -#define vkQueueWaitIdle ktx_vkQueueWaitIdle -#define vkUnmapMemory ktx_vkUnmapMemory -#define vkWaitForFences ktx_vkWaitForFences - -#undef VK_FUNCTION - -#endif /* KTX_USE_FUNCPTRS_FOR_VULKAN */ - -#endif /* _VK_FUNCS_H_ */ - diff --git a/external/KTX-Software-master/lib/vkloader.c b/external/KTX-Software-master/lib/vkloader.c deleted file mode 100644 index 9916ce2..0000000 --- a/external/KTX-Software-master/lib/vkloader.c +++ /dev/null @@ -1,1444 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4 expandtab: */ - -/* - * ©2018 Mark Callow. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @internal - * @file - * @~English - * - * @brief Functions for instantiating Vulkan textures from KTX files. - * - * @author Mark Callow, Edgewise Consulting - */ - -#ifdef _WIN32 -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include <assert.h> -#include <math.h> -#include <stdlib.h> -#include <string.h> - -#if defined(KTX_USE_FUNCPTRS_FOR_VULKAN) -#include "vk_funcs.h" // Must be included before ktxvulkan.h. -#endif -#include "ktxvulkan.h" -#include "ktxint.h" -#include "vk_format.h" - -// Macro to check and display Vulkan return results. -// Use when the only possible errors are caused by invalid usage by this loader. -#if defined(_DEBUG) -#define VK_CHECK_RESULT(f) \ -{ \ - VkResult res = (f); \ - if (res != VK_SUCCESS) \ - { \ - /* XXX Find an errorString function. */ \ - fprintf(stderr, "Fatal error in ktxLoadVkTexture*: " \ - "VkResult is \"%d\" in %s at line %d\n", \ - res, __FILE__, __LINE__); \ - assert(res == VK_SUCCESS); \ - } \ -} -#else -#define VK_CHECK_RESULT(f) ((void)f) -#endif - -#define ARRAY_LEN(a) (sizeof(a) / sizeof(a[0])) - -#define DEFAULT_FENCE_TIMEOUT 100000000000 -#define VK_FLAGS_NONE 0 - -static void -setImageLayout( - VkCommandBuffer cmdBuffer, - VkImage image, - VkImageLayout oldLayout, - VkImageLayout newLayout, - VkImageSubresourceRange subresourceRange); - -static void -generateMipmaps(ktxVulkanTexture* vkTexture, ktxVulkanDeviceInfo* vdi, - VkFilter filter, VkImageLayout initialLayout); - -/** - * @defgroup ktx_vkloader Vulkan Texture Image Loader - * @brief Create texture images on a Vulkan device. - * @{ - */ - -/** - * @example vkload.cpp - * This shows how to create and load a Vulkan image using the Vulkan texture - * image loading functions. - */ - -/** - * @memberof ktxVulkanDeviceInfo - * @~English - * @brief Create a ktxVulkanDeviceInfo object. - * - * Allocates CPU memory for a ktxVulkanDeviceInfo object then calls - * ktxVulkanDeviceInfo_construct(). See it for documentation of the - * parameters. - * - * @return a pointer to the constructed ktxVulkanDeviceInfo. - * - * @sa ktxVulkanDeviceInfo_construct(), ktxVulkanDeviceInfo_destroy() - */ -ktxVulkanDeviceInfo* -ktxVulkanDeviceInfo_Create(VkPhysicalDevice physicalDevice, VkDevice device, - VkQueue queue, VkCommandPool cmdPool, - const VkAllocationCallbacks* pAllocator) -{ - ktxVulkanDeviceInfo* newvdi; - newvdi = (ktxVulkanDeviceInfo*)malloc(sizeof(ktxVulkanDeviceInfo)); - if (newvdi != NULL) { - if (ktxVulkanDeviceInfo_Construct(newvdi, physicalDevice, device, - queue, cmdPool, pAllocator) != KTX_SUCCESS) - { - free(newvdi); - newvdi = 0; - } - } - return newvdi; -} - -/** - * @memberof ktxVulkanDeviceInfo - * @~English - * @brief Construct a ktxVulkanDeviceInfo object. - * - * Records the device information, allocates a command buffer that will be - * used to transfer image data to the Vulkan device and retrieves the physical - * device memory properties for ease of use when allocating device memory for - * the images. - * - * Pass a valid ktxVulkanDeviceInfo* to any Vulkan KTX image loading - * function to provide it with the information. - * - * @param This pointer to the ktxVulkanDeviceInfo object to - * initialize. - * @param physicalDevice handle of the Vulkan physical device. - * @param device handle of the Vulkan logical device. - * @param queue handle of the Vulkan queue. - * @param cmdPool handle of the Vulkan command pool. - * @param pAllocator pointer to the allocator to use for the image - * memory. If NULL, the default allocator will be used. - * - * @returns KTX_SUCCESS on success, KTX_OUT_OF_MEMORY if a command buffer could - * not be allocated. - * - * @sa ktxVulkanDeviceInfo_destruct() - */ -KTX_error_code -ktxVulkanDeviceInfo_Construct(ktxVulkanDeviceInfo* This, - VkPhysicalDevice physicalDevice, VkDevice device, - VkQueue queue, VkCommandPool cmdPool, - const VkAllocationCallbacks* pAllocator) -{ - VkCommandBufferAllocateInfo cmdBufInfo = { - .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO - }; - VkResult result; - -#if defined(KTX_USE_FUNCPTRS_FOR_VULKAN) - // Delay loading not supported so must do it ourselves. - if (!ktxVulkanLibrary) { - if (!ktxVulkanLoadLibrary()) - // Normal use is for this constructor to be called by an application - // that has completed Vulkan initialization. In that case the only - // cause for failure would be an incompatible in the version of libvulkan - // that is loaded. The only other cause would be an application calling - // Vulkan functions without having initialized Vulkan. - // - // In these cases, an abort along with the messages sent to stderr by - // ktxVulkanLoadLibrary is sufficient as released applications should - // never suffer these. - abort(); - } -#endif - - This->physicalDevice = physicalDevice; - This->device = device; - This->queue = queue; - This->cmdPool = cmdPool; - This->pAllocator = pAllocator; - vkGetPhysicalDeviceMemoryProperties(physicalDevice, - &This->deviceMemoryProperties); - - // Use a separate command buffer for texture loading. Needed for - // submitting image barriers and converting tilings. - cmdBufInfo.commandPool = cmdPool; - cmdBufInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; - cmdBufInfo.commandBufferCount = 1; - result = vkAllocateCommandBuffers(device, &cmdBufInfo, &This->cmdBuffer); - if (result != VK_SUCCESS) { - return KTX_OUT_OF_MEMORY; // XXX Consider an equivalent to pGlError - } - return KTX_SUCCESS; -} - -/** - * @memberof ktxVulkanDeviceInfo - * @~English - * @brief Destruct a ktxVulkanDeviceInfo object. - * - * Frees the command buffer. - * - * @param This pointer to the ktxVulkanDeviceInfo to destruct. - */ -void -ktxVulkanDeviceInfo_Destruct(ktxVulkanDeviceInfo* This) -{ - vkFreeCommandBuffers(This->device, This->cmdPool, 1, - &This->cmdBuffer); -} - -/** - * @memberof ktxVulkanDeviceInfo - * @~English - * @brief Destroy a ktxVulkanDeviceInfo object. - * - * Calls ktxVulkanDeviceInfo_destruct() then frees the ktxVulkanDeviceInfo. - * - * @param This pointer to the ktxVulkanDeviceInfo to destroy. - */ -void -ktxVulkanDeviceInfo_Destroy(ktxVulkanDeviceInfo* This) -{ - assert(This != NULL); - ktxVulkanDeviceInfo_Destruct(This); - free(This); -} - -/* Get appropriate memory type index for a memory allocation. */ -static uint32_t -ktxVulkanDeviceInfo_getMemoryType(ktxVulkanDeviceInfo* This, - uint32_t typeBits, VkFlags properties) -{ - for (uint32_t i = 0; i < 32; i++) - { - if ((typeBits & 1) == 1) - { - if ((This->deviceMemoryProperties.memoryTypes[i].propertyFlags & properties) == properties) - { - return i; - } - } - typeBits >>= 1; - } - - // XXX : throw error - return 0; -} - -//====================================================================== -// ReadImages callbacks -//====================================================================== - -typedef struct user_cbdata_optimal { - VkBufferImageCopy* region; // Specify destination region in final image. - VkDeviceSize offset; // Offset of current level in staging buffer - ktx_uint32_t numFaces; - ktx_uint32_t numLayers; - // The following are used only by optimalTilingPadCallback - ktx_uint8_t* dest; // Pointer to mapped staging buffer. - ktx_uint32_t elementSize; - ktx_uint32_t numDimensions; -#if defined(_DEBUG) - VkBufferImageCopy* regionsArrayEnd; -#endif -} user_cbdata_optimal; - -/** - * @internal - * @~English - * @brief Callback for optimally tiled textures with no source row padding. - * - * Images must be preloaded into the staging buffer. Each iteration, i.e. - * the value of @p faceLodSize must be for a complete mip level, regardless of - * texture type. This should be used only with @c ktx_Texture_IterateLevels. - * - * Sets up a region to copy the data from the staging buffer to the final - * image. - * - * @note @p pixels is not used. - * - * @copydetails PFNKTXITERCB - */ -static KTX_error_code KTXAPIENTRY -optimalTilingCallback(int miplevel, int face, - int width, int height, int depth, - ktx_uint32_t faceLodSize, - void* pixels, void* userdata) -{ - user_cbdata_optimal* ud = (user_cbdata_optimal*)userdata; - - // Set up copy to destination region in final image - assert(ud->region < ud->regionsArrayEnd); - ud->region->bufferOffset = ud->offset; - ud->offset += faceLodSize; - // These 2 are expressed in texels. - ud->region->bufferRowLength = 0; - ud->region->bufferImageHeight = 0; - ud->region->imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - ud->region->imageSubresource.mipLevel = miplevel; - ud->region->imageSubresource.baseArrayLayer = face; - ud->region->imageSubresource.layerCount = ud->numLayers * ud->numFaces; - ud->region->imageOffset.x = 0; - ud->region->imageOffset.y = 0; - ud->region->imageOffset.z = 0; - ud->region->imageExtent.width = width; - ud->region->imageExtent.height = height; - ud->region->imageExtent.depth = depth; - - ud->region += 1; - - return KTX_SUCCESS; -} - -/** - * @internal - * @~English - * @brief Callback for optimally tiled textures with possible source row - * padding. - * - * Copies data to the staging buffer removing row padding, if necessary. - * Increments the offset for destination of the next copy increasing it to an - * appropriate common multiple of the element size and 4 to comply with Vulkan - * valid usage. Finally sets up a region to copy the face/lod from the staging - * buffer to the final image. - * - * This longer method is needed because row padding is different between - * KTX (pad to 4) and Vulkan (none). Also region->bufferOffset, i.e. the start - * of each image, has to be a multiple of 4 and also a multiple of the - * element size. - * - * This should be used with @c ktx_Texture_IterateFaceLevels or - * @c ktx_Texture_IterateLoadFaceLevels. Face-level iteration has been - * selected to minimize the buffering needed between reading the file and - * copying the data into the staging buffer. Obviously when - * @c ktx_Texture_IterateFaceLevels is being used, this is a moot point. -* - * @copydetails PFNKTXITERCB - */ -KTX_error_code KTXAPIENTRY -optimalTilingPadCallback(int miplevel, int face, - int width, int height, int depth, - ktx_uint32_t faceLodSize, - void* pixels, void* userdata) -{ - user_cbdata_optimal* ud = (user_cbdata_optimal*)userdata; - ktx_uint32_t rowPitch = width * ud->elementSize; - - // Set bufferOffset in destination region in final image - assert(ud->region < ud->regionsArrayEnd); - ud->region->bufferOffset = ud->offset; - - // Copy data into staging buffer - if (_KTX_PAD_UNPACK_ALIGN_LEN(rowPitch) == 0) { - // No padding. Can copy in bulk. - memcpy(ud->dest + ud->offset, pixels, faceLodSize); - ud->offset += faceLodSize; - } else { - // Must remove padding. Copy a row at a time. - ktx_uint32_t image, imageIterations; - ktx_int32_t row; - ktx_uint32_t rowPitch, paddedRowPitch; - - if (ud->numDimensions == 3) - imageIterations = depth; - else if (ud->numLayers > 1) - imageIterations = ud->numLayers * ud->numFaces; - else - imageIterations = 1; - rowPitch = paddedRowPitch = width * ud->elementSize; - paddedRowPitch = _KTX_PAD_UNPACK_ALIGN(paddedRowPitch); - for (image = 0; image < imageIterations; image++) { - for (row = 0; row < height; row++) { - memcpy(ud->dest + ud->offset, pixels, rowPitch); - ud->offset += rowPitch; - pixels = (ktx_uint8_t*)pixels + paddedRowPitch; - } - } - } - - // Round to needed multiples for next region, if necessary. - if (ud->offset % ud->elementSize != 0 || ud->offset % 4 != 0) { - // Only elementSizes of 1,2 and 3 will bring us here. - assert(ud->elementSize < 4 && ud->elementSize > 0); - ktx_uint32_t lcm = ud->elementSize == 3 ? 12 : 4; - // Can't use _KTX_PADN shortcut because 12 is not power of 2. - ud->offset = (ktx_uint32_t)(lcm * ceil((float)ud->offset / lcm)); - } - // These 2 are expressed in texels; not suitable for dealing with padding. - ud->region->bufferRowLength = 0; - ud->region->bufferImageHeight = 0; - ud->region->imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - ud->region->imageSubresource.mipLevel = miplevel; - ud->region->imageSubresource.baseArrayLayer = face; - ud->region->imageSubresource.layerCount = ud->numLayers * ud->numFaces; - ud->region->imageOffset.x = 0; - ud->region->imageOffset.y = 0; - ud->region->imageOffset.z = 0; - ud->region->imageExtent.width = width; - ud->region->imageExtent.height = height; - ud->region->imageExtent.depth = depth; - - ud->region += 1; - - return KTX_SUCCESS; -} - -typedef struct user_cbdata_linear { - VkImage destImage; - VkDevice device; - uint8_t* dest; // Pointer to mapped Image memory - ktxTexture* texture; -} user_cbdata_linear; - -/** - * @internal - * @~English - * @brief Callback for linear tiled textures with no source row padding. - * - * Copy the image data into the mapped Vulkan image. - */ -KTX_error_code KTXAPIENTRY -linearTilingCallback(int miplevel, int face, - int width, int height, int depth, - ktx_uint32_t faceLodSize, - void* pixels, void* userdata) -{ - user_cbdata_linear* ud = (user_cbdata_linear*)userdata; - VkSubresourceLayout subResLayout; - VkImageSubresource subRes = { - .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .mipLevel = miplevel, - .arrayLayer = face - }; - - // Get sub resources layout. Includes row pitch, size, - // offsets, etc. - vkGetImageSubresourceLayout(ud->device, ud->destImage, &subRes, - &subResLayout); - // Copies all images of the miplevel (for array & 3d) or a single face. - memcpy(ud->dest + subResLayout.offset, pixels, faceLodSize); - return KTX_SUCCESS; -} - -/** - * @internal - * @~English - * @brief Callback for linear tiled textures with possible source row - * padding. - * - * Need to use this long method as row padding is different - * between KTX (pad to 4) and Vulkan (none). - * - * In theory this should work for the no-padding case too but it is much - * clearer and a bit faster to use the simple callback above. It also avoids - * potential Vulkan implementation bugs. - * - * I have seen weird subResLayout results with a BC2_UNORM texture in the only - * real Vulkan implementation I have available (Mesa). The reported row & image - * strides appears to be for an R8G8B8A8_UNORM of the same texel size. - */ -KTX_error_code KTXAPIENTRY -linearTilingPadCallback(int miplevel, int face, - int width, int height, int depth, - ktx_uint32_t faceLodSize, - void* pixels, void* userdata) -{ - user_cbdata_linear* ud = (user_cbdata_linear*)userdata; - VkSubresourceLayout subResLayout; - VkImageSubresource subRes = { - .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .mipLevel = miplevel, - .arrayLayer = face - }; - VkDeviceSize offset; - ktx_size_t imageSize = 0; - VkDeviceSize imagePitch = 0; - ktx_uint32_t srcRowPitch; - ktx_uint32_t rowIterations; - ktx_uint32_t imageIterations; - ktx_uint32_t row, image; - ktx_uint8_t* pSrc; - ktx_size_t copySize; - - // Get sub resources layout. Includes row pitch, size, - // offsets, etc. - vkGetImageSubresourceLayout(ud->device, ud->destImage, &subRes, - &subResLayout); - - srcRowPitch = ktxTexture_GetRowPitch(ud->texture, miplevel); - - if (subResLayout.rowPitch != srcRowPitch) - rowIterations = height; - else - rowIterations = 1; - - // Arrays, including cube map arrays, or 3D textures - // Note from the Vulkan spec: - // * arrayPitch is undefined for images that were not - // created as arrays. - // * depthPitch is defined only for 3D images. - if (ud->texture->numLayers > 1 || ud->texture->numDimensions == 3) { - imageSize = ktxTexture_GetImageSize(ud->texture, miplevel); - if (ud->texture->numLayers > 1) { - imagePitch = subResLayout.arrayPitch; - if (imagePitch != imageSize) - imageIterations - = ud->texture->numLayers * ud->texture->numFaces; - } else { - imagePitch = subResLayout.depthPitch; - if (imagePitch != imageSize) - imageIterations = depth; - } - assert(imageSize <= imagePitch); - } else - imageIterations = 1; - - if (rowIterations > 1) { - // Copy the minimum of srcRowPitch, the GL_UNPACK_ALIGNMENT padded size, - // and subResLayout.rowPitch. - if (subResLayout.rowPitch < srcRowPitch) - copySize = subResLayout.rowPitch; - else - copySize = srcRowPitch; - } else if (imageIterations > 1) - copySize = faceLodSize / imageIterations; - else - copySize = faceLodSize; - - offset = subResLayout.offset; - // Copy image data to destImage via its mapped memory. - for (image = 0; image < imageIterations; image++) { - pSrc = (ktx_uint8_t*)pixels + imageSize * image; - for (row = 0; row < rowIterations; row++) { - memcpy(ud->dest + offset, pSrc, copySize); - offset += subResLayout.rowPitch; - pSrc += srcRowPitch; - } - offset += imagePitch; - } - return KTX_SUCCESS; -} - -/** - * @memberof ktxTexture - * @~English - * @brief Create a Vulkan image object from a ktxTexture object. - * - * Creates a VkImage with @c VkFormat etc. matching the KTX data and uploads - * the images. Also creates a VkImageView object for accessing the image. - * Mipmaps will be generated if the @c ktxTexture's @c generateMipmaps - * flag is set. Returns the handles of the created objects and information - * about the texture in the @c ktxVulkanTexture pointed at by @p vkTexture. - * - * @p usageFlags and thus acceptable usage of the created image may be - * augmented as follows: - * - with @c VK_IMAGE_USAGE_TRANSFER_DST_BIT if @p tiling is - * @c VK_IMAGE_TILING_OPTIMAL - * - with <code>VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT</code> - * if @c generateMipmaps is set in the @c ktxTexture. - * - * Most Vulkan implementations support VK_IMAGE_TILING_LINEAR only for a very - * limited number of formats and features. Generally VK_IMAGE_TILING_OPTIMAL is - * preferred. The latter requires a staging buffer so will use more memory - * during loading. - * - * @param[in] This pointer to the ktxTexture from which to upload. - * @param [in] vdi pointer to a ktxVulkanDeviceInfo structure providing - * information about the Vulkan device onto which to - * load the texture. - * @param [in,out] vkTexture pointer to a ktxVulkanTexture structure into which - * the function writes information about the created - * VkImage. - * @param [in] tiling type of tiling to use in the destination image - * on the Vulkan device. - * @param [in] usageFlags a set of VkImageUsageFlags bits indicating the - * intended usage of the destination image. - * @param [in] finalLayout a VkImageLayout value indicating the desired - * final layout of the created image. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @p This, @p vdi or @p vkTexture is @c NULL. - * @exception KTX_INVALID_OPERATION The ktxTexture contains neither images nor - * an active stream from which to read them. - * @exception KTX_INVALID_OPERATION The combination of the ktxTexture's format, - * @p tiling and @p usageFlags is not supported - * by the physical device. - * @exception KTX_INVALID_OPERATION Requested mipmap generation is not supported - * by the physical device for the combination - * of the ktxTexture's format and @p tiling. - * @exception KTX_OUT_OF_MEMORY Sufficient memory could not be allocated - * on either the CPU or the Vulkan device. - */ -KTX_error_code -ktxTexture_VkUploadEx(ktxTexture* This, ktxVulkanDeviceInfo* vdi, - ktxVulkanTexture* vkTexture, - VkImageTiling tiling, - VkImageUsageFlags usageFlags, - VkImageLayout finalLayout) -{ - KTX_error_code kResult; - VkFilter blitFilter; - VkFormat vkFormat; - VkImageType imageType; - VkImageViewType viewType; - VkImageCreateFlags createFlags = 0; - VkImageFormatProperties imageFormatProperties; - VkResult vResult; - VkCommandBufferBeginInfo cmdBufBeginInfo = { - .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, - .pNext = NULL - }; - VkImageCreateInfo imageCreateInfo = { - .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, - .pNext = NULL - }; - VkMemoryAllocateInfo memAllocInfo = { - .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, - .pNext = NULL, - .allocationSize = 0, - .memoryTypeIndex = 0 - }; - VkMemoryRequirements memReqs; - ktx_uint32_t numImageLayers, numImageLevels; - ktx_uint32_t elementSize = ktxTexture_GetElementSize(This); - ktx_bool_t canUseFasterPath; - - if (!vdi || !This || !vkTexture) { - return KTX_INVALID_VALUE; - } - - if (!This->pData && !ktxTexture_isActiveStream(This)) { - /* Nothing to upload. */ - return KTX_INVALID_OPERATION; - } - - /* _ktxCheckHeader should have caught this. */ - assert(This->numFaces == 6 ? This->numDimensions == 2 : VK_TRUE); - - numImageLayers = This->numLayers; - if (This->isCubemap) { - numImageLayers *= 6; - createFlags = VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT; - } - - switch (This->numDimensions) { - case 1: - imageType = VK_IMAGE_TYPE_1D; - viewType = This->isArray ? - VK_IMAGE_VIEW_TYPE_1D_ARRAY : VK_IMAGE_VIEW_TYPE_1D; - break; - case 2: - imageType = VK_IMAGE_TYPE_2D; - if (This->isCubemap) - viewType = This->isArray ? - VK_IMAGE_VIEW_TYPE_CUBE_ARRAY : VK_IMAGE_VIEW_TYPE_CUBE; - else - viewType = This->isArray ? - VK_IMAGE_VIEW_TYPE_2D_ARRAY : VK_IMAGE_VIEW_TYPE_2D; - break; - case 3: - imageType = VK_IMAGE_TYPE_3D; - /* 3D array textures not supported in Vulkan. Attempts to create or - * load them should have been trapped long before this. - */ - assert(!This->isArray); - viewType = VK_IMAGE_VIEW_TYPE_3D; - break; - } - - vkFormat = vkGetFormatFromOpenGLInternalFormat(This->glInternalformat); - if (vkFormat == VK_FORMAT_UNDEFINED) - vkFormat = vkGetFormatFromOpenGLFormat(This->glFormat, This->glType); - if (vkFormat == VK_FORMAT_UNDEFINED) { - return KTX_INVALID_OPERATION; - } - - /* Get device properties for the requested image format */ - if (tiling == VK_IMAGE_TILING_OPTIMAL) { - // Ensure we can copy from staging buffer to image. - usageFlags |= VK_IMAGE_USAGE_TRANSFER_DST_BIT; - } - if (This->generateMipmaps) { - // Ensure we can blit between levels. - usageFlags |= (VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT); - } - vResult = vkGetPhysicalDeviceImageFormatProperties(vdi->physicalDevice, - vkFormat, - imageType, - tiling, - usageFlags, - createFlags, - &imageFormatProperties); - if (vResult == VK_ERROR_FORMAT_NOT_SUPPORTED) { - return KTX_INVALID_OPERATION; - } - - if (This->generateMipmaps) { - uint32_t max_dim; - VkFormatProperties formatProperties; - VkFormatFeatureFlags formatFeatureFlags; - VkFormatFeatureFlags neededFeatures - = VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT; - vkGetPhysicalDeviceFormatProperties(vdi->physicalDevice, - vkFormat, - &formatProperties); - assert(vResult == VK_SUCCESS); - if (tiling == VK_IMAGE_TILING_OPTIMAL) - formatFeatureFlags = formatProperties.optimalTilingFeatures; - else - formatFeatureFlags = formatProperties.linearTilingFeatures; - - if ((formatFeatureFlags & neededFeatures) != neededFeatures) - return KTX_INVALID_OPERATION; - - if (formatFeatureFlags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) - blitFilter = VK_FILTER_LINEAR; - else - blitFilter = VK_FILTER_NEAREST; // XXX INVALID_OP? - - max_dim = MAX(MAX(This->baseWidth, This->baseHeight), This->baseDepth); - numImageLevels = (uint32_t)floor(log2(max_dim)) + 1; - } else { - numImageLevels = This->numLevels; - } - - { - ktx_uint32_t actualRowPitch = ktxTexture_GetRowPitch(This, 0); - ktx_uint32_t tightRowPitch = elementSize * This->baseWidth; - // If the texture's images do not have any row padding, we can use a - // faster path. Only uncompressed textures might have padding. - // - // The first test in the if will match compressed textures, because - // they all have a block size that is a multiple of 4, as well as - // a class of uncompressed textures that will never need padding. - // - // The second test matches textures whose level 0 has no padding. Any - // texture whose block size is not a multiple of 4 will need padding - // at some miplevel even if level 0 does not. So, if more than 1 level - // exists, we must use the slower path. - // - // Note all elementSizes > 4 Will be a multiple of 4, so only - // elementSizes of 1, 2 & 3 are a concern here. - if (elementSize % 4 == 0 /* There'll be no padding at any level. */ - /* There is no padding at level 0 and no other levels. */ - || (This->numLevels == 1 && actualRowPitch == tightRowPitch)) - canUseFasterPath = KTX_TRUE; - else - canUseFasterPath = KTX_FALSE; - } - - vkTexture->width = This->baseWidth; - vkTexture->height = This->baseHeight; - vkTexture->depth = This->baseDepth; - vkTexture->imageLayout = finalLayout; - vkTexture->imageFormat = vkFormat; - vkTexture->levelCount = numImageLevels; - vkTexture->layerCount = numImageLayers; - vkTexture->viewType = viewType; - - VK_CHECK_RESULT(vkBeginCommandBuffer(vdi->cmdBuffer, &cmdBufBeginInfo)); - - if (tiling == VK_IMAGE_TILING_OPTIMAL) - { - // Create a host-visible staging buffer that contains the raw image data - VkBuffer stagingBuffer; - VkDeviceMemory stagingMemory; - VkBufferImageCopy* copyRegions; - VkDeviceSize textureSize; - VkBufferCreateInfo bufferCreateInfo = { - .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, - .pNext = NULL - }; - VkImageSubresourceRange subresourceRange; - VkFence copyFence; - VkFenceCreateInfo fenceCreateInfo = { - .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, - .pNext = NULL, - .flags = VK_FLAGS_NONE - }; - VkSubmitInfo submitInfo = { - .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, - .pNext = NULL - }; - ktx_uint8_t* pMappedStagingBuffer; - ktx_uint32_t numCopyRegions; - user_cbdata_optimal cbData; - - - textureSize = ktxTexture_GetSize(This); - bufferCreateInfo.size = textureSize; - if (canUseFasterPath) { - /* - * Because all array layers and faces are the same size they can - * be copied in a single operation so there'll be 1 copy per mip - * level. - */ - numCopyRegions = This->numLevels; - } else { - /* - * Have to copy all images individually into the staging - * buffer so we can place them at correct multiples of - * elementSize and 4 and also need a copy region per image - * in case they end up with padding between them. - */ - numCopyRegions = This->isArray ? This->numLevels - : This->numLevels * This->numFaces; - /* - * Add extra space to allow for possible padding described - * above. A bit ad-hoc but it's only a small amount of - * memory. - */ - bufferCreateInfo.size += numCopyRegions * elementSize * 4; - } - copyRegions = (VkBufferImageCopy*)malloc(sizeof(VkBufferImageCopy) - * numCopyRegions); - if (copyRegions == NULL) { - return KTX_OUT_OF_MEMORY; - } - - // This buffer is used as a transfer source for the buffer copy - bufferCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; - bufferCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; - - VK_CHECK_RESULT(vkCreateBuffer(vdi->device, &bufferCreateInfo, - vdi->pAllocator, &stagingBuffer)); - - // Get memory requirements for the staging buffer (alignment, - // memory type bits) - vkGetBufferMemoryRequirements(vdi->device, stagingBuffer, &memReqs); - - memAllocInfo.allocationSize = memReqs.size; - // Get memory type index for a host visible buffer - memAllocInfo.memoryTypeIndex = ktxVulkanDeviceInfo_getMemoryType( - vdi, - memReqs.memoryTypeBits, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT - | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT - ); - - vResult = vkAllocateMemory(vdi->device, &memAllocInfo, - vdi->pAllocator, &stagingMemory); - if (vResult != VK_SUCCESS) { - return KTX_OUT_OF_MEMORY; - } - VK_CHECK_RESULT(vkBindBufferMemory(vdi->device, stagingBuffer, - stagingMemory, 0)); - - VK_CHECK_RESULT(vkMapMemory(vdi->device, stagingMemory, 0, - memReqs.size, 0, - (void **)&pMappedStagingBuffer)); - - cbData.offset = 0; - cbData.region = copyRegions; - cbData.numFaces = This->numFaces; - cbData.numLayers = This->numLayers; - cbData.dest = pMappedStagingBuffer; - cbData.elementSize = elementSize; - cbData.numDimensions = This->numDimensions; -#if defined(_DEBUG) - cbData.regionsArrayEnd = copyRegions + numCopyRegions; -#endif - if (canUseFasterPath) { - // Bulk load the data to the staging buffer and iterate - // over levels. - - if (This->pData) { - // Image data has already been loaded. Copy to staging - // buffer. - assert(This->dataSize <= memAllocInfo.allocationSize); - memcpy(pMappedStagingBuffer, This->pData, This->dataSize); - } else { - /* Load the image data directly into the staging buffer. */ - /* The strange cast quiets an Xcode warning when building - * for the Generic iOS Device where size_t is 32-bit even - * when building for arm64. */ - kResult = ktxTexture_LoadImageData(This, - pMappedStagingBuffer, - (ktx_size_t)memAllocInfo.allocationSize); - if (kResult != KTX_SUCCESS) - return kResult; - } - - // Iterate over mip levels to set up the copy regions. - kResult = ktxTexture_IterateLevels(This, - optimalTilingCallback, - &cbData); - // XXX Check for possible errors. - } else { - // Iterate over face-levels with callback that copies the - // face-levels to Vulkan-valid offsets in the staging buffer while - // removing padding. Using face-levels minimizes pre-staging-buffer - // buffering, in the event the data is not already loaded. - if (This->pData) { - kResult = ktxTexture_IterateLevelFaces( - This, - optimalTilingPadCallback, - &cbData); - } else { - kResult = ktxTexture_IterateLoadLevelFaces( - This, - optimalTilingPadCallback, - &cbData); - // XXX Check for possible errors. - } - } - - vkUnmapMemory(vdi->device, stagingMemory); - - // Create optimal tiled target image - imageCreateInfo.imageType = imageType; - imageCreateInfo.flags = createFlags; - imageCreateInfo.format = vkFormat; - // numImageLevels ensures enough levels for generateMipmaps. - imageCreateInfo.mipLevels = numImageLevels; - imageCreateInfo.arrayLayers = numImageLayers; - imageCreateInfo.samples = VK_SAMPLE_COUNT_1_BIT; - imageCreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL; - imageCreateInfo.usage = usageFlags; - imageCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; - imageCreateInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; - imageCreateInfo.extent.width = vkTexture->width; - imageCreateInfo.extent.height = vkTexture->height; - imageCreateInfo.extent.depth = vkTexture->depth; - - VK_CHECK_RESULT(vkCreateImage(vdi->device, &imageCreateInfo, - vdi->pAllocator, &vkTexture->image)); - - vkGetImageMemoryRequirements(vdi->device, vkTexture->image, &memReqs); - - memAllocInfo.allocationSize = memReqs.size; - - memAllocInfo.memoryTypeIndex = ktxVulkanDeviceInfo_getMemoryType( - vdi, memReqs.memoryTypeBits, - VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); - VK_CHECK_RESULT(vkAllocateMemory(vdi->device, &memAllocInfo, - vdi->pAllocator, - &vkTexture->deviceMemory)); - VK_CHECK_RESULT(vkBindImageMemory(vdi->device, vkTexture->image, - vkTexture->deviceMemory, 0)); - - subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - subresourceRange.baseMipLevel = 0; - subresourceRange.levelCount = This->numLevels; - subresourceRange.baseArrayLayer = 0; - subresourceRange.layerCount = numImageLayers; - - // Image barrier to transition, possibly only the base level, image - // layout to TRANSFER_DST_OPTIMAL so it can be used as the copy - // destination. - setImageLayout( - vdi->cmdBuffer, - vkTexture->image, - VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - subresourceRange); - - // Copy mip levels from staging buffer - vkCmdCopyBufferToImage( - vdi->cmdBuffer, stagingBuffer, - vkTexture->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - numCopyRegions, copyRegions - ); - - if (This->generateMipmaps) { - generateMipmaps(vkTexture, vdi, - blitFilter, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); - } else { - // Transition image layout to finalLayout after all mip levels - // have been copied. - // In this case numImageLevels == This->numLevels - //subresourceRange.levelCount = numImageLevels; - setImageLayout( - vdi->cmdBuffer, - vkTexture->image, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - finalLayout, - subresourceRange); - } - - // Submit command buffer containing copy and image layout commands - VK_CHECK_RESULT(vkEndCommandBuffer(vdi->cmdBuffer)); - - // Create a fence to make sure that the copies have finished before - // continuing - VK_CHECK_RESULT(vkCreateFence(vdi->device, &fenceCreateInfo, - vdi->pAllocator, ©Fence)); - - submitInfo.commandBufferCount = 1; - submitInfo.pCommandBuffers = &vdi->cmdBuffer; - - VK_CHECK_RESULT(vkQueueSubmit(vdi->queue, 1, &submitInfo, copyFence)); - - VK_CHECK_RESULT(vkWaitForFences(vdi->device, 1, ©Fence, - VK_TRUE, DEFAULT_FENCE_TIMEOUT)); - - vkDestroyFence(vdi->device, copyFence, vdi->pAllocator); - - // Clean up staging resources - vkFreeMemory(vdi->device, stagingMemory, vdi->pAllocator); - vkDestroyBuffer(vdi->device, stagingBuffer, vdi->pAllocator); - } - else - { - VkImage mappableImage; - VkDeviceMemory mappableMemory; - VkFence nullFence = { VK_NULL_HANDLE }; - VkSubmitInfo submitInfo = { - .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, - .pNext = NULL - }; - user_cbdata_linear cbData; - PFNKTXITERCB callback; - - imageCreateInfo.imageType = imageType; - imageCreateInfo.flags = createFlags; - imageCreateInfo.format = vkFormat; - imageCreateInfo.extent.width = vkTexture->width; - imageCreateInfo.extent.height = vkTexture->height; - imageCreateInfo.extent.depth = vkTexture->depth; - // numImageLevels ensures enough levels for generateMipmaps. - imageCreateInfo.mipLevels = numImageLevels; - imageCreateInfo.arrayLayers = numImageLayers; - imageCreateInfo.samples = VK_SAMPLE_COUNT_1_BIT; - imageCreateInfo.tiling = VK_IMAGE_TILING_LINEAR; - imageCreateInfo.usage = usageFlags; - imageCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; - imageCreateInfo.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED; - - // Load mip map level 0 to linear tiling image - VK_CHECK_RESULT(vkCreateImage(vdi->device, &imageCreateInfo, - vdi->pAllocator, &mappableImage)); - - // Get memory requirements for this image - // like size and alignment - vkGetImageMemoryRequirements(vdi->device, mappableImage, &memReqs); - // Set memory allocation size to required memory size - memAllocInfo.allocationSize = memReqs.size; - - // Get memory type that can be mapped to host memory - memAllocInfo.memoryTypeIndex = ktxVulkanDeviceInfo_getMemoryType( - vdi, - memReqs.memoryTypeBits, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); - - // Allocate host memory - vResult = vkAllocateMemory(vdi->device, &memAllocInfo, vdi->pAllocator, - &mappableMemory); - if (vResult != VK_SUCCESS) { - return KTX_OUT_OF_MEMORY; - } - VK_CHECK_RESULT(vkBindImageMemory(vdi->device, mappableImage, - mappableMemory, 0)); - - cbData.destImage = mappableImage; - cbData.device = vdi->device; - cbData.texture = This; - callback = canUseFasterPath ? - linearTilingCallback : linearTilingPadCallback; - - // Map image memory - VK_CHECK_RESULT(vkMapMemory(vdi->device, mappableMemory, 0, - memReqs.size, 0, (void **)&cbData.dest)); - - // Iterate over images to copy texture data into mapped image memory. - if (ktxTexture_isActiveStream(This)) { - kResult = ktxTexture_IterateLoadLevelFaces(This, - callback, - &cbData); - } else { - kResult = ktxTexture_IterateLevelFaces(This, - callback, - &cbData); - } - // XXX Check for possible errors - - vkUnmapMemory(vdi->device, mappableMemory); - - // Linear tiled images can be directly used as textures. - vkTexture->image = mappableImage; - vkTexture->deviceMemory = mappableMemory; - - if (This->generateMipmaps) { - generateMipmaps(vkTexture, vdi, - blitFilter, - VK_IMAGE_LAYOUT_PREINITIALIZED); - } else { - VkImageSubresourceRange subresourceRange; - subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - subresourceRange.baseMipLevel = 0; - subresourceRange.levelCount = numImageLevels; - subresourceRange.baseArrayLayer = 0; - subresourceRange.layerCount = numImageLayers; - - // Transition image layout to finalLayout. - setImageLayout( - vdi->cmdBuffer, - vkTexture->image, - VK_IMAGE_LAYOUT_PREINITIALIZED, - finalLayout, - subresourceRange); - } - - // Submit command buffer containing image layout commands - VK_CHECK_RESULT(vkEndCommandBuffer(vdi->cmdBuffer)); - - submitInfo.waitSemaphoreCount = 0; - submitInfo.commandBufferCount = 1; - submitInfo.pCommandBuffers = &vdi->cmdBuffer; - - VK_CHECK_RESULT(vkQueueSubmit(vdi->queue, 1, &submitInfo, nullFence)); - VK_CHECK_RESULT(vkQueueWaitIdle(vdi->queue)); - } - return KTX_SUCCESS; -} - -/** @memberof ktxTexture - * @~English - * @brief Create a Vulkan image object from a ktxTexture object. - * - * Calls ktxTexture_VkUploadEx() with the most commonly used options: - * VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_SAMPLED_BIT and - * VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL. - * - * @sa ktxTexture_VkUploadEx() for details and use that for complete - * control. - */ -KTX_error_code -ktxTexture_VkUpload(ktxTexture* texture, ktxVulkanDeviceInfo* vdi, - ktxVulkanTexture *vkTexture) -{ - return ktxTexture_VkUploadEx(texture, vdi, vkTexture, - VK_IMAGE_TILING_OPTIMAL, - VK_IMAGE_USAGE_SAMPLED_BIT, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); -} - -/** @memberof ktxTexture - * @~English - * @brief Return the VkFormat enum of a ktxTexture object. - * - * @return The VkFormat of the ktxTexture. May return VK_FORMAT_UNDEFINED if - * there is no mapping from the GL internalformat and format. - */ -VkFormat -ktxTexture_GetVkFormat(ktxTexture* This) -{ - VkFormat vkFormat; - - vkFormat = vkGetFormatFromOpenGLInternalFormat(This->glInternalformat); - if (vkFormat == VK_FORMAT_UNDEFINED) - vkFormat = vkGetFormatFromOpenGLFormat(This->glFormat, This->glType); - return vkFormat; -} - -//====================================================================== -// Utilities -//====================================================================== - -/** - * @internal - * @~English - * @brief Create an image memory barrier for changing the layout of an image. - * - * The barrier is placed in the passed command buffer. See the Vulkan spec. - * chapter 11.4 "Image Layout" for details. - */ -static void -setImageLayout( - VkCommandBuffer cmdBuffer, - VkImage image, - VkImageLayout oldLayout, - VkImageLayout newLayout, - VkImageSubresourceRange subresourceRange) -{ - // Create an image barrier object - VkImageMemoryBarrier imageMemoryBarrier = { - .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, - .pNext = NULL, - // Some default values - .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED - }; - - imageMemoryBarrier.oldLayout = oldLayout; - imageMemoryBarrier.newLayout = newLayout; - imageMemoryBarrier.image = image; - imageMemoryBarrier.subresourceRange = subresourceRange; - - // Source layouts (old) - // The source access mask controls actions to be finished on the old - // layout before it will be transitioned to the new layout. - switch (oldLayout) - { - case VK_IMAGE_LAYOUT_UNDEFINED: - // Image layout is undefined (or does not matter). - // Only valid as initial layout. No flags required. - imageMemoryBarrier.srcAccessMask = 0; - break; - - case VK_IMAGE_LAYOUT_PREINITIALIZED: - // Image is preinitialized. - // Only valid as initial layout for linear images; preserves memory - // contents. Make sure host writes have finished. - imageMemoryBarrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT; - break; - - case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: - // Image is a color attachment. - // Make sure writes to the color buffer have finished - imageMemoryBarrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - break; - - case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: - // Image is a depth/stencil attachment. - // Make sure any writes to the depth/stencil buffer have finished. - imageMemoryBarrier.srcAccessMask - = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; - break; - - case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: - // Image is a transfer source. - // Make sure any reads from the image have finished - imageMemoryBarrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; - break; - - case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: - // Image is a transfer destination. - // Make sure any writes to the image have finished. - imageMemoryBarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - break; - - case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: - // Image is read by a shader. - // Make sure any shader reads from the image have finished - imageMemoryBarrier.srcAccessMask = VK_ACCESS_SHADER_READ_BIT; - break; - - default: - /* Value not used by callers, so not supported. */ - assert(KTX_FALSE); - } - - // Target layouts (new) - // The destination access mask controls the dependency for the new image - // layout. - switch (newLayout) - { - case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: - // Image will be used as a transfer destination. - // Make sure any writes to the image have finished. - imageMemoryBarrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - break; - - case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: - // Image will be used as a transfer source. - // Make sure any reads from and writes to the image have finished. - imageMemoryBarrier.srcAccessMask |= VK_ACCESS_TRANSFER_READ_BIT; - imageMemoryBarrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; - break; - - case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: - // Image will be used as a color attachment. - // Make sure any writes to the color buffer have finished. - imageMemoryBarrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; - imageMemoryBarrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - break; - - case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: - // Image layout will be used as a depth/stencil attachment. - // Make sure any writes to depth/stencil buffer have finished. - imageMemoryBarrier.dstAccessMask - = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; - break; - - case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: - // Image will be read in a shader (sampler, input attachment). - // Make sure any writes to the image have finished. - if (imageMemoryBarrier.srcAccessMask == 0) - { - imageMemoryBarrier.srcAccessMask - = VK_ACCESS_HOST_WRITE_BIT | VK_ACCESS_TRANSFER_WRITE_BIT; - } - imageMemoryBarrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; - break; - default: - /* Value not used by callers, so not supported. */ - assert(KTX_FALSE); - } - - // Put barrier on top of pipeline. - VkPipelineStageFlags srcStageFlags = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; - VkPipelineStageFlags destStageFlags = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; - - // Add the barrier to the passed command buffer - vkCmdPipelineBarrier( - cmdBuffer, - srcStageFlags, - destStageFlags, - 0, - 0, NULL, - 0, NULL, - 1, &imageMemoryBarrier); -} - -/** @internal - * @~English - * @brief Generate mipmaps from base using @c VkCmdBlitImage. - * - * Mipmaps are generated by blitting level n from level n-1 as it should - * be faster than the alternative of blitting all levels from the base level. - * - * After generation, the image is transitioned to the layout indicated by - * @c vkTexture->imageLayout. - * - * @param[in] vkTexture pointer to an object with information about the - * image for which to generate mipmaps. - * @param[in] vdi pointer to an object with information about the - * Vulkan device and command buffer to use. - * @param[in] blitFilter the type of filter to use in the @c VkCmdBlitImage. - * @param[in] initialLayout the layout of the image on entry to the function. - */ -static void -generateMipmaps(ktxVulkanTexture* vkTexture, ktxVulkanDeviceInfo* vdi, - VkFilter blitFilter, VkImageLayout initialLayout) -{ - VkImageSubresourceRange subresourceRange; - memset(&subresourceRange, 0, sizeof(subresourceRange)); - subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - subresourceRange.baseMipLevel = 0; - subresourceRange.levelCount = 1; - subresourceRange.baseArrayLayer = 0; - subresourceRange.layerCount = vkTexture->layerCount; - - // Transition base level to SRC_OPTIMAL for blitting. - setImageLayout( - vdi->cmdBuffer, - vkTexture->image, - initialLayout, - VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - subresourceRange); - - // Generate the mip chain - // ---------------------- - // Blit level n from level n-1. - for (uint32_t i = 1; i < vkTexture->levelCount; i++) - { - VkImageBlit imageBlit; - memset(&imageBlit, 0, sizeof(imageBlit)); - - // Source - imageBlit.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - imageBlit.srcSubresource.layerCount = vkTexture->layerCount; - imageBlit.srcSubresource.mipLevel = i-1; - imageBlit.srcOffsets[1].x = MAX(1, vkTexture->width >> (i - 1)); - imageBlit.srcOffsets[1].y = MAX(1, vkTexture->height >> (i - 1)); - imageBlit.srcOffsets[1].z = MAX(1, vkTexture->depth >> (i - 1));; - - // Destination - imageBlit.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - imageBlit.dstSubresource.layerCount = 1; - imageBlit.dstSubresource.mipLevel = i; - imageBlit.dstOffsets[1].x = MAX(1, vkTexture->width >> i); - imageBlit.dstOffsets[1].y = MAX(1, vkTexture->height >> i); - imageBlit.dstOffsets[1].z = MAX(1, vkTexture->depth >> i); - - VkImageSubresourceRange mipSubRange; - memset(&mipSubRange, 0, sizeof(mipSubRange)); - - mipSubRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - mipSubRange.baseMipLevel = i; - mipSubRange.levelCount = 1; - mipSubRange.layerCount = vkTexture->layerCount; - - // Transiton current mip level to transfer dest - setImageLayout( - vdi->cmdBuffer, - vkTexture->image, - VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - mipSubRange); - - // Blit from previous level - vkCmdBlitImage( - vdi->cmdBuffer, - vkTexture->image, - VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - vkTexture->image, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - 1, - &imageBlit, - blitFilter); - - // Transiton current mip level to transfer source for read in - // next iteration. - setImageLayout( - vdi->cmdBuffer, - vkTexture->image, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - mipSubRange); - } - - // After the loop, all mip layers are in TRANSFER_SRC layout. - // Transition all to final layout. - subresourceRange.levelCount = vkTexture->levelCount; - setImageLayout( - vdi->cmdBuffer, - vkTexture->image, - VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - vkTexture->imageLayout, - subresourceRange); -} - -//====================================================================== -// ktxVulkanTexture utilities -//====================================================================== - -/** - * @memberof ktxVulkanTexture - * @~English - * @brief Destructor for the object returned when loading a texture image. - * - * Frees the Vulkan resources created when the texture image was loaded. - * - * @param vkTexture pointer to the ktxVulkanTexture to be destructed. - * @param device handle to the Vulkan logical device to which the texture was - * loaded. - * @param pAllocator pointer to the allocator used during loading. - */ -void -ktxVulkanTexture_Destruct(ktxVulkanTexture* vkTexture, VkDevice device, - const VkAllocationCallbacks* pAllocator) -{ - vkDestroyImage(device, vkTexture->image, pAllocator); - vkFreeMemory(device, vkTexture->deviceMemory, pAllocator); -} - -/** @} */ diff --git a/external/KTX-Software-master/lib/writer.c b/external/KTX-Software-master/lib/writer.c deleted file mode 100644 index 6c5166e..0000000 --- a/external/KTX-Software-master/lib/writer.c +++ /dev/null @@ -1,477 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4 expandtab: */ - -/** - * @internal - * @file writer.c - * @~English - * - * @brief Functions for creating KTX-format files from a set of images. - * - * @author Mark Callow, HI Corporation - */ - -/* - * ©2018 Mark Callow. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifdef _WIN32 -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include <assert.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "ktx.h" -#include "ktxint.h" -#include "stream.h" -#include "filestream.h" -#include "memstream.h" - -/** - * @defgroup writer Writer - * @brief Write KTX-formatted data. - * @{ - */ - -/** - * @internal - * @memberof ktxTexture @private - * @~English - * @brief Set image for level, layer, faceSlice from a ktxStream source. - * - * @param[in] This pointer to the target ktxTexture object. - * @param[in] level mip level of the image to set. - * @param[in] layer array layer of the image to set. - * @param[in] faceSlice cube map face or depth slice of the image to set. - * @param[in] src ktxStream pointer to the source. - * @param[in] srcSize size of the source image in bytes. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @p This or @p src is NULL. - * @exception KTX_INVALID_VALUE @p srcSize != the expected image size for the - * specified level, layer & faceSlice. - * @exception KTX_INVALID_OPERATION - * No storage was allocated when the texture was - * created. - */ -KTX_error_code -ktxTexture_setImageFromStream(ktxTexture* This, ktx_uint32_t level, - ktx_uint32_t layer, ktx_uint32_t faceSlice, - ktxStream* src, ktx_size_t srcSize) -{ - ktx_uint32_t packedRowBytes, rowBytes, rowPadding, numRows; - ktx_size_t packedBytes, unpackedBytes; - ktx_size_t imageOffset; -#if (KTX_GL_UNPACK_ALIGNMENT != 4) - ktx_uint32_t faceLodPadding; -#endif - - if (!This || !src) - return KTX_INVALID_VALUE; - - if (!This->pData) - return KTX_INVALID_OPERATION; - - ktxTexture_GetImageOffset(This, level, layer, faceSlice, &imageOffset); - - if (This->isCompressed) { - packedBytes = ktxTexture_GetImageSize(This, level); - rowPadding = 0; - // These 2 are not used when rowPadding == 0. Quiets compiler warning. - packedRowBytes = 0; - rowBytes = 0; - } else { - ktxTexture_rowInfo(This, level, &numRows, &rowBytes, &rowPadding); - unpackedBytes = rowBytes * numRows; - if (rowPadding) { - packedRowBytes = rowBytes - rowPadding; - packedBytes = packedRowBytes * numRows; - } else { - packedRowBytes = rowBytes; - packedBytes = unpackedBytes; - } - } - - if (srcSize != packedBytes) - return KTX_INVALID_OPERATION; - // The above will catch a flagrantly invalid srcSize. This is an - // additional check of the internal calculations. - assert (imageOffset + srcSize <= This->dataSize); - -#if (KTX_GL_UNPACK_ALIGNMENT != 4) - faceLodPadding = _KTX_PAD4_LEN(faceLodSize); -#endif - - if (rowPadding == 0) { - /* Can copy whole image at once */ - src->read(src, This->pData + imageOffset, srcSize); - } else { - /* Copy the rows individually, padding each one */ - ktx_uint32_t row; - ktx_uint8_t* dst = This->pData + imageOffset; - ktx_uint8_t pad[4] = { 0, 0, 0, 0 }; - for (row = 0; row < numRows; row++) { - ktx_uint32_t rowOffset = rowBytes * row; - src->read(src, dst + rowOffset, packedRowBytes); - memcpy(dst + rowOffset + packedRowBytes, pad, rowPadding); - } - } -#if (KTX_GL_UNPACK_ALIGNMENT != 4) - /* - * When KTX_GL_UNPACK_ALIGNMENT == 4, rows, and therefore everything else, - * are always 4-byte aligned and faceLodPadding is always 0. It is always - * 0 for compressed formats too because they all have multiple-of-4 block - * sizes. - */ - if (faceLodPadding) - memcpy(This->pData + faceLodSize, pad, faceLodPadding); -#endif - return KTX_SUCCESS; -} - -/** - * @memberof ktxTexture - * @~English - * @brief Set image for level, layer, faceSlice from a stdio stream source. - * - * Uncompressed images read from the stream are expected to have their rows - * tightly packed as is the norm for most image file formats. The copied image - * is padded as necessary to achieve the KTX-specified row alignment. No - * padding is done if the ktxTexture's @c isCompressed field is @c KTX_TRUE. - * - * Level, layer, faceSlice rather than offset are specified to enable some - * validation. - * - * @param[in] This pointer to the target ktxTexture object. - * @param[in] level mip level of the image to set. - * @param[in] layer array layer of the image to set. - * @param[in] faceSlice cube map face or depth slice of the image to set. - * @param[in] src stdio stream pointer to the source. - * @param[in] srcSize size of the source image in bytes. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @p This or @p src is NULL. - * @exception KTX_INVALID_VALUE @p srcSize != the expected image size for the - * specified level, layer & faceSlice. - * @exception KTX_INVALID_OPERATION - * No storage was allocated when the texture was - * created. - */ -KTX_error_code -ktxTexture_SetImageFromStdioStream(ktxTexture* This, ktx_uint32_t level, - ktx_uint32_t layer, ktx_uint32_t faceSlice, - FILE* src, ktx_size_t srcSize) -{ - ktxStream srcstr; - KTX_error_code result; - - result = ktxFileStream_construct(&srcstr, src, KTX_FALSE); - if (result != KTX_SUCCESS) - return result; - result = ktxTexture_setImageFromStream(This, level, layer, faceSlice, - &srcstr, srcSize); - ktxFileStream_destruct(&srcstr); - return result; -} - -/** - * @memberof ktxTexture - * @~English - * @brief Set image for level, layer, faceSlice from an image in memory. - * - * Uncompressed images in memory are expected to have their rows tightly packed - * as is the norm for most image file formats. The copied image is padded as - * necessary to achieve the KTX-specified row alignment. No padding is done if - * the ktxTexture's @c isCompressed field is @c KTX_TRUE. - * - * Level, layer, faceSlice rather than offset are specified to enable some - * validation. - * - * @warning Do not use @c memcpy for this as it will not pad when necessary. - * - * @param[in] This pointer to the target ktxTexture object. - * @param[in] level mip level of the image to set. - * @param[in] layer array layer of the image to set. - * @param[in] faceSlice cube map face or depth slice of the image to set. - * @param[in] src pointer to the image source in memory. - * @param[in] srcSize size of the source image in bytes. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @p This or @p src is NULL. - * @exception KTX_INVALID_VALUE @p srcSize != the expected image size for the - * specified level, layer & faceSlice. - * @exception KTX_INVALID_OPERATION - * No storage was allocated when the texture was - * created. - */ -KTX_error_code -ktxTexture_SetImageFromMemory(ktxTexture* This, ktx_uint32_t level, - ktx_uint32_t layer, ktx_uint32_t faceSlice, - const ktx_uint8_t* src, ktx_size_t srcSize) -{ - ktxStream srcstr; - KTX_error_code result; - - result = ktxMemStream_construct_ro(&srcstr, src, srcSize); - if (result != KTX_SUCCESS) - return result; - result = ktxTexture_setImageFromStream(This, level, layer, faceSlice, - &srcstr, srcSize); - ktxMemStream_destruct(&srcstr); - return result; -} - -/** - * @internal - * @memberof ktxTexture @private - * @~English - * @brief Write a ktxTexture object to a ktxStream in KTX format. - * - * @param[in] This pointer to the target ktxTexture object. - * @param[in] dststr destination ktxStream. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @p This or @p dststr is NULL. - * @exception KTX_INVALID_OPERATION - * The ktxTexture does not contain any image data. - * @exception KTX_FILE_OVERFLOW The file exceeded the maximum size supported by - * the system. - * @exception KTX_FILE_WRITE_ERROR - * An error occurred while writing the file. - */ -static KTX_error_code -ktxTexture_writeToStream(ktxTexture* This, ktxStream* dststr) -{ - KTX_header header = KTX_IDENTIFIER_REF; - KTX_error_code result = KTX_SUCCESS; - ktx_uint32_t kvdLen; - ktx_uint8_t* pKvd; - ktx_uint32_t level, levelOffset; - - if (!dststr) { - return KTX_INVALID_VALUE; - } - - if (This->pData == NULL) - return KTX_INVALID_OPERATION; - - //endianess int.. if this comes out reversed, all of the other ints will too. - header.endianness = KTX_ENDIAN_REF; - header.glInternalformat = This->glInternalformat; - header.glFormat = This->glFormat; - header.glBaseInternalformat = This->glBaseInternalformat; - header.glType = This->glType; - header.glTypeSize = ktxTexture_glTypeSize(This); - header.pixelWidth = This->baseWidth; - header.pixelHeight = This->baseHeight; - header.pixelDepth = This->baseDepth; - header.numberOfArrayElements = This->isArray ? This->numLayers : 0; - assert (This->isCubemap ? This->numFaces == 6 : This->numFaces == 1); - header.numberOfFaces = This->numFaces; - assert (This->generateMipmaps ? This->numLevels == 1 : This->numLevels >= 1); - header.numberOfMipmapLevels = This->generateMipmaps ? 0 : This->numLevels; - - ktxHashList_Serialize(&This->kvDataHead, &kvdLen, &pKvd); - header.bytesOfKeyValueData = kvdLen; - - //write header - result = dststr->write(dststr, &header, sizeof(KTX_header), 1); - if (result != KTX_SUCCESS) - return result; - - //write keyValueData - if (kvdLen != 0) { - assert(pKvd != NULL); - - result = dststr->write(dststr, pKvd, 1, kvdLen); - free(pKvd); - if (result != KTX_SUCCESS) - return result; - } - - /* Write the image data */ - for (level = 0, levelOffset=0; level < This->numLevels; ++level) - { - ktx_uint32_t faceLodSize, layer, levelDepth, numImages; - ktx_size_t imageSize; - - faceLodSize = (ktx_uint32_t)ktxTexture_faceLodSize(This, level); - imageSize = ktxTexture_GetImageSize(This, level); - levelDepth = MAX(1, This->baseDepth >> level); - if (This->isCubemap && !This->isArray) - numImages = This->numFaces; - else - numImages = This->isCubemap ? This->numFaces : levelDepth; - - result = dststr->write(dststr, &faceLodSize, sizeof(faceLodSize), 1); - if (result != KTX_SUCCESS) - goto cleanup; - - for (layer = 0; layer < This->numLayers; layer++) { - ktx_uint32_t faceSlice; - - for (faceSlice = 0; faceSlice < numImages; faceSlice++) { - result = dststr->write(dststr, This->pData + levelOffset, - imageSize, 1); - levelOffset += (ktx_uint32_t)imageSize; - } - } - } - -cleanup: - return result; -} - -/** - * @memberof ktxTexture - * @~English - * @brief Write a ktxTexture object to a stdio stream in KTX format. - * - * @param[in] This pointer to the target ktxTexture object. - * @param[in] dstsstr destination stdio stream. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @p This or @p dstsstr is NULL. - * @exception KTX_INVALID_OPERATION - * The ktxTexture does not contain any image data. - * @exception KTX_FILE_OVERFLOW The file exceeded the maximum size supported by - * the system. - * @exception KTX_FILE_WRITE_ERROR - * An error occurred while writing the file. - */ -KTX_error_code -ktxTexture_WriteToStdioStream(ktxTexture* This, FILE* dstsstr) -{ - ktxStream stream; - KTX_error_code result = KTX_SUCCESS; - - if (!This) - return KTX_INVALID_VALUE; - - result = ktxFileStream_construct(&stream, dstsstr, KTX_FALSE); - if (result != KTX_SUCCESS) - return result; - - return ktxTexture_writeToStream(This, &stream); -} - -/** - * @memberof ktxTexture - * @~English - * @brief Write a ktxTexture object to a named file in KTX format. - * - * @param[in] This pointer to the target ktxTexture object. - * @param[in] dstname destination file name. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @p This or @p dstname is NULL. - * @exception KTX_INVALID_OPERATION - * The ktxTexture does not contain any image data. - * @exception KTX_FILE_OVERFLOW The file exceeded the maximum size supported by - * the system. - * @exception KTX_FILE_WRITE_ERROR - * An error occurred while writing the file. - */ -KTX_error_code -ktxTexture_WriteToNamedFile(ktxTexture* This, const char* const dstname) -{ - KTX_error_code result; - FILE* dst; - - if (!This) - return KTX_INVALID_VALUE; - - dst = fopen(dstname, "wb"); - if (dst) { - result = ktxTexture_WriteToStdioStream(This, dst); - fclose(dst); - } else - result = KTX_FILE_OPEN_FAILED; - - return result; -} - -/** - * @memberof ktxTexture - * @~English - * @brief Write a ktxTexture object to block of memory in KTX format. - * - * Memory is allocated by the function and the caller is responsible for - * freeing it. - * - * @param[in] This pointer to the target ktxTexture object. - * @param[in,out] ppDstBytes pointer to location to write the address of - * the destination memory. The Application is - * responsible for freeing this memory. - * @param[in,out] pSize pointer to location to write the size in bytes of - * the KTX data. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @p This, @p ppDstBytes or @p pSize is NULL. - * @exception KTX_INVALID_OPERATION - * The ktxTexture does not contain any image data. - * @exception KTX_FILE_OVERFLOW The file exceeded the maximum size supported by - * the system. - * @exception KTX_FILE_WRITE_ERROR - * An error occurred while writing the file. - */ -KTX_error_code -ktxTexture_WriteToMemory(ktxTexture* This, - ktx_uint8_t** ppDstBytes, ktx_size_t* pSize) -{ - struct ktxStream dststr; - KTX_error_code result; - ktx_size_t strSize; - - if (!This || !ppDstBytes || !pSize) - return KTX_INVALID_VALUE; - - *ppDstBytes = NULL; - - result = ktxMemStream_construct(&dststr, KTX_FALSE); - if (result != KTX_SUCCESS) - return result; - - result = ktxTexture_writeToStream(This, &dststr); - if(result != KTX_SUCCESS) - { - ktxMemStream_destruct(&dststr); - return result; - } - - ktxMemStream_getdata(&dststr, ppDstBytes); - dststr.getsize(&dststr, &strSize); - *pSize = (GLsizei)strSize; - /* This function does not free the memory pointed at by the - * value obtained from ktxMemStream_getdata() thanks to the - * KTX_FALSE passed to the constructor above. - */ - ktxMemStream_destruct(&dststr); - return KTX_SUCCESS; - -} - -/** @} */ - diff --git a/external/KTX-Software-master/lib/writer_v1.c b/external/KTX-Software-master/lib/writer_v1.c deleted file mode 100644 index 5085658..0000000 --- a/external/KTX-Software-master/lib/writer_v1.c +++ /dev/null @@ -1,708 +0,0 @@ -/* -*- tab-width: 4; -*- */ -/* vi: set sw=2 ts=4 expandtab: */ - -/* $Id: 687889ad2b1bee58a6d439ef4d6c10830a733418 $ */ - -/* - * ©2010-2018 Mark Callow. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @internal - * @file writer.c - * @~English - * - * @brief V1 API functions for creating KTX-format files from a set of images. - * - * Keep the v1 API implementation as is because reimplementing it in terms - * of the v2 API would use too much memory. This is because this API expects - * all the images to already be loaded in memory and the v2 api would load - * them into another memory buffer prior to writing the file. - * - * @author Mark Callow, when at HI Corporation - */ - -#ifdef _WIN32 -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include <assert.h> -#include <limits.h> - -#include "GL/glcorearb.h" -#include "ktx.h" -#include "ktxint.h" -#include "stream.h" -#include "filestream.h" -#include "memstream.h" -#include "gl_format.h" - -static GLenum getFormatFromInternalFormatLegacy(GLenum internalFormat); -static GLenum getTypeFromInternalFormatLegacy(GLenum internalFormat); -static void getFormatSizeLegacy(GLenum internalFormat, - GlFormatSize* formatSize); - -/** - * @internal - * @ingroup writer - * @~English - * @deprecated Use ktxTexture_writeToStream(). - * @brief Write image(s) in a KTX-format to a ktxStream. - * - * @param [in] stream pointer to the ktxStream from which to load. - * @param [in] textureInfo pointer to a KTX_texture_info structure providing - * information about the images to be included in - * the KTX file. - * @param [in] bytesOfKeyValueData - * specifies the number of bytes of key-value data. - * @param [in] keyValueData a pointer to the keyValue data. - * @param [in] numImages number of images in the following array - * @param [in] images array of KTX_image_info providing image size and - * data. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @c glTypeSize in @p textureInfo is not 1, 2, or - * 4 or is different from the size of the type - * specified in @c glType. - * @exception KTX_INVALID_VALUE @c pixelWidth in @p textureInfo is 0 or - * pixelDepth != 0 && pixelHeight == 0. - * @exception KTX_INVALID_VALUE In @p textureInfo, @c numberOfFaces != 1 or - * numberOfFaces != 6 or numberOfArrayElements - * or numberOfMipmapLevels are < 0. - * @exception KTX_INVALID_VALUE @c glType in @p textureInfo is an unrecognized - * type. - * @exception KTX_INVALID_OPERATION - * In @p textureInfo, numberOfFaces == 6 and - * images are either not 2D or are not square. - * @exception KTX_INVALID_OPERATION - * @p numImages is insufficient for the specified - * number of mipmap levels and faces. - * @exception KTX_INVALID_OPERATION - * The size of a provided image is different than - * that required for the specified width, height - * or depth or for the mipmap level being - * processed. - * @exception KTX_INVALID_OPERATION - * @c glType and @c glFormat in @p textureInfo are - * mismatched. See OpenGL 4.4 specification - * section 8.4.4 and table 8.5. - * @exception KTX_FILE_WRITE_ERROR - * A system error occurred while writing the file. - * @exception KTX_OUT_OF_MEMORY System failed to allocate sufficient memory. - */ -static -KTX_error_code -ktxWriteKTXS(struct ktxStream *stream, const KTX_texture_info* textureInfo, - GLsizei bytesOfKeyValueData, const void* keyValueData, - GLuint numImages, KTX_image_info images[]) -{ - KTX_header header = KTX_IDENTIFIER_REF; - GLuint i, level, dimension, cubemap = 0; - GLuint numMipmapLevels, numArrayElements; - GLbyte pad[4] = { 0, 0, 0, 0 }; - KTX_error_code result = KTX_SUCCESS; - GLboolean compressed = GL_FALSE; - GLuint groupBytes; - - if (!stream) { - return KTX_INVALID_VALUE; - } - - /* endianess int.. if this comes out reversed, all of the other ints will - * too. - */ - header.endianness = KTX_ENDIAN_REF; - header.glType = textureInfo->glType; - header.glTypeSize = textureInfo->glTypeSize; - header.glFormat = textureInfo->glFormat; - header.glInternalformat = textureInfo->glInternalFormat; - header.glBaseInternalformat = textureInfo->glBaseInternalFormat; - header.pixelWidth = textureInfo->pixelWidth; - header.pixelHeight = textureInfo->pixelHeight; - header.pixelDepth = textureInfo->pixelDepth; - header.numberOfArrayElements = textureInfo->numberOfArrayElements; - header.numberOfFaces = textureInfo->numberOfFaces; - header.numberOfMipmapLevels = textureInfo->numberOfMipmapLevels; - header.bytesOfKeyValueData = bytesOfKeyValueData; - - /* Do some sanity checking */ - if (header.glTypeSize != 1 && - header.glTypeSize != 2 && - header.glTypeSize != 4) - { - /* Only 8, 16, and 32-bit types are supported for byte-swapping. - * See UNPACK_SWAP_BYTES & table 8.4 in the OpenGL 4.4 spec. - */ - return KTX_INVALID_VALUE; - } - - if (header.glType == 0 || header.glFormat == 0) - { - if (header.glType + header.glFormat != 0) { - /* either both or neither of glType & glFormat must be zero */ - return KTX_INVALID_VALUE; - } else - compressed = GL_TRUE; - } - else - { - GlFormatSize formatInfo; - GLenum expectedFormat, expectedType; - - expectedFormat = getFormatFromInternalFormatLegacy(header.glInternalformat); - if (expectedFormat == GL_INVALID_VALUE - || expectedFormat != header.glFormat) - return KTX_INVALID_OPERATION; - expectedType = getTypeFromInternalFormatLegacy(header.glInternalformat); - if (expectedType == GL_INVALID_VALUE - || expectedType != header.glType) - return KTX_INVALID_OPERATION; - getFormatSizeLegacy(header.glInternalformat, &formatInfo); - groupBytes = formatInfo.blockSizeInBits / CHAR_BIT; - } - - - /* Check texture dimensions. KTX files can store 8 types of textures: - * 1D, 2D, 3D, cube, and array variants of these. There is currently - * no GL extension that would accept 3D array array textures but we'll - * let such files be created. - */ - if ((header.pixelWidth == 0) || - (header.pixelDepth > 0 && header.pixelHeight == 0)) - { - /* texture must have width */ - /* texture must have height if it has depth */ - return KTX_INVALID_VALUE; - } - if (header.pixelHeight > 0 && header.pixelDepth > 0) - dimension = 3; - else if (header.pixelHeight > 0) - dimension = 2; - else - dimension = 1; - - if (header.numberOfFaces != 1 && header.pixelDepth != 0) - { - /* No 3D cubemaps so either faces or depth must be 1. */ - return KTX_INVALID_OPERATION; - } - - if (header.numberOfFaces == 6) - { - if (dimension != 2) - { - /* cube map needs 2D faces */ - return KTX_INVALID_OPERATION; - } - if (header.pixelWidth != header.pixelHeight) - { - /* cube maps require square images */ - return KTX_INVALID_OPERATION; - } - } - else if (header.numberOfFaces != 1) - { - /* numberOfFaces must be either 1 or 6 */ - return KTX_INVALID_VALUE; - } - - if (header.numberOfArrayElements == 0) - numArrayElements = 1; - else - numArrayElements = header.numberOfArrayElements; - - if (header.numberOfFaces == 6) - cubemap = 1; - - /* Check number of mipmap levels */ - if (header.numberOfMipmapLevels == 0) - { - numMipmapLevels = 1; - } - else - numMipmapLevels = header.numberOfMipmapLevels; - if (numMipmapLevels > 1) { - GLuint max_dim = MAX(MAX(header.pixelWidth, header.pixelHeight), header.pixelDepth); - if (max_dim < ((GLuint)1 << (header.numberOfMipmapLevels - 1))) - { - /* Can't have more mip levels than 1 + log2(max(width, height, depth)) */ - return KTX_INVALID_VALUE; - } - } - - if (numImages < numMipmapLevels * header.numberOfFaces) - { - /* Not enough images */ - return KTX_INVALID_OPERATION; - } - - //write header - result = stream->write(stream, &header, sizeof(KTX_header), 1); - if (result != KTX_SUCCESS) - return result; - - //write keyValueData - if (bytesOfKeyValueData != 0) { - if (keyValueData == NULL) - return KTX_INVALID_OPERATION; - - result = stream->write(stream, keyValueData, 1, bytesOfKeyValueData); - if (result != KTX_SUCCESS) - return result; - } - - /* Write the image data */ - for (level = 0, i = 0; level < numMipmapLevels; ++level) - { - GLuint faceSlice, faceLodSize; -#if (KTX_GL_UNPACK_ALIGNMENT != 4) - GLuint faceLodPadding; -#endif - GLuint pixelWidth, pixelHeight, pixelDepth; - GLsizei imageBytes, packedImageBytes; - GLsizei packedRowBytes, rowBytes, rowPadding; - GLuint numImages; - - pixelWidth = MAX(1, header.pixelWidth >> level); - pixelHeight = MAX(1, header.pixelHeight >> level); - pixelDepth = MAX(1, header.pixelDepth >> level); - - /* Calculate face sizes for this LoD based on glType, glFormat, width & height */ - packedImageBytes = groupBytes - * pixelWidth - * pixelHeight; - - rowPadding = 0; - packedRowBytes = groupBytes * pixelWidth; - /* KTX format specifies UNPACK_ALIGNMENT==4 */ - /* GL spec: rows are not to be padded when elementBytes != 1, 2, 4 or 8. - * As GL currently has no such elements, no test is necessary. - */ - if (!compressed) { - rowBytes = _KTX_PAD_UNPACK_ALIGN(packedRowBytes); - rowPadding = rowBytes - packedRowBytes; - } - if (rowPadding == 0) { - imageBytes = packedImageBytes; - } else { - /* Need to pad the rows to meet the required UNPACK_ALIGNMENT */ - imageBytes = rowBytes * pixelHeight; - } - - if (textureInfo->numberOfArrayElements == 0 && cubemap) { - /* Non-array cubemap. */ - numImages = 6; - faceLodSize = imageBytes; - } else { - numImages = cubemap ? 6 : pixelDepth; - numImages *= numArrayElements; - faceLodSize = imageBytes * numImages; - } -#if (KTX_GL_UNPACK_ALIGNMENT != 4) - faceLodPadding = _KTX_PAD4_LEN(faceLodSize); -#endif - - result = stream->write(stream, &faceLodSize, sizeof(faceLodSize), 1); - if (result != KTX_SUCCESS) - goto cleanup; - - for (faceSlice = 0; faceSlice < numImages; ++faceSlice, ++i) { - if (!compressed) { - /* Sanity check. */ - if (images[i].size != packedImageBytes) { - result = KTX_INVALID_OPERATION; - goto cleanup; - } - } - if (rowPadding == 0) { - /* Can write whole face at once */ - result = stream->write(stream, images[i].data, images[i].size, - 1); - if (result != KTX_SUCCESS) - goto cleanup; - } else { - /* Write the rows individually, padding each one */ - GLuint row; - GLuint numRows = pixelHeight; - for (row = 0; row < numRows; row++) { - result = stream->write(stream, - &images[i].data[row*packedRowBytes], - packedRowBytes, 1); - if (result != KTX_SUCCESS) - goto cleanup; - - result = stream->write(stream, pad, sizeof(GLbyte), - rowPadding); - if (result != KTX_SUCCESS) - goto cleanup; - } - } -#if (KTX_GL_UNPACK_ALIGNMENT != 4) - /* - * When KTX_GL_UNPACK_ALIGNMENT == 4, rows, and therefore everything - * else, are always 4-byte aligned and faceLodPadding is always 0. - * It is always 0 for compressed formats too because they all have - * multiple-of-4 block sizes. - */ - if (faceLodPadding) { - result = stream->write(stream, pad, sizeof(GLbyte), - faceLodPadding); - if (result != KTX_SUCCESS) - goto cleanup; - } -#endif - } - } - -cleanup: - return result; -} - -/** - * @~English - * @ingroup writer - * @deprecated Use ktxTexture_WriteToStdioStream(). - * @brief Write image(s) in KTX format to a stdio FILE stream. - * - * @note textureInfo directly reflects what is written to the KTX file - * header. That is @c numberOfArrayElements should be 0 for non arrays; - * @c numMipmapLevels should be 0 to request generateMipmaps and @c type, - * @c format & @c typesize should be 0 for compressed textures. - * - * @param[in] file pointer to the FILE stream to write to. - * @param[in] textureInfo pointer to a KTX_texture_info structure providing - * information about the images to be included in - * the KTX file. - * @param[in] bytesOfKeyValueData - * specifies the number of bytes of key-value data. - * @param[in] keyValueData a pointer to the keyValue data. - * @param[in] numImages number of images in the following array - * @param[in] images array of KTX_image_info providing image size and - * data. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @c glTypeSize in @p textureInfo is not 1, 2, or - * 4 or is different from the size of the type - * specified in @c glType. - * @exception KTX_INVALID_VALUE @c pixelWidth in @p textureInfo is 0 or - * pixelDepth != 0 && pixelHeight == 0. - * @exception KTX_INVALID_VALUE In @p textureInfo, @c numberOfFaces != 1 or - * numberOfFaces != 6 or numberOfArrayElements - * or numberOfMipmapLevels are < 0. - * @exception KTX_INVALID_VALUE @c glType in @p textureInfo is an unrecognized - * type. - * @exception KTX_INVALID_OPERATION - * In @p textureInfo, numberOfFaces == 6 and - * images are either not 2D or are not square. - * @exception KTX_INVALID_OPERATION - * @p numImages is insufficient for the specified - * number of mipmap levels and faces. - * @exception KTX_INVALID_OPERATION - * The size of a provided image is different than - * that required for the specified width, height - * or depth or for the mipmap level being - * processed. - * @exception KTX_INVALID_OPERATION - * @c glType and @c glFormat in @p textureInfo are - * mismatched. See OpenGL 4.4 specification - * section 8.4.4 and table 8.5. - * @exception KTX_FILE_WRITE_ERROR - * A system error occurred while writing the file. - * @exception KTX_OUT_OF_MEMORY System failed to allocate sufficient memory. - */ -KTX_error_code -ktxWriteKTXF(FILE *file, const KTX_texture_info* textureInfo, - GLsizei bytesOfKeyValueData, const void* keyValueData, - GLuint numImages, KTX_image_info images[]) -{ - struct ktxStream stream; - KTX_error_code result; - - result = ktxFileStream_construct(&stream, file, KTX_FALSE); - if (result != KTX_SUCCESS) - return result; - result = ktxWriteKTXS(&stream, textureInfo, bytesOfKeyValueData, keyValueData, - numImages, images); - stream.destruct(&stream); - return result; -} - -/** - * @~English - * @ingroup writer - * @deprecated Use ktxTexture_WriteToNamedFile(). - * @brief Write image(s) in KTX format to a file on disk. - * - * @note textureInfo directly reflects what is written to the KTX file - * header. That is @c numberOfArrayElements should be 0 for non arrays; - * @c numMipmapLevels should be 0 to request generateMipmaps and @c type, - * @c format & @c typesize should be 0 for compressed textures. - * - * @param[in] dstname pointer to a C string that contains the path of - * the file to load. - * @param[in] textureInfo pointer to a KTX_texture_info structure providing - * information about the images to be included in - * the KTX file. - * @param[in] bytesOfKeyValueData - * specifies the number of bytes of key-value data. - * @param[in] keyValueData a pointer to the keyValue data. - * @param[in] numImages number of images in the following array. - * @param[in] images array of KTX_image_info providing image size and - * data. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_FILE_OPEN_FAILED Unable to open the specified file for - * writing. - * - * For other exceptions, see ktxWriteKTXF(). - */ -KTX_error_code -ktxWriteKTXN(const char* dstname, const KTX_texture_info* textureInfo, - GLsizei bytesOfKeyValueData, const void* keyValueData, - GLuint numImages, KTX_image_info images[]) -{ - struct ktxStream stream; - KTX_error_code result; - FILE* dst = fopen(dstname, "wb"); - - if (dst) { - result = ktxWriteKTXS(&stream, textureInfo, bytesOfKeyValueData, - keyValueData, numImages, images); - fclose(dst); - } else - result = KTX_FILE_OPEN_FAILED; - - return result; -} - -/** - * @~English - * @ingroup writer - * @deprecated Use ktxTexture_WriteToMemory(). - * @brief Write image(s) in KTX format to memory. - * - * Memory is allocated by the function and the caller is responsible for - * freeing it. - * - * @note textureInfo directly reflects what is written to the KTX file - * header. That is @c numberOfArrayElements should be 0 for non arrays; - * @c numMipmapLevels should be 0 to request generateMipmaps and @c type, - * @c format & @c typesize should be 0 for compressed textures. - * - * @param[out] ppDstBytes pointer to location to write the address of - * the destination memory. The Application is - responsible for freeing this memory. - * @param[out] pSize pointer to location to write the size in bytes of - * the KTX data. - * @param[in] textureInfo pointer to a KTX_texture_info structure providing - * information about the images to be included in - * the KTX file. - * @param[in] bytesOfKeyValueData - * specifies the number of bytes of key-value data. - * @param[in] keyValueData a pointer to the keyValue data. - * @param[in] numImages number of images in the following array. - * @param[in] images array of KTX_image_info providing image size and - * data. - * - * @return KTX_SUCCESS on success, other KTX_* enum values on error. - * - * @exception KTX_INVALID_VALUE @p dst or @p size is NULL. - * @exception KTX_INVALID_VALUE @c glTypeSize in @p textureInfo is not 1, 2, or - * 4 or is different from the size of the type - * specified in @c glType. - * @exception KTX_INVALID_VALUE @c pixelWidth in @p textureInfo is 0 or - * pixelDepth != 0 && pixelHeight == 0. - * @exception KTX_INVALID_VALUE In @p textureInfo, @c numberOfFaces != 1 or - * numberOfFaces != 6 or numberOfArrayElements - * or numberOfMipmapLevels are < 0. - * @exception KTX_INVALID_VALUE @c glType in @p textureInfo is an unrecognized - * type. - * @exception KTX_INVALID_OPERATION - * In @p textureInfo, numberOfFaces == 6 and - * images are either not 2D or are not square. - * @exception KTX_INVALID_OPERATION - * @p numImages is insufficient for the specified - * number of mipmap levels and faces. - * @exception KTX_INVALID_OPERATION - * The size of a provided image is different than - * that required for the specified width, height - * or depth or for the mipmap level being - * processed. - * @exception KTX_INVALID_OPERATION - * @c glType and @c glFormat in @p textureInfo are - * mismatched. See OpenGL 4.4 specification - * section 8.4.4 and table 8.5. - * @exception KTX_FILE_WRITE_ERROR - * A system error occurred while writing the file. - * @exception KTX_OUT_OF_MEMORY System failed to allocate sufficient memory. - */ -KTX_error_code -ktxWriteKTXM(unsigned char** ppDstBytes, GLsizei* pSize, - const KTX_texture_info* textureInfo, - GLsizei bytesOfKeyValueData, const void* keyValueData, - GLuint numImages, KTX_image_info images[]) -{ - struct ktxStream stream; - KTX_error_code rc; - ktx_size_t strSize; - - if (ppDstBytes == NULL || pSize == NULL) - return KTX_INVALID_VALUE; - - *ppDstBytes = NULL; - - rc = ktxMemStream_construct(&stream, KTX_FALSE); - if (rc != KTX_SUCCESS) - return rc; - - rc = ktxWriteKTXS(&stream, textureInfo, bytesOfKeyValueData, keyValueData, - numImages, images); - if(rc != KTX_SUCCESS) - { - ktxMemStream_destruct(&stream); - return rc; - } - - ktxMemStream_getdata(&stream, ppDstBytes); - stream.getsize(&stream, &strSize); - *pSize = (GLsizei)strSize; - /* This function does not free the memory pointed at by the - * value obtained from ktxMemStream_getdata(). - */ - stream.destruct(&stream); - return KTX_SUCCESS; -} - -/** - * @internal - * @~English - * @brief Get the matching format for an internalformat. - * - * Adds support for deprecated legacy formats needed to create textures for - * use with OpenGL ES 1 & 2 to glGetFormatFromInternalFormat. - * - * @param[in] internalFormat the internal format of the image data - * - * @return the matching glFormat enum or GL_INVALID_VALUE if format is - * unrecognized. - */ -GLenum -getFormatFromInternalFormatLegacy(GLenum internalFormat) -{ - switch (internalFormat) { - case GL_LUMINANCE8: - case GL_LUMINANCE16: - return GL_LUMINANCE; - - case GL_ALPHA8: - case GL_ALPHA16: - return GL_ALPHA; - - case GL_LUMINANCE8_ALPHA8: - case GL_LUMINANCE16_ALPHA16: - return GL_LUMINANCE_ALPHA; - - default: - return glGetFormatFromInternalFormat(internalFormat); - } -} - -/** - * @internal - * @~English - * @brief Get the GL data type for an internalformat. - * - * Adds support for deprecated legacy formats needed to create textures for - * use with OpenGL ES 1 & 2 to glGetTypeFromInternalFormat. - * - * @param[in] internalFormat the internal format of the image data - * - * @return the matching glFormat enum or GL_INVALID_VALUE if format is - * unrecognized. - */ -GLenum -getTypeFromInternalFormatLegacy(GLenum internalFormat) -{ - switch (internalFormat) { - case GL_LUMINANCE8: - case GL_ALPHA8: - return GL_UNSIGNED_BYTE; - - case GL_LUMINANCE16: - case GL_ALPHA16: - case GL_LUMINANCE8_ALPHA8: - return GL_UNSIGNED_SHORT; - - case GL_LUMINANCE16_ALPHA16: - return GL_UNSIGNED_INT; - - default: - return glGetTypeFromInternalFormat(internalFormat); - } -} - -/** - * @internal - * @~English - * @brief Get size information for an internalformat. - * - * Adds support for deprecated legacy formats needed to create textures for - * use with OpenGL ES 1 & 2 to glGetTypeFromInternalFormat. - * - * @param[in] internalFormat the internal format of the image data - * @param[in,out] formatSize pointer to a formatSize struct in which the - * information is returned. - */ -void -getFormatSizeLegacy(GLenum internalFormat, GlFormatSize* pFormatSize) -{ - switch (internalFormat) { - case GL_LUMINANCE8: - case GL_ALPHA8: - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 1 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - - case GL_LUMINANCE16: - case GL_ALPHA16: - case GL_LUMINANCE8_ALPHA8: - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 2 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - - case GL_LUMINANCE16_ALPHA16: - pFormatSize->flags = 0; - pFormatSize->paletteSizeInBits = 0; - pFormatSize->blockSizeInBits = 4 * 8; - pFormatSize->blockWidth = 1; - pFormatSize->blockHeight = 1; - pFormatSize->blockDepth = 1; - break; - - default: - glGetFormatSize(internalFormat, pFormatSize); - } -} diff --git a/external/KTX-Software-master/other_include/KHR/khrplatform.h b/external/KTX-Software-master/other_include/KHR/khrplatform.h deleted file mode 100644 index c9e6f17..0000000 --- a/external/KTX-Software-master/other_include/KHR/khrplatform.h +++ /dev/null @@ -1,282 +0,0 @@ -#ifndef __khrplatform_h_ -#define __khrplatform_h_ - -/* -** Copyright (c) 2008-2009 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. - * - * $Revision: 23298 $ on $Date: 2013-09-30 17:07:13 -0700 (Mon, 30 Sep 2013) $ - * - * 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 sending them to the public Khronos Bugzilla - * (http://khronos.org/bugzilla) by filing a bug against product - * "Khronos (general)" component "Registry". - * - * A predefined template which fills in some of the bug fields can be - * reached using http://tinyurl.com/khrplatform-h-bugreport, but you - * must create a Bugzilla login first. - * - * - * 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 <KHR/khrplatform.h> - * 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; - */ - -/*------------------------------------------------------------------------- - * Definition of KHRONOS_APICALL - *------------------------------------------------------------------------- - * This precedes the return type of the function in the function prototype. - */ -#if defined(_WIN32) && !defined(__SCITECH_SNAP__) -# define KHRONOS_APICALL __declspec(dllimport) -#elif defined (__SYMBIAN32__) -# define KHRONOS_APICALL IMPORT_C -#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 <stdint.h> - */ -#include <stdint.h> -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(__VMS ) || defined(__sgi) - -/* - * Using <inttypes.h> - */ -#include <inttypes.h> -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 <stdint.h> -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 _WIN64 -typedef signed long long int khronos_intptr_t; -typedef unsigned long long int khronos_uintptr_t; -typedef signed long long int khronos_ssize_t; -typedef unsigned long long int khronos_usize_t; -#else -typedef signed long int khronos_intptr_t; -typedef unsigned long int khronos_uintptr_t; -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/Vulkan-Headers b/external/Vulkan-Headers new file mode 160000 index 0000000..7dbd74f --- /dev/null +++ b/external/Vulkan-Headers @@ -0,0 +1 @@ +Subproject commit 7dbd74f04430f3a811a8fbd3c94f2684e38d9152 diff --git a/src/Engine/Application.hpp b/src/Engine/Application.hpp index fe15414..391151e 100644 --- a/src/Engine/Application.hpp +++ b/src/Engine/Application.hpp @@ -10,7 +10,7 @@ namespace Engine { namespace Application { - constexpr Utility::ImgDim defaultWindowSize = { 1800, 900 }; + constexpr Utility::ImgDim defaultWindowSize = { 1900, 1000 }; constexpr Utility::ImgDim minimumWindowSize = { 800, 600 }; constexpr float narrowestAspectRatio = minimumWindowSize.GetAspectRatio(); constexpr std::string_view defaultApplicationName = "VulkanProject1"; diff --git a/src/Engine/AssManRendererConnect.cpp b/src/Engine/AssManRendererConnect.cpp index ca38cc3..a01e693 100644 --- a/src/Engine/AssManRendererConnect.cpp +++ b/src/Engine/AssManRendererConnect.cpp @@ -30,35 +30,4 @@ namespace Engine return std::optional<Renderer::MeshDocument>{ Renderer::MeshDocument(std::move(newInfo)) }; } - - std::optional<Renderer::TextureDocument> LoadTexture(size_t i) - { - auto path = AssMan::GetTexturePath(i); - if (path == "") - return {}; - - auto assManTexOpt = AssMan::LoadTextureDocument(path); - if (assManTexOpt.has_value() == false) - return {}; - - auto oldInfo = AssMan::TextureDocument::ToCreateInfo(std::move(assManTexOpt.value())); - - Renderer::TextureDocument::CreateInfo newInfo{}; - - newInfo.byteArray = std::move(oldInfo.byteArray); - - newInfo.isCompressed = oldInfo.isCompressed; - newInfo.baseInternalFormat = Renderer::TextureDocument::Format(oldInfo.baseInternalFormat); - newInfo.internalFormat = Renderer::TextureDocument::Format(oldInfo.internalFormat); - - newInfo.type = Renderer::TextureDocument::Type(oldInfo.type); - - newInfo.numDimensions = oldInfo.numDimensions; - newInfo.dimensions = oldInfo.dimensions; - - newInfo.numLayers = oldInfo.numLayers; - newInfo.numLevels = oldInfo.numLevels; - - return std::optional<Renderer::TextureDocument>{ Renderer::TextureDocument(std::move(newInfo)) }; - } } diff --git a/src/Engine/AssManRendererConnect.hpp b/src/Engine/AssManRendererConnect.hpp index a34d987..c7060cd 100644 --- a/src/Engine/AssManRendererConnect.hpp +++ b/src/Engine/AssManRendererConnect.hpp @@ -1,14 +1,10 @@ #pragma once #include "AssetManager/MeshDocument.hpp" -#include "AssetManager/TextureDocument.hpp" #include "Renderer/MeshDocument.hpp" -#include "Renderer/TextureDocument.hpp" namespace Engine { std::optional<Renderer::MeshDocument> LoadMesh(size_t i); - - std::optional<Renderer::TextureDocument> LoadTexture(size_t i); } \ No newline at end of file diff --git a/src/Engine/AssetManager/AssetManager.cpp b/src/Engine/AssetManager/AssetManager.cpp index 161be7d..3795ea6 100644 --- a/src/Engine/AssetManager/AssetManager.cpp +++ b/src/Engine/AssetManager/AssetManager.cpp @@ -1,6 +1,5 @@ #include "AssetManager.hpp" #include "MeshDocument.hpp" -#include "TextureDocument.hpp" #include <cassert> #include <map> @@ -16,7 +15,7 @@ struct AssetManagerInfo static const std::map<size_t, AssetManagerInfo> textureInfos { - { size_t(Engine::AssetManager::Sprite::Test), {"Test", "test2.ktx"} }, + { size_t(Engine::AssetManager::Sprite::Test), {"Test", "test3.ktx"} }, }; static const std::map<size_t, AssetManagerInfo> meshInfos @@ -51,5 +50,4 @@ namespace Engine } } -#include "MeshDocument.inl" -#include "TextureDocument.inl" \ No newline at end of file +#include "MeshDocument.inl" \ No newline at end of file diff --git a/src/Engine/AssetManager/AssetManager.hpp b/src/Engine/AssetManager/AssetManager.hpp index 7436825..bdf33ba 100644 --- a/src/Engine/AssetManager/AssetManager.hpp +++ b/src/Engine/AssetManager/AssetManager.hpp @@ -2,14 +2,12 @@ #include "Typedefs.hpp" #include "MeshDocument.hpp" -#include "TextureDocument.hpp" #include <string> #include <string_view> #include <optional> #include "../Renderer/MeshDocument.hpp" -#include "../Renderer/TextureDocument.hpp" namespace Engine { @@ -22,7 +20,6 @@ namespace Engine std::string GetTexturePath(size_t i); std::optional<Renderer::MeshDocument> LoadMesh(size_t i); - std::optional<Renderer::TextureDocument> LoadTexture(size_t i); } namespace AssMan = AssetManager; diff --git a/src/Engine/AssetManager/TextureDocument.hpp b/src/Engine/AssetManager/TextureDocument.hpp deleted file mode 100644 index 0ce9d92..0000000 --- a/src/Engine/AssetManager/TextureDocument.hpp +++ /dev/null @@ -1,91 +0,0 @@ -#pragma once - -#include <array> -#include <vector> -#include <optional> -#include <string> -#include <memory> - -namespace Engine -{ - namespace AssetManager - { - class TextureDocument - { - public: - enum class Format; - enum class Type; - struct CreateInfo; - - TextureDocument() = delete; - explicit TextureDocument(CreateInfo&&); - explicit TextureDocument(TextureDocument&&) = default; - TextureDocument(const TextureDocument&) = delete; - ~TextureDocument(); - - const std::vector<uint8_t>& GetByteArray() const; - const uint8_t* GetData() const; - size_t GetByteLength() const; - - const std::array<uint32_t, 3>& GetDimensions() const; - - Format GetBaseInternalFormat() const; - Format GetInternalFormat() const; - Type GetType() const; - - bool IsCompressed() const; - - static CreateInfo ToCreateInfo(TextureDocument&& texDoc); - - private: - std::vector<uint8_t> byteArray; - Format internalFormat{}; - Format baseInternalFormat{}; - Type type{}; - uint8_t numDimensions = 0; - std::array<uint32_t, 3> dimensions{}; - size_t numLayers = 0; - size_t numLevels = 0; - bool isCompressed = false; - }; - - struct TextureDocument::CreateInfo - { - std::vector<uint8_t> byteArray; - Format internalFormat{}; - Format baseInternalFormat{}; - Type type{}; - uint8_t numDimensions = 0; - std::array<uint32_t, 3> dimensions{}; - size_t numLayers = 0; - size_t numLevels = 0; - bool isCompressed = false; - }; - - enum class TextureDocument::Format - { - Invalid, - RGBA, - RGB, - R8G8B8A8, - Compressed_RGB_S3TC_DXT1_ANGLE, - Compressed_RGBA_S3TC_DXT1_ANGLE, - Compressed_RGBA_S3TC_DXT3_ANGLE, - Compressed_RGBA_S3TC_DXT5_ANGLE, - Compressed_RGBA_BPTC_UNORM, - Compressed_SRGB_ALPHA_BPTC_UNORM, - Compressed_RGB_BPTC_SIGNED_FLOAT, - Compressed_RGB_BPTC_UNSIGNED_FLOAT, - }; - - enum class TextureDocument::Type - { - Invalid, - UnsignedByte, - }; - - std::optional<TextureDocument> LoadTextureDocument(std::string path); - } - - namespace AssMan = AssetManager; -} \ No newline at end of file diff --git a/src/Engine/AssetManager/TextureDocument.inl b/src/Engine/AssetManager/TextureDocument.inl deleted file mode 100644 index 1f04cc2..0000000 --- a/src/Engine/AssetManager/TextureDocument.inl +++ /dev/null @@ -1,201 +0,0 @@ -#pragma once - -#include "TextureDocument.hpp" - -#include <string> -#include <optional> - -#include "ktx.h" - -namespace Engine -{ - namespace AssetManager - { - TextureDocument::Format ConvertGLFormat(uint32_t glFormat); - TextureDocument::Type ConvertGLType(uint32_t glType); - - TextureDocument::TextureDocument(CreateInfo&& info) : - byteArray(std::move(info.byteArray)), - baseInternalFormat(info.baseInternalFormat), - internalFormat(info.internalFormat), - type(info.type), - numDimensions(info.numDimensions), - dimensions(info.dimensions), - numLayers(info.numLayers), - numLevels(info.numLevels), - isCompressed(info.isCompressed) - { - - } - - TextureDocument::~TextureDocument() - { - - } - - const std::vector<uint8_t>& TextureDocument::GetByteArray() const - { - return byteArray; - } - - const uint8_t* TextureDocument::GetData() const - { - return byteArray.data(); - } - - size_t TextureDocument::GetByteLength() const - { - return byteArray.size(); - } - - const std::array<uint32_t, 3>& TextureDocument::GetDimensions() const - { - return dimensions; - } - - bool TextureDocument::IsCompressed() const - { - return isCompressed; - } - - TextureDocument::Format TextureDocument::GetBaseInternalFormat() const - { - return baseInternalFormat; - } - - TextureDocument::Format TextureDocument::GetInternalFormat() const - { - return internalFormat; - } - - TextureDocument::Type TextureDocument::GetType() const - { - return type; - } - - TextureDocument::CreateInfo TextureDocument::ToCreateInfo(TextureDocument&& texDoc) - { - CreateInfo info{}; - - info.byteArray = std::move(texDoc.byteArray); - info.isCompressed = texDoc.isCompressed; - info.baseInternalFormat = texDoc.baseInternalFormat; - info.internalFormat = texDoc.internalFormat; - info.type = texDoc.type; - info.numDimensions = texDoc.numDimensions; - info.dimensions = texDoc.dimensions; - info.numLayers = texDoc.numLayers; - info.numLevels = texDoc.numLevels; - - return info; - } - - std::optional<TextureDocument> LoadTextureDocument(std::string path) - { - if (path == "") - return {}; - - ktxTexture* texture = nullptr; - KTX_error_code result = ktxTexture_CreateFromNamedFile(path.c_str(), KTX_TEXTURE_CREATE_NO_FLAGS, &texture); - if (result != KTX_SUCCESS) - return {}; - - TextureDocument::CreateInfo createInfo{}; - - createInfo.byteArray.resize(texture->dataSize); - - result = ktxTexture_LoadImageData(texture, createInfo.byteArray.data(), createInfo.byteArray.size()); - - createInfo.numDimensions = texture->numDimensions; - createInfo.dimensions = { texture->baseWidth, texture->baseHeight, texture->baseDepth }; - - createInfo.numLayers = texture->numLayers; - createInfo.numLevels = texture->numLevels; - - createInfo.isCompressed = texture->isCompressed; - createInfo.type = ConvertGLType(texture->glType); - createInfo.baseInternalFormat = ConvertGLFormat(texture->glBaseInternalformat); - createInfo.internalFormat = ConvertGLFormat(texture->glInternalformat); - - ktxTexture_Destroy(texture); - - return std::optional<TextureDocument>( std::move(TextureDocument(std::move(createInfo))) ); - } - } -} - -namespace Engine -{ - namespace AssetManager - { - TextureDocument::Type ConvertGLType(uint32_t glType) - { - using Type = TextureDocument::Type; - - constexpr auto GL_UNSIGNED_BYTE = 0x1401; - - switch (glType) - { - case GL_UNSIGNED_BYTE: - return Type::UnsignedByte; - default: - return Type::Invalid; - } - } - - TextureDocument::Format ConvertGLFormat(uint32_t glFormat) - { - using Format = TextureDocument::Format; - - // Uncompressed - constexpr auto GL_RGB = 0x1907; - constexpr auto GL_RGBA = 0x1908; - constexpr auto GL_RGBA8 = 0x8058; - switch (glFormat) - { - case GL_RGB: - return Format::RGB; - case GL_RGBA: - return Format::RGBA; - case GL_RGBA8: - return Format::R8G8B8A8; - }; - - // DXT - constexpr auto GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE = 0x83F0; - constexpr auto GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE = 0x83F1; - constexpr auto GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE = 0x83F2; - constexpr auto GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE = 0x83F3; - switch (glFormat) - { - case GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE: - return Format::Compressed_RGB_S3TC_DXT1_ANGLE; - case GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE: - return Format::Compressed_RGBA_S3TC_DXT1_ANGLE; - case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: - return Format::Compressed_RGBA_S3TC_DXT3_ANGLE; - case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: - return Format::Compressed_RGBA_S3TC_DXT5_ANGLE; - } - - // BPTC - constexpr auto GL_COMPRESSED_RGBA_BPTC_UNORM = 0x8E8C; - constexpr auto GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM = 0x8E8D; - constexpr auto GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT = 0x8E8E; - constexpr auto GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT = 0x8E8F; - switch (glFormat) - { - case GL_COMPRESSED_RGBA_BPTC_UNORM: - return Format::Compressed_RGBA_BPTC_UNORM; - case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM: - return Format::Compressed_SRGB_ALPHA_BPTC_UNORM; - case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT: - return Format::Compressed_RGB_BPTC_SIGNED_FLOAT; - case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT: - return Format::Compressed_RGB_BPTC_UNSIGNED_FLOAT; - } - - return Format::Invalid; - } - } -} \ No newline at end of file diff --git a/src/Engine/Engine.cpp b/src/Engine/Engine.cpp index bf310dd..d613028 100644 --- a/src/Engine/Engine.cpp +++ b/src/Engine/Engine.cpp @@ -42,7 +42,7 @@ namespace Engine rendererInitInfo.surfaceHandle = Application::Core::GetMainWindowHandle(); rendererInitInfo.assetLoadCreateInfo.meshLoader = &LoadMesh; - rendererInitInfo.assetLoadCreateInfo.textureLoader = &LoadTexture; + //rendererInitInfo.assetLoadCreateInfo.textureLoader = &LoadTexture; rendererInitInfo.openGLInitInfo.glSwapBuffers = &Application::Core::GL_SwapWindow; Renderer::Core::Initialize(rendererInitInfo); @@ -106,7 +106,7 @@ void Engine::Core::Run() while (Application::Core::UpdateEvents(), Application::IsRunning()) { // Handles origin movement for camera - const float speed = 2.5f; + const float speed = 5.f; auto cross = Math::Vector3D::Cross(camera.forward, camera.up); if (Input::Raw::GetValue(Input::Raw::Button::A)) camera.positionOffset -= cross * speed * scene1.GetTimeData().GetDeltaTime(); diff --git a/src/Engine/Renderer/OpenGL.cpp b/src/Engine/Renderer/OpenGL.cpp index 3e71b04..945f90b 100644 --- a/src/Engine/Renderer/OpenGL.cpp +++ b/src/Engine/Renderer/OpenGL.cpp @@ -1,9 +1,11 @@ #include "Renderer.hpp" #include "RendererData.hpp" #include "MeshDocument.hpp" -#include "TextureDocument.hpp" #include "OpenGL.hpp" +#define DTEX_IMPLEMENTATION +#include "DTex/DTex.hpp" + #include "GL/glew.h" #include <cassert> @@ -43,11 +45,9 @@ namespace Engine void LoadSpriteShader(Data& data); void LoadMeshShader(Data& data); - void GLDebugOutputCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam); + void GLAPIENTRY GLDebugOutputCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam); GLint ToGLType(MeshDocument::IndexType indexType); - GLint ToGLFormat(TextureDocument::Format format); - GLint ToGLType(TextureDocument::Type type); } } @@ -264,12 +264,12 @@ namespace Engine glBindBufferRange(GL_UNIFORM_BUFFER, 1, data.lightDataUBO, 0, sizeof(LightDataUBO)); } - void Renderer::OpenGL::GLDebugOutputCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam) + void GLAPIENTRY Renderer::OpenGL::GLDebugOutputCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam) { LogDebugMessage(message); } - void Renderer::OpenGL::Initialize(std::any& apiData, const InitInfo& createInfo) + void Renderer::OpenGL::Initialize(std::any& apiData, const InitInfo& createInfo) { auto glInitResult = glewInit(); assert(glInitResult == 0); @@ -279,6 +279,7 @@ namespace Engine data.glSwapBuffers = std::move(createInfo.glSwapBuffers); + // Initialize debug stuff if constexpr (Setup::enableDebugging) { @@ -304,8 +305,9 @@ namespace Engine glGenSamplers(1, &data.samplerObject); glSamplerParameteri(data.samplerObject, GL_TEXTURE_WRAP_S, GL_REPEAT); glSamplerParameteri(data.samplerObject, GL_TEXTURE_WRAP_T, GL_REPEAT); - glSamplerParameteri(data.samplerObject, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glSamplerParameteri(data.samplerObject, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glSamplerParameteri(data.samplerObject, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glSamplerParameteri(data.samplerObject, GL_TEXTURE_LOD_BIAS, 0); glBindSampler(0, data.samplerObject); glEnable(GL_DEPTH_TEST); @@ -428,7 +430,7 @@ namespace Engine glUseProgram(data.spriteProgram); glProgramUniform1ui(data.spriteProgram, data.spriteSamplerUniform, 0); - glBindSampler(0, data.samplerObject); + glBindSampler(GL_TEXTURE0, data.samplerObject); const auto& spriteVBO = data.quadVBO; glBindVertexArray(spriteVBO.vertexArrayObject); @@ -499,28 +501,39 @@ namespace Engine std::optional<Renderer::OpenGL::IBO> Renderer::OpenGL::GetIBOFromID(size_t id) { - auto texDocumentOpt = Core::GetData().assetLoadData.textureLoader(id); - assert(texDocumentOpt.has_value()); + //auto texDocumentOpt = Core::GetData().assetLoadData.textureLoader(id); + //assert(texDocumentOpt.has_value()); - auto& texDoc = texDocumentOpt.value(); + auto texDocOpt = DTex::LoadFromFile("Data/Textures/test.ktx"); + auto& texDoc = texDocOpt.value(); IBO ibo; glGenTextures(1, &ibo.texture); - glBindTexture(GL_TEXTURE_2D, ibo.texture); - - GLint internalFormat = ToGLFormat(texDoc.GetInternalFormat()); - GLint baseInternalFormat = ToGLFormat(texDoc.GetBaseInternalFormat()); - GLsizei width = texDoc.GetDimensions()[0]; - GLsizei height = texDoc.GetDimensions()[1]; - GLint type = ToGLType(texDoc.GetType()); - GLsizei byteLength = texDoc.GetByteLength(); - const uint8_t* data = texDoc.GetData(); - - if (texDoc.IsCompressed()) - glCompressedTexImage2D(GL_TEXTURE_2D, 0, internalFormat, width, height, 0, byteLength, data); - else - glTexImage2D(GL_TEXTURE_2D, 0, baseInternalFormat, width, height, 0, baseInternalFormat, type, data); + + GLenum target = texDoc.GetGLTarget(); + + glBindTexture(target, ibo.texture); + + + GLint format = texDoc.GetGLFormat(); + GLenum type = texDoc.GetGLType(); + + for (size_t level = 0; level < texDoc.GetMipLevels(); level++) + { + GLsizei width = texDoc.GetDimensions(level)[0]; + GLsizei height = texDoc.GetDimensions(level)[1]; + auto data = texDoc.GetData(level); + GLsizei dataLength = texDoc.GetByteLength(level); + + if (texDoc.IsCompressed()) + glCompressedTexImage2D(target, level, format, width, height, 0, dataLength, data); + else + glTexImage2D(target, level, format, width, height, 0, format, type, data); + } + + glTexParameteri(target, GL_TEXTURE_BASE_LEVEL, 0); + glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, texDoc.GetMipLevels() - 1); return ibo; } @@ -588,59 +601,4 @@ namespace Engine return 0; } } - - GLint Renderer::OpenGL::ToGLFormat(TextureDocument::Format format) - { - using Format = TextureDocument::Format; - - // Uncompressed - switch (format) - { - case Format::RGB: - return GL_RGB; - case Format::RGBA: - return GL_RGBA; - case Format::R8G8B8A8: - return GL_RGBA8; - }; - - // DXT - switch (format) - { - case Format::Compressed_RGB_S3TC_DXT1_ANGLE: - return GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE; - case Format::Compressed_RGBA_S3TC_DXT1_ANGLE: - return GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE; - case Format::Compressed_RGBA_S3TC_DXT3_ANGLE: - return GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE; - case Format::Compressed_RGBA_S3TC_DXT5_ANGLE: - return GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE; - } - - switch (format) - { - case Format::Compressed_RGBA_BPTC_UNORM: - return GL_COMPRESSED_RGBA_BPTC_UNORM; - case Format::Compressed_SRGB_ALPHA_BPTC_UNORM: - return GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM; - case Format::Compressed_RGB_BPTC_SIGNED_FLOAT: - return GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT; - case Format::Compressed_RGB_BPTC_UNSIGNED_FLOAT: - return GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT; - } - - return 0; - } - - GLint Renderer::OpenGL::ToGLType(TextureDocument::Type type) - { - using Type = TextureDocument::Type; - switch (type) - { - case Type::UnsignedByte: - return GL_UNSIGNED_BYTE; - default: - return 0; - } - } } \ No newline at end of file diff --git a/src/Engine/Renderer/Renderer.cpp b/src/Engine/Renderer/Renderer.cpp index 9029ffc..8491096 100644 --- a/src/Engine/Renderer/Renderer.cpp +++ b/src/Engine/Renderer/Renderer.cpp @@ -374,5 +374,4 @@ namespace Engine } } -#include "MeshDocument.inl" -#include "TextureDocument.inl" \ No newline at end of file +#include "MeshDocument.inl" \ No newline at end of file diff --git a/src/Engine/Renderer/TextureDocument.hpp b/src/Engine/Renderer/TextureDocument.hpp deleted file mode 100644 index fbc3d38..0000000 --- a/src/Engine/Renderer/TextureDocument.hpp +++ /dev/null @@ -1,86 +0,0 @@ -#pragma once - -#include <array> -#include <vector> -#include <cstddef> - -namespace Engine -{ - namespace Renderer - { - class TextureDocument - { - public: - enum class Format; - enum class Type; - struct CreateInfo; - - TextureDocument() = delete; - explicit TextureDocument(CreateInfo&&); - explicit TextureDocument(TextureDocument&&) = default; - TextureDocument(const TextureDocument&) = delete; - ~TextureDocument(); - - const std::vector<uint8_t>& GetByteArray() const; - const uint8_t* GetData() const; - size_t GetByteLength() const; - - const std::array<uint32_t, 3>& GetDimensions() const; - - - Format GetBaseInternalFormat() const; - Format GetInternalFormat() const; - Type GetType() const; - - bool IsCompressed() const; - - static CreateInfo ToCreateInfo(TextureDocument&& texDoc); - - private: - std::vector<uint8_t> byteArray; - Format internalFormat{}; - Format baseInternalFormat{}; - Type type{}; - uint8_t numDimensions = 0; - std::array<uint32_t, 3> dimensions{}; - size_t numLayers = 0; - size_t numLevels = 0; - bool isCompressed = false; - }; - - struct TextureDocument::CreateInfo - { - std::vector<uint8_t> byteArray; - Format internalFormat{}; - Format baseInternalFormat{}; - Type type{}; - uint8_t numDimensions = 0; - std::array<uint32_t, 3> dimensions{}; - size_t numLayers = 0; - size_t numLevels = 0; - bool isCompressed = false; - }; - - enum class TextureDocument::Format - { - Invalid, - RGBA, - RGB, - R8G8B8A8, - Compressed_RGB_S3TC_DXT1_ANGLE, - Compressed_RGBA_S3TC_DXT1_ANGLE, - Compressed_RGBA_S3TC_DXT3_ANGLE, - Compressed_RGBA_S3TC_DXT5_ANGLE, - Compressed_RGBA_BPTC_UNORM, - Compressed_SRGB_ALPHA_BPTC_UNORM, - Compressed_RGB_BPTC_SIGNED_FLOAT, - Compressed_RGB_BPTC_UNSIGNED_FLOAT, - }; - - enum class TextureDocument::Type - { - Invalid, - UnsignedByte, - }; - } -} \ No newline at end of file diff --git a/src/Engine/Renderer/TextureDocument.inl b/src/Engine/Renderer/TextureDocument.inl deleted file mode 100644 index c2ebeca..0000000 --- a/src/Engine/Renderer/TextureDocument.inl +++ /dev/null @@ -1,85 +0,0 @@ -#pragma once - -#include "TextureDocument.hpp" - -namespace Engine -{ - namespace Renderer - { - TextureDocument::TextureDocument(CreateInfo&& info) : - byteArray(std::move(info.byteArray)), - baseInternalFormat(info.baseInternalFormat), - internalFormat(info.internalFormat), - type(info.type), - numDimensions(info.numDimensions), - dimensions(info.dimensions), - numLayers(info.numLayers), - numLevels(info.numLevels), - isCompressed(info.isCompressed) - { - - } - - TextureDocument::~TextureDocument() - { - - } - - const std::vector<uint8_t>& TextureDocument::GetByteArray() const - { - return byteArray; - } - - const uint8_t* TextureDocument::GetData() const - { - return byteArray.data(); - } - - size_t TextureDocument::GetByteLength() const - { - return byteArray.size(); - } - - const std::array<uint32_t, 3>& TextureDocument::GetDimensions() const - { - return dimensions; - } - - bool TextureDocument::IsCompressed() const - { - return isCompressed; - } - - TextureDocument::Format TextureDocument::GetBaseInternalFormat() const - { - return baseInternalFormat; - } - - TextureDocument::Format TextureDocument::GetInternalFormat() const - { - return internalFormat; - } - - TextureDocument::Type TextureDocument::GetType() const - { - return type; - } - - TextureDocument::CreateInfo TextureDocument::ToCreateInfo(TextureDocument&& texDoc) - { - CreateInfo info{}; - - info.byteArray = std::move(texDoc.byteArray); - info.isCompressed = texDoc.isCompressed; - info.baseInternalFormat = texDoc.baseInternalFormat; - info.internalFormat = texDoc.internalFormat; - info.type = texDoc.type; - info.numDimensions = texDoc.numDimensions; - info.dimensions = texDoc.dimensions; - info.numLayers = texDoc.numLayers; - info.numLevels = texDoc.numLevels; - - return info; - } - } -} \ No newline at end of file -- GitLab