From 2113c59ed8a07911a4278c2da8062184552c6595 Mon Sep 17 00:00:00 2001 From: Bram Stolk Date: Wed, 18 Apr 2018 11:14:04 -0700 Subject: [PATCH] First import. --- Makefile | 9 + images/sampledesktop.png | Bin 0 -> 254898 bytes imcat.c | 134 + stb_image.h | 7190 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 7333 insertions(+) create mode 100644 Makefile create mode 100644 images/sampledesktop.png create mode 100644 imcat.c create mode 100644 stb_image.h diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..d104f2d --- /dev/null +++ b/Makefile @@ -0,0 +1,9 @@ +imcat: imcat.c + cc -Wall -g -o imcat imcat.c -lm + +run: imcat + ./imcat ~/Desktop/*.png + +clean: + rm -f ./imcat + diff --git a/images/sampledesktop.png b/images/sampledesktop.png new file mode 100644 index 0000000000000000000000000000000000000000..e5acdacdb6eb64db7dee9dc2178f2576c98e4104 GIT binary patch literal 254898 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 z zb$$Y+8olh7#1~VpFd;tDdZ-T0p@j0UHdmF(f{SRyLu;3v7#+TpAr?szHHmvOeje6u zyOz>7Dt&lY0QXR*U`pT4#+L zZh_V{tR@Y97hO!sP8~a(RFch=LbfAC61kR3w%SNEo7oIWl+yDIpE6dB=9RlO*q5lR z7mY-xHkb}=oS+ID3ALMlRXELH&i~Uli^xgCQ9sZX7=J;@*_0a zNu^n|{pm9WG@BJ5#&^N6d59E;E5rXs3svP%9z%92WR~AOTN^txJ~3t9#lbp3jeMfE z8a-}Bx5$g&S3~c=P3#ef`yyACd^-1Y(PbdoxS4yInUrCO*(}6NR&bFAF4-DSGthOp z#!`OMhO2MDaHu(qn&H6eA$3T#0>rUoY5 zqi!6s)wHr`v=8HBI%t?xeP4x}56{)TaWz<*a}wK;nDp)iyHmgN9lG>puYxf@0vUV+ z0R85BU&(64vVvM6mU@-q=7PMJ9%?6s&pow1oJM6zS>DSku7<+iGwBLex6hfc|AIC7 z^-Nk8nhitF?vJoQ%M%J!*bac2&_sUL zGWge(zal7BB@$JB&?`AyTPdTm~dr#dJ zpkwXUaeZf%XSA>5v5-899=&PK{N*LXf^qItl;Xc1%71|v-ewTE4cL%yV#T?IC3|XE z9&GV!DyD&tT0&;EnqrS!B1g93sh3PkP5qddrR!gMXT_gAXG`#3Sat`~)dAPB57z%F z&Hlen^GF=4opntLl-j`ihRIT?I_p$KHFm%Ijrs&0TkE64rRYg9t32P)1N?2(sE}%= zTs2*m|HIW=hqci@-@}W$6(~@gqD5PvKyfP$#VJmK;_fcR-6`JU4#hRWDPEwsyAxcK z@bWyLul?RluI!!UpIp1S&&-@TGb7Nb1X~JotkJ2)qx0z@hb)3O0~x51y(c)1oKI;Z zM4>z1r=kc?S6;+Ys%QHYzhAN^x6Z;ic50*ipkZW?r!QQ%`CX7N5^#oHFccw8_!O*E za|qOKWQgVoK@x_ehKh)j(IDXM{1T6kJduZnAg_b5TiCgW_S%K{CxTo%m$m z@s$lYvA)NiLk;w~>xjX{4w7?0*N0hn1YD|h>v}O*>kyVhG)`qQj@n3VgwAuI=arEiL%ak;s4{! z{&UH$1Qdk>3D*`QIA0WRp=HzCC$DzBOEX2QV>89BV;d9-G-qjIRj6ZAc>6nv%}JHz zjWhvuth_2wYT#DT7T4hQ_`y=}GIU%iJokJpe=BX({k-s%k>gV49Nc~EAo@lKHk)ed z3jo!b{UipWLNrK#)O*p(KQ4a96WMk*SG*Egx!%@-nKzHpylt03!kF!DCWE_dRkxNu zs>q=`twMoBmWN^47pHqY5f3qv(cnur`Fc6j$ahugdA%~DqT8okyP zzKs-^U(^{JJ2k-7B!JQ5;(@;^M`GY((ET8GolS^(?LYYMF4#Aizt1McK&!0jnkUzp zsF@qZ<0r_8^V@ARzd~8l2%g8&3Z?YA6W2CyMg`7-yV`{!Oe;D68{+(uX z#J^*2ajsCE$`j^Lk4XS@iK9*A@a+d5fMJhWC2Ik`0%$ZEvVF z_jr6@iaaZPYuo9ws&t8Z(_QZV{-`HyY~eG+xt5pabwF7j5V_9oNAo$;fu)Lu3dWBi4}n#*@;;GF4MuQLoxqG3f<$qD;U${xQrnv>;lt?W> z2-#PFGSz@6A{&zkLX0_?X@uW}_5lAWoZJOf`HAEf=UIiItk=MEH^ct;w0RN-HDC#^M?nB_@CD50}-}H_g_x}3CAoPocd|>ba2jcKa#en^Ono<0bibv80f1mc5{vY_Db6FxAbw=*|rSw zT*1h(6&ubB=NpR>;rqPAiQL=vx#m<(=#fi+j?NRLh-CH2M_s&J3up*CHURNZ~;V`8f;oCcP zl@A9$f)>sR%$|9+Fh7#{gsi_UOH=;X`~+Vg?An;(E z8*Phoo1M_vu3PO5v#RzB7bhq94oNO5#tq*MeY!q8@_%CIe;2fmCfoWp@<55ZxFk#> z3JCiP3MLxRsjnfai0yr+MbHHR_+>`dXEkdpptU4(up`9#a&_>@d-u8k+;ZE3@b)8H z-9Zo*-eWK7T3_#k{`>NnqdTh^@~2k#=)_^}-Fnzi>v^*S zQ{{WWfxyvYEgX@JVg;FFuZ`|l{Lux%fpw?M6U)7goE!Z_#zYpr2Rx$Ub2 z#@bAs-^r4S$O90tjd989EIWn(bS1Xor5W5j-m>mexXcDkj#cCa+{A-z#|+rW*t(zr z0~1?@=8vd%!X96;^hA8_+QKBMV4mH=SR9?Z@8(!l;VC4B0vln393XfGHy+57g2CL< zl3SBZ_x0jcf55omjf64WX%5;-0lB+M3^05eIZc}Jpw#J0+%uoi>g-j9olIpU?w@L^ zh~9&Pm<(O#jXk#aNT`h_KU`PVm!x^3j{Y&(cH5xx9hK(8K24yhyY3IqTYY~MGqS5a zI4iOXB@APXnm6$4ao{9hVR<%JS)#t{8N4Z>Nr5dpzoPL#rxp1~BnFOSwQALudlRb< z6Vz$`XIrA8@W<>IhmD6ygKurJFveH9n`p85pYwF-4bLroJcMqWwXa1|>=ylj-@~8E z{Z5~D4Q^B|w>ze*`K=NvT=s5_Ko=L_YTx_N2_yeo_~*{;-G5Q}hgkMaKj|l1YKCt~ zeRKm(jD$>LvOvw{8=wvPl7)f)1sLES`p;zcR4Fic` zKaJC2GkPq7+&6QIm`p{DtfENkF3Nf-$y>W#hK?Ad6-GV(C~W`Fv5&`3L`x?yIjYcir-YZ!2h>z8uY^Q@i!YV8O3% zd6`6g9Y>QnTW-c#9Uk)^E{Nle__$9i$aP7)_j>2haa6_hy=Ej8PW{Y#op?o%0|ixJ zC;8GUP@DeoP%u>w;UdMt!)$>~{xlpqdt`wf!_fV6(c|fS5PVFQKrP6~y2p%J9EkgXGqd#?ioReMUJpMxBnw+M$h+zt_TF zAzZ+CvS&&iw`FI;qdLoL3YhXYSTe>6@57DU zuUWpafW`;$vOT7DE`cA9$<(>tZGM|&>Di*1BY16Za7AyIdrcn`^ZH3nUUUW3K%ke} za6$;|?sUN^>>;UM<-YeE3j&6uJ_(*>TkDqCPdkk+ehqf6XPP*(l$4>304BDL5o}fsjDGLY~S5hbGd@VnU^bgMdR1sevD;N2gwpxID zk02R^I=dCPHL35Np!`P6^_bH+2F5$8lOdIeUM8J{+g?s51_Y`eaxzPQVTq2$dO0qN z&xLN!`RrCCRZ*|a5Byuy@Nebbe=nCrS`hr?|3Kg1O|L)gxG5yX{aPJXCB{ERADotc z1-dV$yb*OX)J*!g8HM}7T+9DzPo-Jr_w*-mT=%dR=rH1Qv)^X3z`Qt9+Gele1)0Bv z5t8;@CVNl2gzm?7f7Sucur7dvKT^!?TZJx1TundE))f+~@4X1@K})6hz?;(lYsFh^Ww)Q)qp zOX2f-z3u=E+KqW z5+KH}jUX7m#ZT!@J{s%TxFMy(S@T^PSJL5{nrKY_%#+y=`(H?KB#q+Sd{LWHF6C`s{qUe^QtbRd=MDd5MHgJ{ zDC!7B(Tv2e;ZFJDx24}dQBlsAF z<=4BVPl$^mu|7UQm@-Z0s~m*aLuryBq~y@kG`3D1aKF;b5Ko6g{vOr1Z<&CHn)-ck zyXz-VlG8?qmtjJWs-k_p#eB#8j*5^|cNtRvbmaBdIC4Sf{e9J$q8k>GYTMH(nO%;V z$i#vbI!~+)3gC`O-*dG#;OQU(TqAVyvp2NLhMWe{g_-A_#s;0PczQr!T=D+vNU5S9 z?ZSl2>4=K<-o(0I9UoKPPhLH7g#FVER#Fq@bKQEW@H1=1iI~uvBQAFDukw!O5dcp27Y{&T|@D%1l?Q;=?mm7oP6*ek((5A=idG>d`oMd+U|WI zMdcc(UGH>pkrbK2dLBf%(N>kywby9(>*qM_AFwtyJ(aHevHIfe zs^az6ZvI)lT8>`$Dcaa`Tv0oR6y(ifvK12bt&b^qNSb0VaE4En`6RxKWs%<^&5seN zf;i|}Q;5EIeM0H_r12dOK&Opa(ER@YI&VR=xE?z#wELkpZBN{DHQa&ElX9EPGwh`heq7oKjZ6a)TEvy~4=rCh{`g{>;~VP_;<7U)_b_^3?YV znx;SnGfU+%>#lor$jPlKj~Ty?2mL)3-d=qDrY@AV`C~xC0(#H{XLjT9^j)`P^sW%m z+KT%n^c!G&H&&6??rG^hwd}j`J(9cFMudD!458xPwkNLH%we)lTD^t7>GLj{4^KR0 zw-EzdOHJjd5$LQ`&{a{_rpjd!p;FZTkT19^sF>rYtC%;6aZCQr9+AWL3LE%jsD@2y zirmG~^1s=JxNoXQ<)ac=?T&^~uHT7LM2z`y``;gtG^Z?rXQ zNME!)G{~4y1SQvp6g&r#3gt?Xs1SZ96g> zfIqKjjc3p)gT!vI&VHqOg>}?)n02-!WAA`|;`Nv&Xv8M`c&hO6kxq{a1`hYn_F1qS z)NBjs8QSTHTQv-p7PYg&98Sn$!==DQzF*EhHmgXcu_50)t;zMiTEXdlu2~e?DcuKo`Di(k7KwvU~A`A_sOX+(4FXGCrzJ{WK3*cEAj zBq01sCmv~6nhduq2HM16|Q{#z9Pq?ZruNSuOEe$krle* z0OyaQ=xGH^S6>RV%>^bBJFhG*qW@SX13ymex^Z?iZl2@K`nEmPTwbBG{j6;RZfq+~ zv{caX7xdpcNpQdqjUe{%^gE7wPgFu%DI-sHv=q%Hw#R*lcc=X`*KdWtOt&|)wYzIJ zi>s0?N+Q0<>aUu}b9q?Pw#8%~#tj$z(6c_S?YB1Fki8W#D;&@(YN!u`H6LlM1i-+v zXm&c3_4W6#a8ZmjP9XXY($vp}{XPzF$pa5MHcj z?XY@8Mba$a4_y!9Qu%Bo3l|xTXGOrjIE%AyDVKu>(N!p$3!XjuIonDv_s6Vn z75Xl5H794o0OT+AwSnQ84t-0fkfen-K&n7WPbQW^7w9SO*iMjc<#voE@c*MF`x2X< zQq$vnuH)y%L@s&>cVn4%1m6cd+$b0|VSj#TMlq+5&g6G4$$8Io`^`f|5DMMGqg2JW zTY{?}Z7-d+x+kFl%e>(fe9%0+<;U~X=P$=y1dwE?xc>CLoA|y(GAjh_lP+2HT-}%{ zEyLy1aX(p>i2J+CqRmeJv{=b#xT>)fy2!@8Pz| zeH>K6Qog$=O`N1&4REmAaaeuuIbnHj(o{c~;hZMeg#YC3;WGR8t~ zzV9)BJZ5WN<~jBqPZoiG=R&kVH=}z7-1Z%tT#akLtPJVxhylma*XXOhczA$X%WLda zM2D9NzKk%}VPcYauj?BhAtB zVeP%vH_d+x@a-QLh|pHQw90aaXZIKYa6v15@-~Pv{V)iYx#4HCyPM4_t zX?r@XTv0rPN2j2@WM%1J4xnw_OtO0*8L1<}9a4K%dDDv7i?8Dk($WLr2!L6L6VV9& z8|k-ko0dE;Vx2p>d^#fPFWr*;Xl1<5gkCT#KY?E+pBV4_ABHWVlgqnda3H)*wcIEh zRD=B&=dC4hT8XMsEnIE1G{_HeZR?xI;qM=~3Kh#mNrq_Jd zAD%7>+ud{Ecw)nr*jPUgH}o1TBB6NOt)f2uw&l&sTwcg|mey&+%LyTya~;mIp9lEO z9ap1sT+p!O@TGODGCRgFD+ByRMeBI4PQ32|4M)=?aHy>qqQlPig0_hBLS2Ck&wb{e z^psX|VGSC>x~%pmR3p&W>oZWGoG7Ko!fQwh{BjoU$p=zZBZHtXE%`OaZEI|flAC!c zM-Y7x)yRE56ifjNsDY7|@%tY9DmZq>tGJO=3oA9=C58kD>=kK)=9g2sH-Df+>l=_?pEgUZt&1{K7i(*c{DmJ z<>?mU83?}JKHjVdYbQrexGeM*cb)r^rOx<2#sv0i-nd$txLQc#l(9eqOv-wLfHd&T z>?1zw(gS}{V09<44ZVB*K(3Bnp^m=ay|9!hwXl@=BLmB;*pJV@Eh?W>;GnNJn-gV_ zhBx45o0m`M;-WdHjBBDWYc1e-lb{+@AJq+PKpce5wtYrwjBXbrKdUS<{Lyc8|l z&cG>{lot2-Q3yo|!GEp`{N!x)HH79IZ*$q=g1JAmoRquLVD@tk;$NvZh|dWmMJ>sf zwzc2^I^iDpRCRTZVyPsBp1eudTkexKK;es2R0u+#OS{*2zY8J_t`oWw1sY2~Mt~W1 z-RKC#N1?%1DHgiuFFZus2KK8;-a#Q5Kc9V~|MUe|BXOpeA&nZ*Z-0T8L&}9XddW<; z!Df_GoEMaO2||e9myi8Paf;Zw4DUe~M)wo6X%#P6d8T}^w5!dq>j%mA*yd&Vvm&(I>$67-c)j`DgrJ@zb4h7sWgXpG93ivh zM8VO~Ufv1=h3^TiCM*-u1Zu6gZlYSn8<`gHlM>x4QK^Cgu?%CCQA zU<;@zyW|QF!s~xw!V+nGkIHulOg+d*tX7l(V^W)w4I?6wsK=bja8g88>c477lCKrs ztstw>(?yy9>nl|0BUls@PR}``i|y3+v_RiEsp)em!|qB4zI37`J#!?1SXX-`=jEeB z+_ohN=H+B{nw{wTMmP6=jxelZig%qo>J)H)&TAE7-A{7WG~NP}y(Z78Je}Rz-wG>+ zEPv=oK2jKPGwwbvaSng}n2Ue$+&jCaT6}U>SAV&e4AZAYO_b#3GAXNrA$o~)dY$&a*ldik%~DOJt-mt&mFqjA zhd+EjAj<{U@B^5hJna>uL_kA^2}JTN%O)PWVj(SA9<6V%1TwrfAlJz8yfzX3%UE<0 zZ{*n%pg&z4Po=hr$!n{7e;7`_cuBJAcQ1Y~oJ9T4U;CT7>}1!hjiBT^Rn96D8~{CJ z)i|J0WK4J%{^|jKNQ|qd*8RJ!IEGfHpOpLX=FT&n#0mX8c)aYnK_xnVJU_0&x`ZLF zI6XxQ9YKiarCZW%C`H+)-MF@VrL};kOM3wmE=Qjoz2BrlvA&w273TPJMTD{ZWL{?D zuiK)0olAvu=V()1`M0ykKlYoS8Y~!%$6C6^I%re%DPD>50DoK>GTMX4H8!lsVi1Qv zks*sE-G847`k3zXYI#A+cbx!5jK*X3PQiELBj{!`2+*)WW~3b1CWnFabAIzkResuiUlIe<^$=F<;>>A$TYl!}g(eY*Dz0 z)SL5dQ$_tl+=olHs`OS$KLdon0`l7O(>Utp2zcw|nJE7%@WRX*_? zS|;?%UWWIjRClq68cUu62U626UAm`ZCO30&TbzID!H0hfTbXZC+zNG*hF+0wS<)i| z!GnYC9TbDKaV5HeuMi}%1H}>3=TLO8!wVhpodhDL13GPueov~JJ-*T1-Ve(xW%`i4 zhC?Is;g;vr-rC;U3JbZHK(z-5L~iC};;Z@5Qs^rt?e(*HMtGE|QA6f~jg$CHB@~0Dxypy8&rxW*G1=T68upDXAUs%LFIP*L1JGLUuFXZZUsXB2 z^;2wlF(%whPC9EIBd|X%?FXHcqlyeNNl0jZPwBF(yV9x4)mMeD|HbppS4>LUh_MD> zr2Efu09E88UF$&0)a%?8e<>q9@$l7#1#XjtwlMR~WD?0I#5dV)k9v?*`^ui!#k!**k)G^) zJl#rrGwg0_!i`c@=>UaYE647oi&Zcor+3)`Wvf8J0#T@D?pQ z?YFhGW#LQlK(0U&Evv}ZD|E?7!!H4eem8tt*n!>7uwz#iBwY2|9D{F4aq@LUC?WbC zc!a05p0+V4r6%6&UcK<{DvPZv{g)Ro^-(HLEcrZe6p7@ovJlobyiy}a=lG3z-K4# zwEZAyjdRT&1}v%I>$~(XKMO)4PoCu-eWIvD3s>t`8h8I_M2e8`vYoFW@CSdt3vQkd zRxg&i7%Dy_XRMz!HB$*a?Y|Dk&eqp`>$QH@4{kf%arj_6hbg|azlUD+IDHp|H1Sxt z^q~wBx7ka^cz&Qwq}4k@{E^IiBmGx=2wC&51+d|YQuUz8m4U#L19@joddJ=tm_p-i z>lKLu&r%0|#5F6mf%o6wZsKGG*5X)^?J06?+k;u{R4+pqR`*Q$xSY+Q`co5a^2E2q zrafB_-*ClM~9e<4YxVUVjtR1E6MAB;^yqZn}1m9hu{2jNvkt!Ehimv z?^?vU33J)K%yFfL5K5-VIP)v>3^^6v5%4CKD^bJ~5s42(9hB)miw}3{E2YKcb`kM~ z-_S;QJrtWq@Cx=N6c7N8?Hxj#G;z~u9c&}n-ERgLnM3&3gL*rbc4DQ1lSm1K3>PWN z5=`P$gxp0zA7Q3JrG+H*>hC}OwS>ZK^2ODNsmg);$lJW9w`UPJ%8 zo_x;5-_jSa65E3+INaPk1r|~jfxue&-$Bd2b61=*E`ELf2*TaIz0BwP$weFNRVHX; zyZkzRReauUb~>qs`7ST$p{b!%&co%P}|+Nk!F;?>O9(E}j1OG#=G` zh=E=hJj1t&2LRF=HAnfqJJ^+&JzT5Jf-3e4(EdYey_xhc+c$fAyPlo*{uE)B__gJa zkM1oOj81|d{B_%Z4o%&Y@H!WaEXR8JrlhxDz7{+x8m4k1#dYTG)xV~3J62o)iz{oI zbD()8Qns5|vK12Ie3U4aMQ`U9P_FwzCP&-6yg__#fDf5O7G_Y+_h!a=*>N%V4r+@Ns>^V)1 z?{tNP8u`!N_gqX@7~t;BK-SAY`%Yf>BE18|%r3d{gy$4o)n;QmCm)(Qbv>`MW-LUn zXQZ*pXZ(cy?UH)!+TU0CTHOl(!Qtw6ZA2dT|Db@`n3**qo0^+DpKffpakKR_g>}f{ z@X-)=yRp8YE2zdeWhz%t*!@U%)&L2a?*pr3(x?T6YPhExcB{98F2`2aH*6w~CwODNQyUzIg$e^}eVg~`DWRrfCWV_SwUXZPfJSjCt&5MX0??p%JJpil|9=UH$uDh-wTR$Fre4&tV zE&pFhr!c=)X&&%J$ra`qPUSUi)K^|NNuEz%ojsURR74?*2LtCntEla;NjUw@?v=Q` zt?CGNV)W0lvR+;(f9*s8`Od!Gdmhe*?ywB2&CHhkMgq4!2wvWP3p)EVg4eNr;3EP) z{n4wC;Qxxau#K;}&Fv(x=tG6mZ5TVQVjWW1}1_jF!Bm?xCqHE9go7vsRBCd)Szc+0lu!Il;OlQOqYiN_;2>|>TLaO zMbEn10z{jCHNP7#|HTKr?6ferRD-uZ`Rz_wc|A?6x(&*xHauCl-+HTXbTZ+iBTJ;d zp$QJu5v$bsqb+Sjta024uDNbBm6V1>Mxi7yN~bV(-lnZC?L4eB-NT$(mkpfFIR&EX z)+Ty(Zock$x$kCVtlW=ZDh?*n8{2wsPwI(wYz*vC`#-cN=1s^leJc*aHO*d!qm_n; z-%dQqyTKacSFa3fc=7OX@+U-}b82>$E+gnx4~X;v9Z2bvXqi zuKO*!+Wi)&F%Co2^Wy4i75F1zySyeKQa%tk3<>TRbpTVZpo_vFBz)d>e zF{(%RTYK>5RL=@wl*#8MTC zZQ?3DWVUkXvHH-l*U~z}XkI4W8$FeR3_#v%rlx7l@@CrcpaFrh8EO^L(JHcv@`vv| zQ#O9jo-n)z0H1S^It$6oAFD#NZC5Qa)r5l5;YNq$7HBEoXfT^k-}hDT9vU?YLLLS>dW@sYrHwDRXJjF0)QUU2mYNXJU@-8w6Kizn zry*Y33Pxx}Ei0M3LVn-uh7EO)6t3UlMPBkXQ<0l5l_v!bBXTk7yhE#wyWpm&?DlFo z+1fhuE5@TgMk-oUrnk^4X<1&0)6|s9t7sCu0AbV;0CV|J`?@ztR%L7~Rh2f@zgh*b zpYH_g%&X4s?5BD-1m0o5LdF00_7Ur)^@8!ZX8<~}XB!o0Q* zOuPttNe)J}m&AF46_4wJl7oJFwd?U-WJgbzS2AmrHMI)KVTyUz<1XoL+IO5EJ#utK zAVnS|H3EOuQ47aTMeozv^V&>hodYM5+I_E~Bx`W<>s(#5KsH*B_1}}z_8q5f1S~=1 zhm%ZuqW&-!aC+OdB$cN{w<%0eGT$9jcFslu;n$D+mc$@W@!VA3X(O<`X*>9?hOSCQ z?#<;zmW-&|Q*~oewL(LQDAesv~sCT0bd7d~O-Gi#3gjR9e8XgbJV^_@Inn;>lf{W!!2~ zN*uhd0Ub^WO_$V2d--L(8BBv~#G!(PJHf9I&UnFojmiRU-Al`(M`?bIy&vqe--p#9 zOMD{3+$W@)|BlvivL5eZl-d5J_bnlkY?knPl;BrU7d>#Pdy5@;*2|ddj3S$f05oOY z4{YVX-d(h?$y#*3=fwBD-h2Wzah|WSo?;Kco6yv*zu)iXti@ysI((kFYUh?5Ta*zU zxED_o-U_G(lfwsk^HlV1#ZIlFg=v1|e5{iUawAyKdc7D%L%#K9cWwFUylqLFEx<02 zGZS6!yf>u#>Fr9h;F}c9~jlsM5DBzir~FYqAVH z1#1O8QZ8A9mc`WO7++|7Pf0V>Qz@-a@2i6n^<|jp?k2SnSvjt?V@|SL7=bz4z7`#T zU@SfvwZ!y+Qn~BzS{{secI`fww_81FwT2Rlscol8XaWIXNCprQ8*e3W5yz4MbFqD%OOwn zBCO3IitB|biiM_}`4Y(}zpk}%#8_O0KH4OAKxjkjY^XOfJO$O*$%IR%);;Pz@1RoME z8ai7KbzC$fl~pqJvJt!l#@vc_+oH;$KS^96$;dKFisd+;a1uY$lx^CXqsi;?F^Po* z|CF|pN96a}>83<`bAnJ5F3`N9;lMYeox)?tWp6AoAs(8BgO=q9)TUF^Oi)S5`_TV! zGtc3e#f{Jzcgq<`-%q6Hlbb)JTnbL5KZ}{xH~L!5$*RQuN;kzY|;b2!hs{DvjQukZveu#HtFDGf)!U+hqC5VIn!I)+emdS zOEi)z*_1i!yJE?u+w^t-@YFk*q|DyT7w=$Wn)&SW0UB7vEF4~r+EkQ3?%{G6Lqv>V zU7Y{2O*2WjZRm~DWhB@=+ZN-;kGDs4%`M05IPOY^Tp5bph#6F^<_s<=O}WlY>$}6S z_FL_F$9A*g#TUtu@#F=wtUFMX^}iBVLI{3H!z*}WNg=vRi6 zl~Ts`+T6ZAqL3Dhf3Oz+U(nqn-_MNAgZU_Z1|Q(*Ggj%IZ$O*B3aywvhHEoCPgpG4c|Ef9{!_YK|BLV{dVrSg1 zC(mG?rJdyYb*8-%JTmIkE#XP*@VT{Qd{I^?hqp?-cI>D3V}t|_(bh|Fwe7umYCj3e zvo)>p-n^F52YIccsTiF`tX+&dN*+}rsYCla3vw5&NJVz4nVe%ouKyabK0*33j^g}k zH%_oRxxeY}^vDd18bS_5c8dk(%w;QyW!%|5U+qXn`!BXxj>+^wJ=Kc8_LDp#F2WD< zC8!bZ#HpwvS--FwPKbs)pn$cClu;#W7;nCEu|zq?kI|Ar=fAl8sFUlZX!{5jS#*Uu;7=@u4cCj|1F>^Wg8g%V2t z`CL1O)pC1Ds(5cPUE}3Uo+x;cpT%Uo(3TtkgTs<-z)xqxB>sK@@@YI#AZZhLSAi-5pBiT9=fvLMF%P_dz!|v_KRjkx$iX`fw9{Mjv|$%KI}xx$kQGaE zJ4jZ+*d52ytpHT6o3;wZt*F6k|<1TlWPjCoecbx-b z_(VNGcdk~WE-Yk7yUDqW^`%OSE2cQjgm$aM03nJ6blop|PG0EAyPr(QQ>84jhl*<9 zC6dTY@225{9gDZxCYCBVv#G)v*z5r-#09N|&B|PAOsp1S@XsSE;=ST_rLm zSxY>(SkM5+SaT&s=W?P5R64~VkJFNy<_+!f(?17aXht+U9ZKW{ga5pwKObauWV5XQ zlTSt`99OzIy0Zfk!1mI*_4Kgwip-Ks(Wst!h5d>Fd;ZW=`tw>(OX(es zk4K|v0PIK1oE$;FppFDXq50c+I&(jIi1=dKQ2GRpC75^W;^} zBDeI)^DCFL;xAIBv;qP}(Okh1~vb=)B8xqZsn!cPWjoA15y)XLGEoPG2K-c^9 zW`N#ZyP+1`5sJdE&<*NM`w7ZwE&FdRK%fY1T`WSN9Yha8 zMI+N$>(rg%Ix!UP0JgqKImiQn4^LG}7zXS)^nM6q9r%PEQVi{)e5+UkZIfR4x|@}s zQHsm8iX$|9!w}v3YZ4QUD$BQ>37^s=Ps{VR{Ip@krS=S0`}0IUIgl6rfvc~kW*4D+ zcpvfDjQlo-4E==q2l(vtJ@Mb!cfKi?_6ag(O#@#UsP`y2C@WolPUrEv%Bf#u=-Y*n zs{o04MVG5&86qbc=>aVl8zqKD0=uyzZbf;c4`;@wU@cJ!XOxd5W;tF`kALTbps^k7 zj$%>s&Rr)X?8w*TP>rsMoG$?d#r{7ljvXSVPJ5OG2A*Nc%;p!G`fwf++-`wRiY9%U zEDVMMgy4Tfr!7~K(s&^llEiYeIIX0Q12Ct4MK81x? zE%X8Ds`wv&t*q=r*4S%%sx z<8VXRY1PYQ2M*7+HuQ;^vM$h=f;5!drd$|ix-#WE6**I??sHTh)=dLg{J!31 z6MakC)KxzI@Yi0(O(G|=_=8&yE-?3%+}&!f+_&r<0X}2lKyKN?+EPX_td4@}Rh763+qpEc zcxx|T<%u4sh9NE)hYX4qVj#Kmiya(f2jNC=%S97WV$BSR z>gWIxZtKms^!5v9n>UlgZI>ZE^b?G=g1rWIUtQgpMKu?t5}dbhBT zz^YTFE6%dX%CT#VH9MC>^*Y|i24vgeyQ-*&fhlt6%-{WGM2Qh|lM=h$RzU=2J6*t4 zlSZ%uB*Ui4*Z&1FZC@eEgjab^zrYHw#8na6F#deT|B|Z0*8Ta&rlK5Ha+kQAfL{}# z)lItn&EP%Xr&prMQWsYWR5?C!Ddp%K7GHkrQ45`5(Xfq>3wE8Y<~`b2{#Fw^wtKC= z#wt6TfmD2go$!t!6j*BVZ~MywjbxpYb5uxq_ruP0zyH33++^gFSRPH^!2TlaaqQ32 zz+0>58Hy&PPQ6?wDogLvC#PQ^bz)55pw9{fk70#ZxN2kUb5JJWZ?Thpi*=d=th{kY zL)e$%mz;jG?N-!>G^lr*s)w{id=6knHtT80dLX>5`K;@!l849woQ<{n&yQKG3je}_ za{668ffk26eB8gTeaf|)pK)}&EMC*9yxUzm!SUh?aQfA)os`sY;2?YlE1jeEKA-3d zo_KPhdEA)s!1)wfK2<&RK>>X%`=j!bN&4>}>Bx>OHQzC>ntXdTWAU(%-$fOoAz*pExaXyP=_V}Fgw96ckA z{6zTj$EikJV7cFAk6#5V#1QkKki`9-NdSQ7TBkp02E>MK@fECP9!y2;EPRJz>iswr zf^4mBI_p*?xuTjT5Yv#PlfKfQTP|j5Pv-54)06Ca(Va)`b~sw^Wf*WSj0xr({??jd z0Fd$(u#>hM`P}OfQeTriWHQ8Kd;S(HnbzlCAfq_$97BrqCW!Qb0ya5i*ZtA*qdc-e zZT+rUPP&UknBnWN?NST?z-5&UbmvG2>G{FfHI4)vIo9&8Dp^W|7e+o$Xxu7`*g4ME zrD@T2{ag3U(S5i7@G#f(1tQX>?-CoTl$2CPR{FY(Re^=#uO38C#mo^>?Yw(Jzv=wr zjdc|>Az)+W9HM|!U7XZ;M9wZ5ek~T2hF#K#c*M%=CHi;2Qpk7eXqa8@WQkSorIZl> z{Mm@wQq&EKIY=y6(6#Na@<_@nqs3Na8Dm18nGSMB&tT7WDCPIvHZxEDCaI<*p{s0Y zm>HD57fA8qN1~lj%l&r+Q$<;MMOpPpxyt@6G~1xR*!h_I#TOr`bIQhK)$o5fYR~-e z4FLizDE!rxE{KpASNvNXGmifF2;#mA!XYV zO`873Xhk6QB#O>|yH<2;%E?%@Pft05U66P#Yy6bFJUo+qkEQH(Vy}Q(&A^m#QZXLd z$P~op{*_^M)Hg;))^u%m%!zH=w(VqMTQjk3 zb7E&=+qP}nw)N$H^nPpA-_yNTcb#2zY47P3hqp?I;Ej&nCP2#;dB~xBM9jfF>Yj6o+Mm}>6`u9nkpXR6xB zvM3iA2gGBz%xpJjRo}_%*B{AxO!aDlPZ@YGC;pno1fa>x1=0%7ZM;ZK1t=U%OWuZ7 z*gLPfgte12nmW$UgA)!ueaW6|M1I#FwvPxku*COJLcd|#e$&NTvL^WG#7brM+Q@J& z5vU(Qvf&4Hzhc4kAGsucp|T8$f|W3mBmS+d5AthH;a`EYDDodFgmgkI`&7UP?PpYj z&&$$oZ{OYV=b_Y}Yb?-8o%fL+IpO&_lO9yWS{t47I82o{%fH_m!b@5Yt?DN&?6&tI9bdFO?2ok~nn){Y0Fjnoy)L)$F zI5C0i?vP1^(Ee+4`i@^nLDOe5Qs+!0Qk+l%*EkUpqV|GY^{ZAY6>{Fq1&h6fW0bNI zCX7=+k`k!-W28M3KVtI|TTCu=gJMbO*wysfyI2iroH;S@@G)7O6bsuAM z{6qj4vEwPpWt9Bq2jClQ5D@N4a3loXkrU@S{`r#gv4HNBvsJbz()iYbGAPQ%l~}fZ zi7*K$sO=Sf-yMc(f+&M!P@n^xvxfzYSQfe_5ABi7!$q-y<#Lv2HL1i<_??9a%4j)VXAU^2>dVxMXsu`B z`V+S3_$F-!=&|TU^GglQk`0U_#WJ?|)`m*BJ*`yef22pPZkj*)7rUa*ZF&Vlen65C7GPI-zA0@TCjkS7jS8%N0f+LUOfj?;_nfsfGg=s>T>HW`X6?PNaWp0 z@c4E8(LB4ZVjvZW@pz?$zJ3iAK@#bMErc5aUC27!Nh8J=IoRN-o%iY$rR#|zfyMQ{ z0GY@J7Ysmf#d#FbROJE!Q0ur~81nIBV1_G#TE6%TL|I>ZJ;&aAN@Slo2ny`PXY|sK zQd%R=@A50_YwTO~kVozat{E2R-A)v(`j!219bv<#`xJGQK;tp)B;VmVm0%6MQ|L}M z)-qQ+dC`e3nV__7o@Pe<%@#{CpDY<*fdW$OngvVavWUTPz8mp8KrzF)jj4>nT>j;bjAy|`b|DM1LRIT>H2`orKj$Y6Q6%Rgp%Q`E6}bF;>c1+xvBnb;z{@Q(QE7k=CZ56 zBc(PXsJsr0zAFfHw%gC{Z{EId4$RKq9*?A3N+gg+HHySF&c~*YqUo|+D7p=?5f~@H zWAM@;Q12z7QB8fhX6N#W?dZOJVC>k5c7x~0H{WpjU}sR-n*sqq8P*F)=Gcq&Ag0Fs z8Kxtm5LOd3+2Mk#J)@^sAU%^;3Vx+z&^9nZE+sT*I@9*3T)mMgA-KbWXPj8OFI4Jp zT|!A)RcT{c!-atd04Oqr>7A=(-K@)o@-Wg1gXaAtvUP3vi-{)?j>#S;(O?N(uKOBp z!U5~++7F`NO3P89T<{kGAiw6Nn*!Yt2duzo8c%`(6v=oc8;v03+xvuL;0^onbJ-s5 zBYc%o16*^H#zE1t0yeEfnP$(B7lvBMu1_!5lhQ1 zQj&TaIn^Bi0Qo63Cn>n12aqHsyb@&2S7Qr@CJj7IzLlyk?kVgBj+=YOMS2O~I@m7F%e6V)oIjtvJ??3-^&b;qGEkY@X z)a~H+sgrVKq!;*m<5q1;H@E#@gR=v;FvKkhLI{gPMTz04;)pkXI8^x**}=n#^0yE|{yD?G_>|g0LO7j)o<4Mx>NE2rcBu7ylw6g2Glf zjLUd9`>C@3mpm+%i^p!kTKBO4kU9dXBshygd_vcUJU z%k5c|VUvUd*bgdW>~IS>F#qnGElC(Lv1Mv#k;3L#z_$7q? ztXJr{@hU~(YAf$}6p_0_R;ZV%nq@jSVCLk|zR(}0bv zVTL%IEsEkAHszp>00DcU?Z@2%6tIMv;>$etnM+sGC1IWuZ0IALs4Ot3$R|nsT`P`y zwGRz^aGl$$@?>nH)mcXr>_S+#)dQ0%5_@Pr6mHxiLP#mIu@+=~1^`h3t~9JKjGg4~ zX)Ldvt1M&pJVDwb$Uun_F2W-7SRWihhl(JuzX@?z=au}7+@ z5Fi4k>c$nhKjJsLbIX?6ts@D#$wIZc4 zm0-J*@GZ?fD268E@ANd4@JT#6E$)t7WIMd?^WU;Gv`^sT2zZ*)_|-mZJ#D-M`U%gA zsVo3qV%?J=!|E*eyEVjgc-*_Y5y5cZlcPSyn@Je?p<2qKS;2$Zzcsq2c|pypduBdz zsbW~E?nUsnE0c6)t50jMOg$_@C&GNWAi#(UlRmE8my1tlLG$eHlTPU5=6UamC(4T> zYOmF~HfY>Q-79RX@#;fN`|IT?ew94i*UQ9bcV^wB1n1B)TPqFqA>_srlAYIUfxy94 zm*XT`T>>+kALEFy5-T$+$@ zs!-He%B3}w&^tKF5UO-k2||e!1#M1g5uMv-QtDz|84&qd;@u~=G}H{Ilt!J-fWhQg zL_C-o>x@-aGm>o3|EZurhiDZUitqM7u~LG+w3zZpuVo|MR!V)7-Evq_CPjFay90GW zl~DQoD_fFjJ9>=yV8b2Kjm$|lT=fU_3g->`g48>EhT|3-6%rswxvjqt1O&r_;0N$MSW$S`p89mx z_Wl>0{hf{emlhVqVZ}njL64`p}`u4ud!b7GiSmfKm}fH40>m9z!{pKST*OgF%U~Z^K4Rf zGo8Uf5Fp#mBG#O(zzf~qPEp5_tJFI^2X0Y)aPB=WZ8Mge?O($6T#%ik=!6xEz$5*h zSVRID@K-;v5pqO$Y|1KZGRI>J;9Fg1^CgkR;D_avoGBp4DS9=Z4Oh&2VK&v zLi3Br8sOz9WL6XKa?i+dFR%$8pelct$lvv$3UI->LEE288Ycj(pSOA)dCuxv9c) zjXp+~)#DEd>2R$=Z=Vw@sdUJ~s8z2g2ob0cz z3CHzm$(EYTVv=2PZN@;ZmzyE(G_OQoTnHae8|=v}CcdXgX3n@ke?Bgb_q!ylsoxxP z)ra57taS{AOxk?9!1)pc31paC)b~%(wsvfqnucGS?WT)lUz(`7b!rc`Z1|#lfM&M| zl@rmyeIlb5YC!@3=zPw7sirsNnZjOl0()oS}0`;{n-4t zC_H6jeMzd||IHZRLR`!Bn3BM!10h?Gh&xPaVL!z~>7zfQtC#utIoa^_*|(|aL}+9Z z=n*4zgdvc$LJx!WgvSVTZdFtEoKDWiCv@NPa9cmu`jL|7Do=?K(Fzg6za`3zGAn1q z$|gF45A6rQ77i9{ij2emw3|r#o_uO7mo{4glVrqQyUWo312bcj5B|KdS)epd{JuFS zfR6ho14X9E*3ej&gDK{8l1yz=5oq9TF%+Np0? zNQ@=SgVJ1Q$1`U-ZDR7mvo-N1QDB)f8-+|P0+J9%>bY^38>%| z>(yVFF++t#rI_XO2(onL1YAFXQ+kjv300)Matd|O$RV%@60!7CqtiV+y7ViV;e#;d zQESI_XDtDVF!qr$VQU2?@QY4E->8JWAod9LF_Ddhg~h?*C5#DFpd`KxUTU;)J|TmK zvWmIQE!I5F!Q)|)S;=lvctM*CqMO(#t{&|B{a@c7Dl;V+jtwre7h3yl^X;xQSSAy) zk)g-=lV(#{MnO+qW^VuDuA+7FiEI(9+bR*jde#dKAo-&R*c4nfak|+iyNCV_t^feU zpuqW$9sZ6Y2r|Ft0qIUbs`OzscB&;u)E_CjK>I&@ml2`>-+ChS(8|gl)#b1{u;KVy zdIjp|4D}WN%2JHauFixNoya1Y7P(nhYD1GQ_rs~Q*dqhgabcei-G_IX*RX@b;D8&x zFDuC5`r6%+nqH^t=q6^oJE`JhI4<=Ot&MVIDr;esO2Xm#=O8V={L5=l39>E#;M=an z|8BQBD2biim>kU6dO;dvCw^5&dT~?5IoIiS{Q|{)*=*{l7#wFqwb5=oGDtPi|8yD6 zXG%i%Wwld;df_}I9G=0rq?bViMDUZm>*4&?ZfcX)^=Y{T9o5+KPmA%=?p0%giC)+7 z*2W|-a`CCdQ)GG26)*qJDQ>c}S5sDnLeC=a-Nv2@s@7PeHQYviHzHrEgP0V#fR48u#Ki*UItRcxxP#b56li z|08=ycEdVdBOg`*Hwlfc!hh#4%UM1z0((I!axD^i_E1Jg-Fz z+oXcodK&eZe4R4kpHyG8JugDn<@h7kfTLaKxL{{Le)beIlUHoww2&1@!CmEZrfMTS>>{(e=a)O-i_vM=y|(XPVkm-8x!f5N7`N~p5TB;D23?8 z0Xd*wS!Q`#KtgTSgcZ@UlC#n1KB`4ozn^`zkWz=Q#&mwwTkvV`M)VGtYy?-+24C!da^DjS-riZB7C=X1tqo!kb!k*ZqEcy6Leb6uKqCR_5=Z00`kvYRKvv zK=)c2u4ir%!F=BOwzSg7i90<7se;>N`$^@{0f z`~<99$rrv?mEvREx?5RnLev2d;h zd7#bp6c0QXu?|>&$AKS;UOqF=B|+8g?{CijPY(-)1ncFv85pRt%yxA-n9{of{kwbn z`c&V{FzjhV@U6tO(O=yR&l)-2KBuZ3x+KNQV5J#tz0aNTFLT5ep+$L`Z=OStnZ1~h zow0gsTJAy6``oUD(9;_Mkp!O`H1R$4{!}x5Hhqb;KF-*3(S9C_yCA<9wI(K$!Tl5b zXdM_`ClR+F))bxk^`3q3dwp7~2n{sb3=V?H;QZ|u-|53Bx!xC#O$#bW&Iq383bW1R z=aZ;pW{M-t+vNs1cSb^_Z1yZy3*{N3!=;|vR_9~SE~&#(s=B~xB;p)?_S?Rbu%nqt zpR~qS2>)mA%l*&0WSruU(8p2lf7M z;6o=3xlZ2cb`f^)8ErrIbvJJRt%}HBd5wgMT-9DddeQ%3*lA(iGUfex?H$NIw*^97 za#-%bpK?1Nb>trvsV=8mt7G_P6+l;0%C|e^m-@Y~cZaCE+fPf*U;v@_4OKGj%cW!cc2+ zkmt?cobND#lmq~}$-6u$CCFDE*M+h*InE9Og3tJ~n5W}GW@A!5CRw|-u3zi2bsiVI zfV7ZZRFcq(>SB<_X~0{Lp~p3!O}l}TUH9FDpr9nrxf9hG%7t^MF&!uGn0-G`RlUC% zdn-v>ikRg^-#kA%abD739)A69$R^Vo%N+;+!5U+P0k(7bisF?HC_20C z`#*vmz^sa^-pD41J~x8IYIxcE21>@OgM{%|1^j5zzAzp4fvvdASbMLsVeMB(e<{^h zucDP7<#KC9nKNs{XYM(hr84}FT_8k3)*Tc9&Gg6ewN_$F+9e?COk|WnFgWCZLFutHPr*1-6%(1F}Sh0Mml_B z3K!I=e02fYGP`0aH>j+FMKWPHE6w5R#(@nZv|7Ic7XenYxZzo5(6R7lvo9EV(>>WN24hZI9yrii1E3J# z?lPzBcQHTsFy#4GB7qDIem@fZG$__nK4&OhKou>Zi*~e5bU`g5k9}%2uMF0J1M6$J zz;;n0Tgv74dKC~6ml!pB?2feUOR_SYbS^fLi(maOkN>ytR0Lxi!60!h^XV&i?eGVK zwKV24zkZ~aFjtdz4^Ip)xm(tg_cex5^d4^!NA#Xs)}AK6M$#Tfl7U9_0Y;JuMz8@! znyGd3PTZUVtQpkd!xGvgpWP9>R`$gT8|w+*^W?PM78=d7QO|O5rWrAewujGEI^2|c z!+Bz^1B>P5OTb+jUA4tbeT~cKz*&)Zv(cqQ-wDyUNGJy}!o^EA#5#27|tij>(CRPI+XxBCC5W zTT~%Xq2Vtd^AB-=P?jtu?^=3et#KB7Ai$$V;cEgsKnzB7Gx-OsAk+jyq+b3HBVcdq zrNt@MNA~c0E4|$PN#Q^D%U55J1Qg+U7DaP%BZ;9TwjsID1E1g@C5gF*--ICm;7`I` zil}I)e4N{_b=CglC=m&j_GJD3laSEYX*I*|&vwH`D<;LZuN;VE3PQj7s8+c;6)}oC z*u1+W-rEgrI;};RCZ{OCbfR&32}Ues!dg1rEkMy)MloOj9H386%Xo0ls6-%p&YO?k z@n9QJjWMe1IR*1dHnzJCk(Me0SB+vRwQOyt=^92!JJ-w?huWCO`~SOEW*b3yiOG)}BK zs*HizO5tmxl`m=uZ^SJtQ|F@b744F;U)!g7O~Hk=&ce{xZQQ{sO~4z&wFNHo&mAm% z0ERhugPvebm?tAg&!x_Rh5vpdld-K~T0NqxnNHA@Q+nuBWHKR$mO&r5jnuqE2@~qz z_-VzjCl&*O1Iq>_!enVlnYA>m_s6k6R0W8t1x5e~|1>7m4&LG#p14CDZeI1V0BD4hOHU?g!2!c|T+^)GjJaz6?Wq_lXd?<)(Dj@spD z_=Q!(zn$6N+FKpMX%5{u2npPK-riRhfAtprMYO^ZH`!UrEk20LP1Tl_L8x~}RFM-z z58L%32!2=VWnluP)o;p&*JG<- zO8X)I_m1>lZD1R9HXK9L*;a6{|`(GfAVX&lO8!+Y9~? z`9&cHxk(tPQa;fqmeCE$m0%-?wMJYM+6I%P)wx`IkL^`xt}P0eqJu%)t*uBP-^yhl zo{wH#a40fX&H%dbGCI1-VhffP-gJ<$ddZWO)Nj_XBpf^9^`K-uv5QXjz)?Y7byV9d>y zx!$MTA(Db%cX*U8eZ_>?Wf&fl2^p2bzDi`9Y+uH%l$O%#b>4biYwv1&a!yWs z%_VuI$6pm%SqOLs?e7t002Jp!??cSqzB47ZihSHK2913(K$Zba{Ik4|n_!;f4h}$^rZO7$_e^{ne?_Nq!c+z;2ph z1Lk=6n;3c*=EZfx98#xe=kJu(7|dglnwLw%IYlNg!2W3+{6Nx6UjF4<2*eYD>iu3T+Y7 zq7EFEN+O|^WpU7+0dS3ZF31&IZ$dayAvQu0s;HQu5^cdv#=<1rj#F-R&y^#ufaq(n zZPc(;(JuxB)Lv0ID{dM;IL<+-k8TTPCEDxXBasGZ)6(o6z*RH3Kg-UE%u7EjutOBz zcJ-`Y)J-Y$_a=s1x%4V9rBkQ+ZDV&cqQotV)Gac9CqqQ_QBZw^z{|p&mKA8|f>T6~ zU^oI`)IuQmPl)fI176K{!&$c{;rE(nEQCVQkCw}5@~l>a{7V)$Gks%gKwua1tRAbi&m;evH7vtBEaZ z+z$6omvr274QNh(gfqFU*V$}la+Kh;W!?Hd1^u(8s?Xa#UOCa(zm)Rjo{y_QrFRv+ zlaW@>HHnJn(2*bXQ3*cD9Qp`{&@ygc(3w=4kL<&f9YQNx6l@PskPP?n;3KPnUk(Zkom6;if?P+OBnvAaYsARuQ0>whgXbiYr@9mt8n4^*&`*kXd zmR>hOi>#>BB2=(w-oTYfn9O8UpEAMQ{5P5wh!8L?sb03Kqc&0Cv>nOpz}O=JnQ@zR&!CU&WwRZ6K0+9ZxlbviIfY=|N&+lZ$p zGLed+n@mX~$-yv#DN%x+zKaBgSI&fsfN!+DDGaNB3=jSH<-=4l{ z^6iG47K{%H2jKE~*Tr^E<$O;L^}FxW)oD3gsJ1W;fY4fM@6y2L=G0s9HI%k7L1ay2VS-jX}6? zzna0u3_u_ejs2rzGzAehBUH&8sG~cIi6f4kf>M0_(}z@=Wc+iW$IU8Yz%HAZ3^@AH7;vC1rbWjyyELM7 zYa$4Ij}e=kywJ+r7I}e| zjR$w@h^$%Dub_*;T~iZ9Is8@H?e6&z9IsoXO!eSj^MNc8@ZIJpeM4|fxhc(Nu8|n_ zo9eHu6h?vkrGdwit7~^khKuN_65P{agYISF%;FyW2k)$rQsRqCt?bULo)=1_*0@ge z{sZ;Do{vypg{q2+$v2-nSv=Q582@*845KR&|09?~w{y;syY{DmAq)qcE6xEsoTFe=yI1`ZxIbhCRVKn1{jGlbhw`kcd9i*N4Or=)Wmc?z5afLTO%J4uMH`uRv#1 zzuXYc>d&5wl5$-2e1820kbwF@62wAmzd(Sxb~d)|Hhi9Z+*@%(@NV&5A^U-nLCXdj zcEvoRgGnF1;icumh<7JDKB7al=X)6h<@NHIdqqUp-_R0Cg8FhUS~OMj z6e(Cp#$8{2!tzW(xSAWDZ@i%qgYv*TYr%XUwgADnP?8`CetZ(K2utn~QVmQfB_u>h zNE?80e~WRsReF-0Uy>WwRLf5qIa~7Lx zEcs%dHF~C@&1|lOpe`&KI0xgZyuW(TSe!BqE>AVVs=(0=i;1{p)G)eevyp-2fv!Z7 z(poYIrmP_8JvhaU#*zngyd%S_&objiSs+4F=DF~D*vYbrBI4oAjNCAjpi zU)cz3q%G$|EA=QPvZ8hsSl=^|GN4;GBU!z}@)p0-G%2u$0#V;nJ{awg#DrYA&}3@i zP<4#*8cZbUjZ5IcBSE+*VR2D%V#{N><0;t6_GfRO(!{wl}poo&Fpgj zVcU!8I=ufgAk!m9bnevx-^uK_-UJ5osm`E^OYG)37yPATcfmdc{&93XJ2L1TZ`l4Z zoGY)J)%HFm9AynCA^bH>s>Xjie-C5S!Aj!w9{(rr5Dnr@lIbyE4~A}DB$HIH<2Wdl z9tTJPcT$V{O30*|q!9$>sPpz_^oMx51;9k=Y7EcoA`_b_-`~Wx@MEj}ac3x^Df{=% zAEHXFF9Wr8$1|^=x2zXbm1T{qZq1MHF5CG9ecqbfHpbOR&uhcGWu0ld_sfW1KLa-P zns(D%fqly~Ijpy-A%t|(nSNcw9YLGqSjjj{rE3Bc2hQ^I5cl1+ zT1q{Qg0Nfl>+rbUDx;$jIn;b8Lc)n^zq7Z1Q*Ef~7;%;DbMs>N%1*E5x8BjLm)i~x zgUkD~d^9i$PuK5_jUo$r_vHiH@-ecy ztN0@f;rbQef&?mQ80ea0lHojfqEOtx6a)Oi?zpVO1_J;W02L)9 z3O{t^lZb={Zv;};53mWN4AJK)#=^Hv&9O>WfdO?<0{t7m%%tCgr_^kN0GCUa!^8=x`fq7drvKtQMEVMC$o19wag5(b3HxOyk3LP=1Ba@cDhWXRHHS}PrXn_iL zeKWB3w*3nWC;+)1>S~svIPdqi8PbYh*Pihu!6TWu-?E7JWA~3#&N!^?3KbQ;Dtk$# z;4EO?pR0lK0XqHtb_?BL^u?wOuRf^jwEzI*xr9DW3e;?;<+lHC(R%mb1aGWWQ_zoe zLdI(m6y7ihMUC43QcM59n)X;@*^Z+V9&C7kK=%9RT+sN+;<1c>1AFSm(J;{5&GK9$#7I*q2>pE^U|~ z`NJn@I*^^J2qVdpZVj(fOrkqKK2Up*u37o{d2ak@?fS^3n(1Z585e_1RSH#~K^Yq_ z-9Bfv_^D*EJ?1Xh_bG4^#lN&0-zz+ld|HlAQ12>F9@&izC*3f})|tKjE*iPcmJ=nK zJ;qMMdtNULS@JR~EZ1D+J^9$`avb^Xh)qFzE3q@k0t1w1gXG&wE%dqb2@}9LKO0Ef zwkth~>dl~IOT`;mT3LD#XH-QqoJ6>FGcLJ!@dvAXEZY#S&SZMr&O6@tIH5rS_?&i2 zzFd7kZ**vQaH~T=Fw$4_^b}>7Z-90p1VIEOs6+K{*q**(!Tb}cMTU-?gei{1j{peZ z8okF6Z8t}UKGy7s9;d9#jg`%hBnkik(uMK)2A@V%7fGD1vga$N7nRl2w&s5~s$0RS zow2n8zAvH5rL0_D8H|W)ByunT+z(`=yV=q1N}CbeElH)8_+GTKlhca6e$Eg&XYQ)k zE;B#>51~RL9$^&E*Rb<2EZ#L)ZDduU;qkP+W+*bC^2=jBE+T%X&eM;47Csu%voB(U zE3{vS(?cBawW}XzHcJ;v(o)&G>@HH8I(@u0F8Fm2(a%n>6TT;Cr6L<1tiUSog1PXx z2_A3hkenN&*;5vJmKrkk4p00^crDrwtl_3e0qF65hsmH zpdP6hMa_q~Y}z?Uc@!b$kGAcqUY%O4*SfB}@uz_6epQ{c_`TEQoUuME>h8>aYu<%d z31?=H@bcR*lE`30E2W`z(Zxd%bJ|5m1J4igR_ME4nTXBs-q-usL;FTqX%=n=yk`6N zN0k1q2F{Zo?9+&^_sw76!yL4iU7aG$(h$HRu}J=L-}yd3lHE!L?c!l;Qt)X~YxqAa z*z%V{X5Z?rffynYq?AxB5`aVsC8io8c@(Ewv)H~UO;o9Yk+({1X4?Qg8kc`(b|hKu z5hs37kH@_~7AT0fHcIj`n5-!mYiz103zSVOO+z<#|w zdj2{icb+iDOYM-&>f=7m`y+~TiKnqK44G!k>pJsuB%r9OP80r}U?U0Y& z9j8xK(kfm&wf``Fe>UGuO#r|n>nu~#SmqH2q*BKNOV!U=$BfVfo$>M zqa4;UX8vVFs;2g?6}rnE;j{`1*{T@<66(>SIyINTob8)J)ilI;7!K*8eZO2wSE3B9 zl)L$=``&ztI9515k5nCQ+mw)KG!)$ooCG&GQ}o(~{Ho6II=S(zK@TNBKf^l-Fk-*$p5ASS`wZ8anY&2hZ4q^r2};+Fwss@vYa#zz4wTf=VA zrzTBoM&Os>uV}_s&?FZOaEvfej%^NHv*o#vgWA)6hVEmRKWHY4j9q{66;895h2h{9w=bi&{|?33zgCWpR-iL%H+>E%TS1fK*2tB6 zHXo6D8^wRMu`2oY+S6jBRfMK2)OGXOY`}cC-QBp8Z-b5Mpl(o|X)8h7yJNfBSm)+oL5~eNYy~@wvWxvg# zjM#`@&w*=yC|2>OnDmq7fZqA~+Ce%UaiP`4nxlvcriljNZ&X`z&C}}y)I_Un=GDk1 zcm3~)j7OUb`to0SC?KJ@XFu@R9}2*i^QFt!@e*0^A52ulKSF>83k^kkK(3$_&C=NR z?Q}C<4{mDmitvB3oh(=7JocpGu63SWFYfFPIv4cM7nz)`d8{Ukx00*#+%&)0bQjjf z)P-@;*xx@Mb>UYLgeLaf;*qt+86J1y>BP3r)fDliZwMEFBMw z(EtK(kNu++=o58+++1)zqg>+P=3`tcJ}<)bvS%hb?#Bc~A3qO{iJ!wW#*%9N?zlfa zH}|Bo&o2?%JQwFl?^vy}?J2)#!j8W#NY_>kHj18;5sErJUY~Mgf2oGAIa*YXulj`^ z8?6?l53yz<^r=|QIA|v`J+3xA(OqnMOTv()&(0=-0Z!G-RN=XA>&5z)A8WthX!N>@ zuj)sWlR_}r!t<$M00MWX-K$3O%7E+7-PbLfn97yE62E_FfD(NBh8CKo=89O1I1bds zMIiZ6o>wVpLcOFMbcHte0#ASDTn3}IQ8h?)okLl^gQl!ge;AG$?^6zcN5P!K0b&iCKUbN?jls7u|^!%JYsEwN*iRT%Y zWu40K`zs5&-K*d;QQ;=t;)Lf6+zf zvm-VhJ+>z4n)+luQXLfy+*OkQ*Y-vLrIeYEfv;>SuISj_?&J#wL(m?KARg<~!qA(g z{548`u=)g3x$L6j?QUVz$2I-uqbmh>^VNs?QO@$YAQ=Nd@Ua-jSri8{IP^Z#q;%N7 zeNS(;2+dnQVfq0-w?OLIhGedOQjY(66H7 z=RI9I9{!7j1n`ZXIPc@rYh;jR7W%Ij!1*d-n~={?ALqU8;SK_DQN{|vhL^~O%|%vE z5)<}23sULdn>H;TSxuB?%Y%7*C<$mg&choOtJQ8J>!>0m5!GH*E4~n@CPA|OWh|j3 z;_3ZP6U6YSHj3*hm9fCV*FmtJBN_4QwJVwIYz?C%KBP^juqnKww<~OQ(ZX=wKR|HH z#n$`wuK1v7)W^-$P~eeByQKEp+*EO2wE)lBW-lieAr0n)j|>X1FuSt;q^)tE`V(Mz zKnlvTH*4IVa%y%Y{{ue!gx^|1J!G}u_k?Cpqx{_0r+05ta{J)92EN9Y>9j^FnwUzs}H)pFlwA1#4pI=ZKz}2VO zs6UUkYHT_T-CZde)uF$8$Xsjxwq%${GAT(ezNI8#|DkU99$b(Rm;v+i|eDMTU#s~nk2fCO=HeIGD_`wAGJq}?Q|J?2}$&m(EAZ9anx2usngAB=_|A4 zRp^IqBjB%_(}NJs{A*!m)l4lyn6@<<$7G%ORbeF&phlYtxGU6;^&C^5)SmH}h3oVi zcL*rk%*fCAOBu@9ivD68-V)o+1#I6wR|D#V69;v< z7WqB$R7=eIbM3U!=~5Wp@Ef_1UNtFslh2$&rcDj%Poi>M2b^U>3 zw0El8E3#Qsg9yI+uiCT+|DY}|V9q~|nsfUiLHIkYV$}eIp z0q(m;Y;%fyAPquB&bZ_Y1bZME37<+vu(Y$M=;H=;3h7VqzaD2VZ3Qd=|I4ib%COl@|sTx z0|1arUN#PnIf&SEV;(E7!ZXkkD`!%!#lofLM#k6J6W7|+Qx-o;Zns*${4!+iTc9>EQ96d^_2m2TRKrFO2QXh9V>HtM4D=;WAJYxR%ic8+!<@I`;#rxLu(VG7iOv;B_Xstb4fz?1$5#8ZN4d$8tau}NR8@y+z zIdUI1mXll3fik6)27n+L360#cc+BrzYz2ntrJ*6Yk^bYeU`4;yK#|ZuYb$z927cl5 z=Gm`u5YfTncc33f#IrE(A|k>nyn}GDC!gxD*J$C#-J1<|MP+G%c%916eAwR@Jt>blig1$$&7GKtOj$$jvJ$T#F)3a?t43JFnUp;L3RCURkoTbu#BM7 zoASWn^%+L^Rxe_LR=-B?tbVFb-&0;Z|5V?rQ}7P` zlo2cDqm_EPl<(MzP|}+gDrY`%OZ398`@NDBVi^%eI$DTK4w3vPf1S%79zZvKs^yYY zGEnRHkmUDNd~rlf4Z~o2H_d>VCGCe9@7gbb3AcJp4Ubh#GPD-BFRJ-5;VD}7X|KOX zq~U|{^`9H~Klkwb6vK-=-sH3FK?vH<{m3}m!Y>CrMs90Hc7};~`pETxB6q9o(}sXP zkH}-DChNB?_6><&YwJJ&3~Uch^UZ;Ry6srfd%MyE$C?10!}{3%h6HN!><{E3>yy7R zuR{g=>ilL`*mq&XN~{#4yYaZ8m;luxWPSf&0}*{Y-ev`-!~4vw$l&kY{Kp1d@N#_`C^Y44Z&pq(`{@KrAas1#Xm$D0x@9Ut^~ zhIphRrb^iU^orV%3VG4TO6P9Up@P%ynb<@+!o#MYRc?zRH8sfrY!f1BW?TI3fA0N8 zN4fCu>#R?EiCvgcWJ5f8Y3Iw#iwp7L|2f(}Az2rp&O?IiFRuGfKm6tKQ1*B(I{tQF z=>?r&vv~gXZVFd864g$*rD}QC(a>>5-PxeNYwn2O_uBFA<8_%3h z`|dRpC|2r#hJGmbd_ekzEddpnzS9m$XK7?)-KP3uyk3(Qd3EiLZ$;m2$gpVN4OS#2 zsgk&iZD`4<&uwqNx3}d6>n58e`MPUUJM@0d&cion8>D=-t{(C@e)#Mw0ImFceYSg< z+%JBambTm3jVGtYhqg|?S@QeWQ>-{lj!C7Uq*>NT7oCvfQST;#M9uyPwLSK;-X*%mXi$h-tKU)HS5j)(YynIzS z@HRO@y7ukyyhvG>K<8<2k8zy1_8lf^TB>@NKkR z2J=F6`EPoyPHO`arXI?_9;;+sNtD;i8wz4vti897Y4Gm-2{Xy1;KNMw`%%N_0UlX6 z)4pxw0YZ!X-uRk8r%MNe`)$uQh@NG|U0BJxy7*`>v#5 zA)|gTo9}#_y=FKjUP(v#Ef}CxuYhvq8%(d5R?t6AWPg2&Gsu1ueb*XxIfKb@nKy{e zh6%pF2;X}-*Q@Esl?fba5Fn#^4Pf?$;t9kk)w%=z8XJsrp(q}X@ zCU6k2w+rDR87m`w*1ayC2($(hfeH2-iRGK)S&66$nu~aaky#x;6h)n!JiOGR2YNJuGwa(kV zl!2|~;EQ(?4J8~vQBd=7GUs&6=+XOeG$?WT-dgIOSWhEf7uVTTcd$=igARDoY`S(l z)#x9Cur*&G*BRDRLP)yvQnDSu3sGHl>JOQg<&>OiRyeOhJwI*qTb)Q?N?%uB*y4A; zy`0-aVe-EcquD;KI{ZyUiCT@nT;n4Pt9JB)!Q*hBXq(-~AcI<_Vj=fn zqe|?k$D8fxb9rIoqzzy?e{c!B?QN+|r5^y0@%FY5X3^Yye2s~0`H*7%^xnGq!wM=~ zr+Wxa(XD2$!S6uxoU$%#jHl3FLexX^<-9~;2`NAu?)jWl=2G|arc_{ z@(E)vVVk4jI5(!GZdX-v#>aq#1jB$w1~#w7*80q6L1z~BhJ*aUrWcX>xBiB zvzzM@rgy2|9y`dC9dgmwU0|*ireFv?J3f||>(uhA$JLd@gD2Y9@w$so>zT1+4L1Gz zN1_hh=q&dS`j_%i`P!_X!+vELq+ck^eyKK1#p>@_|5zH^o1BT0;*&onnBC@V_s}!~ zd|cLZuUInL$OH4!^Jh(W3di_8XZBX7P2@Em|LllXHp`XYzRaBA_B(zxuZ?Z21x=IH zS}w4g{0~Phv|AsZc^+5yn`kJS>ZT{2y$6fVU@iPJoS^l12s$6&IF+yrVuMN*tcHk# zhIoRW70YcTGFYVJfsb(f?EefNKmQp#RDti!3D^=Gw$aYIENMEXmB8g}2RGJhR zd#YNjCi?E>lOiOR1yOL5_v&_QT}Y{fNYCQkw=d!rfmsml~7sHqP5vRKbB+`us2 zz>_Oq1{rMNsgbXmw`#_#Q7>Dx{)88+T{LUi^qzkmVH4hq;_6q1b+`Q;f79hUU}K&w z-j~mAgz^l6{n%05ew4iTIPK;R=L9^tCUgwl8pbtK{{&9q{PQRg56}Pn=Lq zSU=buk>>A?;uNpMDU5Lpal+oScnd+O`#&ND?v#xR8gjwoj4Tj07JkaE%#HE#wUV#X z!qYd;#w}xciDvT>ONyoJtLiF4DwAey z@hVKK<{WYIBui1_X30WYx(~^=*ORF?@@8DE_G%X&6j9!V#aANF6BGCLzfvXm^p$8T zk6d#0s0c5>@;l4BdiV$UK4QdOs+uXQloYz9kI8o97K9&78R4cry|vo(>{&1%vIzy& zc``kP^1U5eLitb9hVaEV>sMYa@!Elg)pscDGKGJ=X?rd#Z%>*c3k%#92wesU9}sK)dE%%Ii(!k z$?wv0$=jI+Sg+lF)SK2R$Wh#hDf<%4QpFZ3m=U!1R(gA(+2xe%-^`UHoffHCMQ|8L zoo+VTdKJoLI-6!^^wy%;;eiuxq@*IK*F4*jhePg>oOul%?^tFJ-Gs?z4?#D}qS@?> z?E=VxRq{>8^Y#3*rA?h*Ecf<*N;V~`Z1m2}E036sj)J*XlLWaUxvsk-jTTL_IXxmc ztaI6B4|kGH3*~louK7!x=hH;9UvF!RW_wyV_m+)~tS6S!5Pr+SNx(&k=8Gcf7%xJuEW_pj?}YnYLzZS1>cazWM4f ziY|)pVR6lWuv(>A7%MO0Z!a~k$S0`c>-_F*wQSSdTSk*^1Xyb};zo>HZc@s@EU7~t z!vqUSsy; zEqq7TP$hvINhT&E^B;LC0>uxbx-te`6&&A33=`uy#t2sj^#tt`s(7Wi&)OXNf2RtV zPZ?5yg->P-s-dXA{=D#{>sisepn+}xP3{5)Rh}mkk=sfB*xnN2i6TA9uJCzcAv23K zOTGhkBQ$+WJ#QapnuP?+Mf3bxd(I!f+9<_<|GXe#Se<;9)i5q%J6s`*#ri=Zj1GDr zZsQG2%Sj!jNQY`Ufc%e0>#O}O(gS46{XEd3?HMmFz`?~E@*DQ~O})6&ZS1b5MX{sM z_K2WxGbu=H$FLR#dy2>K=X;d3EchG|0Fy3oxr_aaAIkfTLWH?`0xXQ3#P@&R{}xvs+R*AJ)TRj`j#y1<`r#oN`13LR=4YF1a zn!9}aOSe{^T^6FAsUcofuM*lH7Emr&X;}*+B|v;c=~uSfNt7}z`Mp=Hv9JmBV~bXp z94}SOS#*N2fpzUyw2$#8)~226HVh6`6m~E3-HdXqtuQlPJnc?HU(N$w2(#hm(EX9U zV{q@(%C6ms!A-x)&hULn7c)T{F2UvmGW@*l+UX)g>ujDV>)uvj26?>5qnv}Y`O$d7 z%|=Sch;|zXYTLCNp8G?=o}U1cIs7)S-EcmD&F~$9>K0<~5l`VAyfbf*%UXQurtCzw z7?jXFt6`VMOLdphzAxZ8x?_Ro11ZhZ;A&s8EVn|-UX+gykZLO9{@g4vkd*VM`peWL zjbH!^s4cZ?^7X)Ww1^bD;b|YQ>xvo(_9r{UGD$?oW6m@r+vcAw4WBz-_QpD-)aoGI zop$SmQ`q{Kf*kdEu&{vdJ%St+3J}7#V-M$HAevLE*#W_Jf5*qdZy(~_b8=qV$Eka4 zPRh;%ja$Db{N{9+;Ivxq;r98RHKvqzjBEQ;Uk>f<(8V-gaP(VIVKh70Ccr@8_WFE3 zSI67OZ(*C{KE*GX8P33>!%0@X_IaTK6X*wjQr7#71}$E)MskZG5x``Puoxy*#Jmun zc89}tl%F*D;JaE@8BU)3^6-*Mc&ZNSNkQ{7w}ySQgUGP$<{1Bub&s5En9j^>X#$QM z^)!&J=B6CRf*FoVW3mC>)(q9~k7=7bpAx;&qz>}hb?_Nr;Z`797}HQSS7 zn!}w(|B^yxjqL}e>uLq&q%@8y zy1jBbu3N{sp1ZZIBK2~-FD`YE!fF78z)rG13MX&5UxUA5e=z1yEb>Q&IORIe0qbqCL8gk>s^?1kz|k8l51SRmuShg{KEF1SuXy&l+G4^V{ZE!FOUhV< zzE&&s_(PQFnTE1zhjx{TC75#-SigPkWEE1XHB+o>uafVc_^5O7y>w%(rNF1LKsn5} zhv0Gi(|poMxjkb=MfC@#4K7w1Q{7x0xmCxXtL%V(@Ggw77-N7?jng`N7~Nc@8rMMK z3JCGaxutpE0=)>G86m174J==y!7WgP_f)^!a9T-1wlKi$ zbT!iFHN|fbw0U{{S|q&cJf@a9La1I!eNPq|rwc7&21fONlD!muyRvP}pW-^!{Vb zRAx6Llbez(N=35nr=ceGq-u}JD*1FHqsm@ig=7v)>E1u1L-GHWgvERH&f=@Tn>p|s zxq^*oj2-ji<@ak~^n-krua#GZQLw~hQ8Rg#xW1De4v(p{S11j5r#-lLipckAJ71pJ z-ZCOeT_=Iz227960u;|15V*h#bph_nlngl{iNn0 zu4bP}x+B0GQaAsQ=hJ?5&k2L_N`CJDn~?Tl8O z&a&qpYekM{znaN$-ibiKKVOpfkeLqp?xN$YZ5WA&f0@!m_<7u1rYn|e6jb2=7N*^6 zyAD=ew7aK?)QsIrG1F1c_q&`5Mg+@8kmgT)ZJ}j>Ic9&WBn`3tEz| zp=c9N6?90Je3#rxh4<|H`@0BNTRo=FH3g~n>+Y!UkgMs+Y(>64yn5$i`@YkQR)~-| zed>#!dQs&Eed-_^F#4dQM$ju2M7dX=Rj7?`$;qZC14-Ging$dbBHxP%toDK{dYk5$ ze`^FVTJ?medVk^@W`u(?`eVlzz#7os*%q}sWoL2z@uT39mrD@rwQ#L-(96fiQbtzT z;W&3NllS(4v+rpeE{t%?hnl~-m>(cC)_jSrTYuT{bUQa>|A5=`f3VPhQrIQ8HYjZ| z*b-@etsi@eRhF1cX_v7WyJ_utPAAe7nV)||!uE-Wi&sBf&CICn5cNTmP?VR=2QX|P zXfX>GKVCW;nec-)s|85etO^EJ``Dn0*xFqyOR}Vf&BqOVtkf$m0iO!3o$P9BP7DG! zH2WC5M!k9uo9*whU2C@_JeB5rB1qa6gTZcvhbEIbklibr+37hgSoev|%?*C9MbnK+@E_8_naQP8?Ug zy}3{E_C@w${#HlkFh?2%hxkTfTRL-j{cl=7QwlTG>0D9I0ON(>#tJBQKx{$C1^RVL z=kHyS6f4;MjFs|G=(EHbL36@D(|1eTKJ|~c-#)bv&)3?mb7`6< zzw6H5TcpGn@?MF%G|l z%6*+fd+V_7xx}N(xB5aerAYyjDM2rkuGGu|Djv*MXM(Q-s6Z8mi;IX(il^D`J>o^> zqD-w6KG;LeA|@iC3yps9QH|z=;G0!LK?7RAw=0d7=Rt3jlY|n;+=7;3$gzrXF7TOX zMUaaPs#}eaZXsZ=?ewdZuYoO4RS7+b7ADjYl}9Gy)JIw6D>x1G3X|OKF=>72Y06Y) zYFeSXDi`#mxS`@r_>}!}_;SUcEz#sd#nahjL;JZ$C?Q<>22G~%lXkzbUL}Q>=9}sO z%F*D5ab``oo$}tCc2ce91BR+zVurrge=ydPKS=1e-By=pV+)6xVN2JF?Mwt4%R?h5 z#8oWFmhqm4QJZTFGsgE>lh^|J`MowEhC7^FYWlsl9ovM}Nvn&Fi}Ol*MWX)TfzxZ)_f6eD?hCUW zn%8SLE0W9(3&>5RKc?w-O5K>A0$P5CCfztU{$GM=w62g*ioKUKLP+Gv)S2>>tj6xG zO4-?Z24;Zsk1G83=!R_?9O$U4{OTcXia$v1!yl$eK{0(&@1~ptVG^jBL0X zv5J+8cdCF*=df$EU%h|`hx;IE;aL%|VtxRJxJ^aD<&vlCqF*fpes-W{;TM%3lo>y) zc{$YVk?97dmp#~20x1&d?^~83LGAX?>A7Rd@Nin`fHm$Moil z9C{dilKc%EPOb<~?su=s9MbAGo38Jvo=Lq{3oa6s`bGTgoOVOA@W>w@%-;Mm-%ssC zwtW9-_bG80mvHk8s%`VW`=uZ3AE448pY7i$5!Pg@S=MFpLrfO4efe@-h}Cm?w5*6; zHH8Y&ycf0BX>k@zQWdtx|OkWY>p)+u8j(nsW+}2J#yr@+1^ONO27lS z3s$dW9>kNi_ZJUIo_f|LvAEvF zt?mw0*2f;SiYel(uBJvsjQ)D)VP=;(z3a@$a{4T=dI{ltxmj59d88g_V~gm*{B!-C zi9v}NV!Ye>i+{zd&v1qXbAhoT;{Npoh?=k*D^jcmN;uehz;w@vGdq{$La&2A^I(LK zlZywlfYLR|pSx$2%i3aahgPAfD<#rEZ#Tkf{Esb|!shmGGrxL6&bERBF8SO1!B1Ou z_-~q{Q->!Us_un8^G73`J!Y7VxA3Xz_^K4z@;Es=;?hdmQ5fp<^-nd`m@?%}C4dC< zh=Cu$eGQ|%)SL!5-4*E`pKa?b;zpXSE_oV$Jfe30(ou4du^RnHbY} z*8_Rv$ZyfFWw}#?;W@lV9Rv-T=n2>jka5b>UdcpdJjiqh*I^>62K))xOej8gdJTM$ z_;h5OiOc)-`T7{KzjYd^Y3~zd-^$AP=Nl%bT)6P+x03RyNlfnF#z}EmoUx&dxnJcn z3d$u*;rK?!dBCjBd6~Mg<%~C}9As?zmKqvIs!D%70q`!H9z3VE?}8`%0~7WGZqqs6p0x z@=5wfo=ICu@V>{Cx5=|Xe=cv#3vqnc(7?Y4b%I zX|8WfXNE>D;upRteRt=X;$mxVlWwVO$MXq6+yk4%o1Jb?&U`=8l@;MIlV%1- z?jhy4J%FpWQU7IGF3~3Uu6--{QE#Oc1Lr9#`rK!8YDS@wc#S{{0T9y1ReaF(T;Oq% zqAQ01a9I+aSr(XHJy7%z{hw7N=@k6myfr2DNaVxp$*kbkZ^9>${4wCr6z)FQ7yPT4 za~^y^N`HKLiNM*C<6Apgsdc?-mD}|kX76pUNXQ=V;k)W{mFGh%{=q+oj#dhewQPd$ z%#^a~k=HrELEw?~RCVPJyCqivBi&&?S;Z%*&68W?DH+@9P(_#3EcG2L=y1#CDy*-m zemKn)-<|A}#o{1H+JhFFuamRHe@Nszwf)z*r8l)!-?eU##=tEZzt>Xq7fbx zzTU^br}aSDfN%A7>vB#pR4Ea$m~PsOhRE73logfX0EC`xk5I!u*9P zx3NzT@O3c4QbrzqHAJ7l~f;6 zbS*L)I(lI}%r+CtR%N!^_j~;>ZU!?#In{2>-Y#Mb$1-9_^3!<*K1?O@RtyDKJPel1 z*9mEf8DS-J2l&z5RqVa3n|cDzv`MYr-*ke8KOayD2oLU=Gdzi<@!&S5`?4EG!yP4k zsV}I|F6A0pl=uT80;@^}pt;B(0)FBNP!;MDnL96_F8Q+^bvUo|Z23DI?tkjhMt_l5 zUL@BDBf!;297ZbtzmoJwjZ3z3^TVj}wnUz$!JPrYL-}5v>z2Djn|yB9`d=I%KVaN5 z!3#MbD^G~G#W?I;3S|=NgmZ354reaYw^N}rF(TA&cVDef=dpT=tLrExsHQ8UEnRnH zrD9T76cFRm?c^uj{AhN2KwbXw~9r- zDDj&F5RG?#TIZp~_mwonli9+QD_@(QXNmlJm*6dA+s7w|HNxiU2(*_6<_85*umaXG zs&Q?VsQ+g(M%jpURa~InBcb2j;B%+TQuSkA(p_tuC~*fhiuOmUkwIT3Eu4SOEZ;}? zeCW*Tna-W&5)Ve}spMX((>Y@L5lc^RyLi>AAnwqepzSbppJwlil{kA_QN0m(`FQqj zldH;QgaH63pK$=k{bsY961}Oa`?!p<2^5Q8DKe{@Ua6O{7}?gyTB*!geg2|*WE&-$ zue`9z;<&qFJ*%XIoJEL;T6?kgI#QwbV%-aDmPth4c(G|3avI&&c^Sc{4MKDyYAuzi zgLuPpmY09CVBHdEclzDh-&zuM(~(Vo4n9?}0#9w)Flv7**NZ>R#k==uA8B9E@L)RQ z_vEZM?nO3|#^7}kwoc|_fK2+2`hc06`{ei%_UxvFRc&=&{@jsf#UHPCfgS)r>QGEo zvPdpzk$;H_035&iJ;+_0~?E?%tu9B>62v9!*<*N7s%M)yEX0^+QBrLr&`z!bk$ z2A9y0W;f$7R6P=BhBPlzi2gY_Uf-_U2AH;uqRaK|Am<$g)7GN4Y=)q<)4JtKy<;`v|8Ze*B6rY9zFMz344h61tQCQ^N(HkP>1gmFkE}FSZi|!V;(M_!PXQc$2q)NtUq2K|sIr#J5MDLi&~0a) zJIB!t@K`8?Jfsv(UDNez5Hh!0UsMMB1PJ7#kT}z+w4UA*llySE7S?qH`YCzd5hm{5 z`?^xmnu+scEP6UT^S${g>g86<>Bj!1tCE zgPGsl2C;UR%)cVFw)|U2uwiaCk#GPFcd#vaAr+c6PPLgBa=_*NoLe8tQx<*|ruDpe zh+PUDJrnmZ?$$0KaE}WG=kTc>0wWatJ!{}(#`TRH8XBQmF`6@ZJqCw%Twj>+&AYVH zDRv)O85#jQX{xlbaLyT3dVj2Rj0S zoCppE8=?nt>QN~v(d?AsJ5l`DD1w)m`NY%y`u&$Vt5FWsXETYO8{W>u$MLDe4Qyjv zaK}&0hUGG@%N zl4q&1ruVrCddQ_%8=<{0IJVlCE6Ca3_sy{#B_0wZ0B;R^vu>Eo<`urwk& zu8S#;Y%S%6YI`roS2u#gU4Op^t+O57PDq+XO3Xy$22ew~tx_&vIAg0RaWldEKN7$5 zYlm*DPq(LaqWD=?S~Zk+6|%Da0=JA>Q11Fdwx^8G2UDhL)@o#$(F!l>$RbKXo-`;m zk|U_ctQy-$$nMajv@`V>A}J|VZ{BA%#V}GrhJvJmp!Jp;g%tub?Btx8!^TJA!Z3b} z+CcD)VAz>p*ogtrI#Ct+Gk&5eKkUqtwpd@CW)`s0@uMm4ZD)TrD$j6-tG>UNn2E*{ zD{mhn=`;27-17N)9ulvgx9DQuHZ>NQktUe(NLA+MS({(iT=b8tsc;RE7${1?{4>+j|zI{s^2zgj;54 zS-aah+-~i$k4QpG@e?MQ%9Tbs22?g$m8)K?+zT_+znNB9sgub=F&k9n#~pOQfJ|Hw z9@Gd}og`lBqg2WPgD77-Yxs@!Li)ba7dVb(T{pq+)nGPZBq-kd2zl zS3PInO=h{2H-22bp=H8wF)&MZsLk=9>u*=57x0<)-^aKS5Mxl>cwl!p4g8_Wa6nyu z4PAr{2eR~141OP0i!ruNnB4{&0%j|Fxseb>pARgT?EdTGTqo%Pdh&pyxFR2opPj^H zUl4u@9z$$1AAJg8@190VpEdm8i7vF@39sg1hKcus`%8N|9zXs-qoq8T`jWarHaMx_ zrm&29eqGh%zBy(lBgtlbnftUiFezHLBs0uT_U8CemB!vLDuFi6Z%lLM18$bkq&QWK zkrZ?2Z%cGUJj?#iN9c$=;Q-sh2Y>IAIxECu&8&~T`|<^|DOMdxUlHDpYw0Z7y_WlB z&L~#0sO>Cn?L5G2h})1TD&CT~mUPO1nQTXap)WO$%^-%)io{L)J`{N}l;VA2KSzgR z$SaU)8r7O-3dQ=$S`ufif*g7H;k;6anS9xZgsceJ(uwD~go<|0S za+;DKXQ|}GK*$v-8)XGUG=OKKKqf)(Y?wDvg+F43_g%F`Zl`V7Db}SVFLrWgXU%*X125s(V5F*Dy*wT zQoJ4*xRKVS_iECGP|;S#2t3}*%}SO%6Jl1n((#IY-w75cipOQ&zif3$w1jlMSZSkI zd2YmL=mV{-GVK_T`_8M`Fs49^Nf3`IKJ}X@AId?mO<&O-=FYW5jr@`QeT!N4Puxw- z$;j;t$YO0)H9(7+>Y-F=**Xsy(gHE#`cKK#XftaQs6M*xIUIfnmLo_o$Sub2hhbm| z9KU}gfLhxL`kj%6S)l9w4H9(azac>U4pRo1)^@~ZIvxT`DDIp}A#X(WE59v{NDP3? z_O!ctZeCX%w@})I%X4#eLp#Ls?3TgC366wQKcDQj=%L^`O#ig{QMm%98*Y10OC{oN z5}=BNOK4ZC-KMm@oq>tnjE-ec|B2BlAQpkKCooA`bFKXb$!j5y5!042@e}gOEv(@7 zx9RT&&t|gvnBN|3wm8&Pjs=_d<_!LzH=@vD$ZXHEzoF_O7Pln@Koak74Io{;ionlN z*jz6p#6*unh>Q7PrTxV!w0W6{T5aas9FE-98)O_irRlmWEGnAhpgv(E@aCSo5tTJ`xXQx zi@zfMzC}eQY`t=2;C^ZG!jFIDWdfbhiH0}}T+>5?`$X#u}#g~C^(RS2XEzpBFnL(>=FGF%RTkMpM5bN%Uvo)uK zV9+|@!a{nzOnR&uL6fV&%c^nCCu_gI_%+)YpVl93;x(P}&dqBTO2zqDT%O-1IuuFH z8~nBH8#t#TGj>~{H*%+k_?mnUHj*(+zEur1eW9$kkNOWF0M+8*uupr0a%j4~0Tj4i z0`cjlF8TSxV=sWC#O_pWAxyl@g<5Zed&cBWSc~LayT|2Y-=6GCgC{)}yEo~XtScvV zTm8yCN?q5g3^qwWiQ8`Y3Z7+KI|F8VBJ!GkyMvu{;^b@19Y#DHFE2ac7}q*}-UsFq zZsH`|hbTO7Z!kEVCj*1=h^jx@+XnJO#0yCFpymd;)~R0GOs(k_p?5T2W^S?n1+!k$ zlJ9ndxB|ulT-KwP`QC0H^kQ94tzR4HV#oaFkw(JBDs8zuP2+=#sA>h9U6f=vqsJ}S zh;n=Tx!Et(%0xlyF)qNN)WBH3YkgvPZET-!We!5eGlU9_{lZoDjPEpP)@8dB3Js{f zpV&U(!`<1ajalwgkCYS|NJaD#ml@2A59Mz|uunPL()0a5U6EZUGsFscFE`5|`=vu= z*ZT0DJYcKJG_6P_LX~u>0l~KHKU@O%t{a(1m+r0f>6rE%JKr0vR^2rYRh2l1+?lSx zL4%uk9I7<1($I#;ccxua?7U2SgI~pxgKd^npuzzGxk}FCWkKh?D@{Ux(AqY6)$7;d zn{C~U4My#ObHJX5^9s71zRKE9)^uZT&nM+d>bgVyeu6-o#W@wIxL}FKpchh(iEScR zq~uZ&UxY1hjk_|Vhg(3i%v!#@p;o4E{ySzvcJ{BiBS}O;ldp~qlYH~(L9QzG8s)WJ zPW?cW(Aqm;{Y8Tl3cf{ysV{FoL)i^M-TzwoBjLkKt#?hdVasc;qp6hhTU5wltJLaQ zxarWNNqp8ss*&=Dn_FL2LX+>~yJ{v`!r zIq{|T^ZJKgfud}m;{(OS?f~val9B(>ik&*4%bt5ZofPr1t=~{Xxa1cV@Yd<1vn+sk zt;xKkO)mXVnzwuM|A$E)U`bR%ILm$=Wz#=Hsxn3|I*K|?_~Zuqxd(Z1^>+FYEL``$ znfkw?Z2srL)Jr+NoF6Z}XpfFMqhome z0oc-lM!K?)@yy&~WV)OV1tRFcToxCPl%RJIDr=px$V5aGc)#r*;L+)#v~4=b!A>L$ z%Hao!96HhqJDzdtxh;XN1}BhF?dY%fpOAx6KmA{*W-c8pDD-hR4QAZxUhbR9GbUBQ z2MFoXl|N>X03>;RJZ>B!7k%OgRL89mEEhwQnZiM`Gx?4gkk0Sl`h6~o!&4XDl*mIK zAKz~4U*k1e_?h}qKWCciPICE@t#L)C49E3zhCj4Zwbs5~XMWOi+K!v*;g}Y<3!3LN zFcnh6{V(!947f)A7{J2Y1%#-dVdc? z!*gJk-m>w4_^&uOO26;+ox6C&_G=nl06^do=4L(ySY=4*r5FHa*q^+LHk_soYfPmG zQEeCZKg4x<^GA3rmi%ruuo=bucoYPi&0!E#HREH4xNNJY{y$K_`7U7;z}pB81A^sO zP+}zTAR1aJc88R+MY@}>(M7ge#V|So0UIiB24)1GTC_eqZe9t(gV*;*kQO`wHXTEO zxdQiWZ*~;Yu|b4nkBWXt~8>Ij^OAT8wY#)0wJ<%qx4buFhsVE2LT&P3cPOO0Sz^aCI&?0cZ-*>QY57~=&u6kD-q!qlEu;=kV%x$H$y7A|5XnFt1++_r@?QA6ICBrJSo$#-5<7Vg3Ski)Z~iI=qJ~C0zeu9GRG-b>PG(ShRx} zoNHzSo)p*Lg$0hEtYo(;e{apK^Q+a0pd_OY!1?)aUKPyy4^J=#`3up@-&%m&E?-5L z_*ne#+cT#Q5y$6Bf6Q^U+WnFdpBZ!GfWKTRUST`E7#T2O1(Sy}ffY+I+3QLaUp*=I zt6mNxF!U%E42CMH;t>C&QfSjG4K9f`ZDuYVq?fGb9Y7-qX~?H39!;#vgm-o726oT~#h5F}EK+(5=m1Vm%r3=2&l&5Kzp4{*7_R$f7cNOqVa0^xUswim&-_ z^-6{LyMt~Kx-dc&+*@*V7{?rvD%b%gwaVqHY?%R@|IOVBwx(Fq zOb>@gTHPtAp&kW}vc{h<-+Wy#pa=PW^6C3x|L^1O>(2>ffe+yJ)3?xet%MOL%>OoG za$Mjl9S&w4Bi5DT%3+n{5n=9bT8<*8TH(blHjuE&5=zP3rv={Lw;oqV#!_9Wp>xp^ zPH5o#+S22?eNE@PHPc;w+Dqo6!TU35Pr31vt)B3NLz(`~#6KOHhk7|uuuwNCdkv*Y zd$a;@?Z*y3)ufKMrv$3m?x-B+TzPciG4sFfQdDT9zQBcmq$)OMRi=aAM^3f|nv<)J z>`OdTVp-e%$RHe18x#Al)4V8Zne-SSvm2S^XWjoq_cU&$d3nmr6A|&=kBBO%^2c#s zy&GEuCcy$CFn~Ib{XoohB6HJh%RF%ho;3SylHwdM+2a)6H}=6g-8}lNr_BL>IwDP_ zs2DMdFZ>sCcR;l_b+>9W1B97u?kBk3+)IJg#l5}c8!OJ&?Nm2t>HqO;4wy~u5gLH> zyN>ju5+x`8Z+p;Z@-QC!!E62WN9qi1B~Re~Z7(_VD3$Lq7Ao0d#~k z*1_zv;0H*#8UjQ?i)*b8`_N|2#r#oQ-wtZqe+~Zy>tjGkAH#D_msw8iF^`WCxW@6HHieO=z}n*kN6`H^F}+{we-IpP6bjmW1jW7?~>D~A8( zTQbx9Gd7V9U3(oRpSzXWUYU5_w);Wsud`3rPDliTg=54wh1wzdr|YHG zQc@>3<8K01Axj*Vs*1GTqSOD2uhLLrL=eC7?=>M{#=x(i%{0b1anRd!Hd^7y457Tt z{NoIbpiEPK;gBV07SJ)9_`L1cNDKhzl2yWSUZcSP98s4hGxOQ%o7y!jqm`8b!2a{1 zLi=`*CU;L-u76FSOwp`N2hpSPkK4s_&X{T%SU`osGV=OjBi0#Lll3tQG9YkbvD3Ws zeRl5&eoiwB|9;?9@Y7 zEa+hH^b!D|i^bI#J`fo)NepWAg>2Kq|@lp3S{VEj+RwaBMHyTt> z5`?t#S?6O3ooKgw?!|2+<4t3c?TwUvEhpgJ46I$$@#l5i`JU!Nm(b>^VZ&ndQcn8g z1;i&^c=GpxGtAg96P0mb{qESs2@C)599UxyKcRZg_#L-wmuu<_&QbR;-bF$KAfy;8)E8-bDD~|tTB=sV+mB?%iqta)J#}mVfTgSG z2gTEoRCSw?W_6X6LDv17q!HUl4rQI|GRlgaoOn@lejzn1jO>$Nh-iK&rSd78PGzf?4<`y240V;TQQ1O<53f z9OYelgfSpZa@63grP+hzhs$$3uGZO^;};aXG)Cx^l|_@j72v8F3$>iF&{lzp33efc=ha3xy=2eMgNeiCcb6k~8v*00j(`~Ta5D8lrwfUqCDYfyzqj?NMzIS?T<@G&L= zS|ivf&E>f5P+Nj9{-IRIKIG+JA$r_{9wv-LX++{B6&?Q`a0(r)x=pg z&SJa`uINR3?eI>d?s?Gf&m+v|cZs*d!PC3M&$ja{>ewJe$JFXLf7>$^-R6)^*goM*I z#`}UGlTq+YNDX|{i!sH13>PE!6S>IyS6O4+<$ayM*_bTcp;pmRVBHlGn{zGK4c}zni>0^9w5&7)U>}sYZd0|^x3C1(gT^d2$ zx{^2({ij?4cP^G--|j{pXOXIfeF03RduyISoRU%mV()VzZuW9~vHUUC5j&b9F6Os` z{BV{nL_ZfylU1D`15!8}Bx?&kkTA;+cOe^7k#+g#c3e@X z3$5a2g|UTvtHWEiT=Gp$r7JD{sk_JVGUVY#3QonpRG3i~#F?LcM_(>e-9Uou(3S&cd zU4nFld)#wq^2E-I_kGc6hVQxkrd%xncGC^GvkQ%dvsv!NycD-bRYHVjr$O3s8E z>Q?n5vD7msvD_W?$8eP5oD%%<&OpKXXV~`mU!sMmSH8>XCwF&~l!71NSc#!+zx=;v z!jzHfpzoIaL!qYwJ%;-e!nT3_L^StBzW>`Z_gB91;r?BCNN6e67RB2RaXcm*o6cfy zoK+S;jy~Y96SSN{j9>Ae6O0_ZenydD}bRF2~i7MYYMJ zRcjjj%;J%m$;&oO=$l-beYYY7``x4p0RCA2ccT02Kns1b0(1PosRW%dZexfo%7=x zEu;0C-Be~d?#`ntE~7HwOY>AJYc@R(l1|9I#|mH9GiYuvCXA)eDPSdN(k*Q2>tvNvar*4JbioA zt7G%?H?KI+5_{uWyxGk~?^V}}j($#nTed7|h~pYdSY~35huLP?ej^{h0powc$7vL zpHFb-Q4K%p8X~2&3Lh42v)4A?h5BlX@%YHtG;1ir|HIdJKsBAT{o?A1f)u4n6;bIR z(rZ>wk=_YCBGL)Hm&8?yQl)ngY0`V>iGor>lirDx&})ED(r(;+-*5MxbH6)>lar8{ z$@8Ci=4roYW*FTCZ<;mM`7Qk+yUpp_cUCYu)lPWtI@f`K9_LhJUzgY~%-Yf2?}=rr z#98~gpp@z#QBW{uyhLpgU3T8@A^NiZB9o$qjvt4?O8?$tNt}rTpaOpm>@AR|mfeTT zbA4GPzxPi0S=)@^(ALP&$2Xn$H(eG!9gaJOAT_n#mz@)O)Ko|8Cv8Lp9+P=5$G1pK zOU_UTqFuQLI=JjVIl=AoxFj>85jZiQh(CHB<@?=}d6VVaPTldnfX zr)~y%=^#DRA28BK_O*)Xn-(<_*s9=t`1Xa*P9jJz9d$fS+hgsq6qXS!-7T!CK2zrZ zAU9BBj7(5B-*Jls9zA9d(oPhSFQk1?D+T)@zEAn4rjq)Y$6%g zSU4tdrO0kgMne}oA85iT@Pwe*6g@|&>e zI=hviRTgqv9|f>Z!t}+3z@X6EHV{VLDRXXz08#1rj3s{!%RA_hx%&hXXS{<(Ee0LG zStMWkifFQwy{NTgCybOcz#FM^+gA(WODhvKU9ZPPp$9Fx(gCHm*U5L#yb*qtY4Aa# zF~^Yq3a49?MEFki=nVmTD1-0=qOkc4>Yz#;TlW0W;V*uwi9d8VeMG>7yU=n!!UFaX ziy0R?p3Nkv)W^WN-%2u?Krtd9PP%E)r4SZ1O7eS~iM1cQC_h zuf*fBMZ2om5XyHdazI*n=kWTejp$i)*t*ms^CoOq+O0E(lLz%g8yZXO5Sl?O;FWsP z~m9|$*xvM6T!p70iB+sAFY3v^6{(N1tA=F(z5{kve*Xd zR!X2qpdA*fyO7=Cx+cKHsmnCWVX6??`}44WfVqbQYK@rxi7Hpd{VY1%M@XI=tGg?Y zB1$cM0cq5(0qdJ|#DnWRFtK24BX_sYj!EO=$;t2j*&f(zKsf#KLCI&|Q>dk;#iJPng_c$P?niA^!$ z2o^8i!4|%)oMpC~)fWDI`+TJWI%*7@oH0+x$5w})6J=KJe@M!;C3k5`IPP6}5Movy zOzL-YO>k!>U}x~81?iBH;dluCORX=`R%P274qH!;Z?6o_RoJWOuKEOkS`xdrhb;*g z*~1{vSwPd}%B!*zJD%^ozZ}*@JrjKYd_m=hia<`O$#3RDICio1w$plq51t$#AQv1r zYCYNoE_1r&k?HvYSDABFG+?ENe3)5%82zWSZ5)^RrmWj&q8Wib9I(=|w*05<1ziTV zH<-6LM}OETO1y3^FYs|N&l8WX7=L^C{+9SMl6X>%F06Px<*p!MS-c-l-U~0qb#!r3 zFx$Lq=v*zkBk$e|n*dnpyB@tov0CwkU@;kkNbkrrP#~sRG)?K~OI>{lcbW+K_jk&J ztKciq&wxXrekxP*9>E<#?bOQIC5WWU(bXB!ueR8QD5VD_!)l@&q))f^?CyXQdlWWQmnEY1#~`wIpD8N4YNkS4*ghrIYgo5t(49wFTkI-CvI z#;?zu+irI#Vv>U$VxZuk?CV^~#}djegf_7dMt)XL8=Pw;80hAGxGx86|A7Ekeu7X& zrvXT1Cl=K=98+qsXT{4aDckLLi>`RIOS|lo&Vc8CQeQRi)c_@>%^XmD3)t<^izF?MKOa3l2a zdq)=n2c>Rj16&dYFgvxtM?-|eR;~F^em#$shFj}O=sz7N&ZJJ^=~{u5|_T@CJ6K122fVWvwC10%5~!j z8DX88*={J*#>}dB0^x7QdMCC$eqB{iq1#?kw)u}UzY8Q_|Ii(eo#Xtp@*|f=mFf{=Fu+FH$dfRu)VH2%8J~zMFsjOXoE7G38Al9)}kvphL z#3=he1p%;~5t(nRxGfTLW|?yKa{WlRwI%v-zpeSO{kX4-CoDXR4Rs8T4(-e^6e_3_ zfA*|Ec}fZPbI+~Oz%j4>>+Pnv9aNDvZb+%Bd8M0qa9&lWu|CE#T#2Pc8Uv6kBfSqGzKP4+mG8z$|Uc z>VdE-t4_RX*lz-s(tB-WZ4LY{c8SNWrW&EtyoV^|y@)DVp6b zruX~UJa8*_C&mikxst#Ytpp7%Rrjl&b5|b{Cw03c7HwerbJ9XTh1UIH8xt+5rihnT zfm$!RqK0MO^NK1L8GkGKc^uFHSEQiOOIT}vwfx;U>$72Ci!+PAmnksw*OC-(iA_Sjt!ES0}ooCM~GMlH5oYiVw? ze%uyYm^>$3N85qPR}kbrm#M;6nKo>V2nx}}dacV0#o}WI273GGc|bo*-0Mr84qKnt z54F2)%y8$;mbkRRDzmt~JPPpRh9UL~TwQrv;)+9zLZ)o=w*$$Kez%}tsiLgAZA{8c(1QQBmO%V0?v59ZECma-g^432!?8V zMKee$CP%!yVwtT$qbZHbKgp_@Y!Z$aWnYdPqce4k)fC#4u>_|^dHs0rpq@#wI8}!T zDg`~pvivn>_^k9mPSN(Nu0`k7$$;+v1VU!Y&p86KsPIBVm^9^P?8n=Ju#<| zl1^6G@62`|xxQZI$#K{#K!eQ_eT%crVyHn%SDcrO3!W49AK3)URGHaMZ$rgy#bxih zKrE8%f-vk%t1VbR-tw94sVTTe^_=0rkPP`~4R4|cNUg+l* z8;MX>W?p6%SN)AI{r=Z1e)PrQNd1m8R%W5i*uT)OFX6AprI7v7!rtIwKag?0Q^FS~ z+kDnFr7R>M>o4;_mO(v>zjBZGBMWSYuL;T`WNwOBx3vy339S#=WUqIy4njT~ zF7eOHMzmoZ?Q?QZ2bz7hKi|$1_LSaMz#jIgp}RR^KDpbs!{k=Z4nwK1DV8ns#Obvs zQ2_1{@Jd^s*h;jz8M;#{=z4Cp-TtRs^!kxlRasa;I^uLu01 z{Jpmq^X?CIr-zt6J+lO0fR|vVn-HnZ!dJ%j<#M? zs`&?6UgOE63*D%bEofki5D0shq-@|^UlO5qB}(&+->QS`S1?HId~t61ov5}14bMP@ zxm1`{L+QPHUP$Vm2w3RFvKq8!PG5btK*g4u$|k^BdiO_*Q{+(SkZkbkM}_!{VV7a3 zMUYqZyB(cTg5}p)%%;T3zSUWh45_)_EqxlHKOs7_gvHA&y9M^e-M%~kpu`-AG;YP-VX@do z$ORsWg*cA$WDqALs&cU2@#6kBTz`5^3RkSZtDj#G7@Pvi563D!tsMLl3Je z38qn4UrpUS&(s`{V}>`mE*ROr-$9NIVVTn8>RgOMT=y${^+ax3;s_5&?`M{xru}Bh z9NeKR+?&&J6tAs55NXTJxbC~_^YxVME)ZPEv?aLF! z2;V;&iRHc!n^*oVOVDzYfegUu%+r2lt02&Dz;$7V!DoRl`?g-|B3k2UVU>z9@yg<$wHi07*54*}WWx~=JrW+2hwJT}K52lT;&lRW?4gQG& zwQRIgt`QA5YWH1HLpjPzL$SBpBsL+UES4msHXWk%xMv?I92l}Jfl4m=vE`v41ARzH zstY2B$_WOiDPI^k)eFwl>N(Xr2Pand!|pP?p2QZ_Blw3L{X>p6#3b)orQt1oCw7T> zNmp|xJB(9%UA(nOm-uKDiwvzIKhL$052Gf3Xte0BP$J~N%B-&T$z>0Y(#YBc@5jJ* zG9#^n+-6m~M1!1s?=(u0HHtq0yX*a}sh*i+))LaTk@UVq#z|rM9H5GhtsL82om`%Z z+z;~F?7js$oVBaAlJOYWu6m0-W}&3``6Wr%`*TjS(S|g8z5NXP72dTe=fe>FYkyA< zDS7O0Yh-s3zaM6+bK#*kY;qo#Q?4Ak--x!zqCp_stqggKE&bNL;|Hx94(1oray?bb z+kaxE5N<;4D+z~@fnoG}#XWSc=Nk-$0Ctq%qk-$gGVV%2I5xh^HIc7|VC6nm+7_YFZNpq0V;r;`)V1K0@VP z?`*U|kh4kn+tj>y`Li*~edxr`vU9o$g%Xlt2e!}wV4*ODhi`SUh?<>QE?^hp-c)QDn^1}0WnqFFB;Ztoqx3VZ5q;}K2_vZMaAQ~KlCUeVcYW> zj|x0TIUymfcIsAu6C6Go;I<=91%|a-G?|3_E_mqt-&}x|0!K~Hs2T8#T**as{Oiow_MK-_S)CWod3xsrGx~# zd4F$sdQ!3=2PU%Xii$9F4uC_(e|pAivCeilhgl5UOer4v%zV2(3?~d=G9z=z%Cjw! ztNmi{NwA=2@MvA$puAFbF!U(`STY=Rm@|yZILXkJb&-}k4lCd13N_2an#tqj28@5~ zzsVh5Yz+X{_)Sq?Z5Y%8J2rgTnzFtyZ)o4#No~uHCQoQxVUJ2JS$3*J=C}R9)|ky~ zf%<6Gy9JMz#DM@Q`yB!8@=BTWR->T_WMOp=eJ3_8+3c=FlljSk5?{xEWM=+gTq{{| zo_ugwC+vuADB+La8g_)eT2C)oNH1Yt1<0TG`IqQGg!seCP3qlP<{vqAI>nYN!(=e6 zakv-fwbdPm-^&u&D&zJPer`l`PibDsbH4nAD?ykgqh{H=y@ZDM{4?Xk+M~kDQxC+h zfH_8&n#)RW0>U6zpt7cXJwiXrs&VX-eJwAvk$1hWOCn`zftFMqA`Syn}QnBAzh!ZSU`LOf>D)rE@AEk7miou?}!LUO0h`$@9_|CvOVQs6>?dC_TAO~Oa zR<3F}OVPk!trY)FDoSe`RyKuu0M_FBptw1K{X>u*0xnsszhXa{ZtlCKZo9K}f1`Y+ z!LDA?ex(~xDE@S=Nz>MuKbt*JZf2AP-&^&G3)S{8R^QKVV08JJt%jTI0|sTR_EfQSd5 z+vi9YKkMioP1kP36p1T5@-7mG2_V!O7K>NPt=8IUPJx)kxJAk^wydQnrq zb6~(?#%FUj!5R3)y3*%xD|Y{0kQf}l>EJZbHLS!(9yGkw2Xq2L_kh1WvSKL_^j4vN zbzdf%>NNF24l~8rm5QL<=88SV$L+&m1}J+Gs*AQIZ%_ zzERhfr`l3?J={5nq`Wz{6UEnw2(Y9rUmm;K4+GD^!fS-*>cHf;7N)R{(&mA>-Gd~a zep)k=GZY^x#H_U=Sl98$VHg!KW>^j7_RJ5Y%{u-%#%s~1>$~Fw=XT$OV8??PfCKFF z0Z@V8noDMPaC={?_~1YMCL`;E`beXc_xwV9>~Z1k5-rD4f5aEL-H$4*TXQL8;0a_O^M@hyu{gqA^<@z2IhZg1brhqe@;{;XKt2HKO*if;Hrn$xr$^5yXM90wugs1Q%5 zFN*jdc%`GKtmTeq2LI62!R@Iwxfu|}^QLdAXT=Zis%5vtywcS8;cHsA_hc-`cuWZL z*%xmd=*D8NKL6p^4r<7${I~!7^NU@8vy3yaZDi5yYGPfqa^B(I8e0#|zOlo83fp7@ z0CtbwU9j1ME zhctVsxgjE}6wR%Tu2FpWEobKyy5Wj|+QNWmr>_wDbpb@4H?<^-U@Xea>Hf8jY14;A zI_91QTqqP8N@eG3tRYjLJpG9Ar3%&Vb%Eq11A&%`I;&!pEbVZ^IRnRdz3D1FJ?qI) zv1&m+4l29T8df{*vy`|i0z5C{}j7U6HN#~UATMYVhgIUoPpD%ofYnLI_k`JaT z^&X7yiixxpJb{ZEF3n%#=cw7y3cQZ0;0WwPvjt*C>lQy%j;8DBL8|tI6Veu$9*1M5 zsMftbYujHHAy14ydE{J8sWOyHnVLV(3l)u(`xF}N6r;8jJ1n{HD=aqGj)W zQgMrrA%rG%CppdZG>gjaxy0)IHnf`NyB&MqBJnB!DYe@NnF`wXtDOEyvErzACq7}H z%SO=WhT~Eag7V>9Q$n{XigYhlpl-ECX#37N4CjLE@3u$xYi_f{I)eczG8R;JOW^Rj zfe1s$E`JBkFo0mt94kPB(sM@ccRb|@%<|_?el3bcg2bZwSJ#hR_S<=5`;1uGo-OI# zT{7Wk;G{xUQ&)=sibcbxqUW{FwRtRT-hH?metP{j6}s9uLQepLL=DfqCk<7H*wj~S zY%5t`cjR5$AKR*qf?YFKw9-Fn!S8yZRp*#Rn|k6t<2gicTbUimS^h3h&kwtsTfu*6 zuxTQJYcjQHY*DB*^x}i9^R5hM!)cH7%9mF-jf#OU`~AvdS%zp?3GQG1vX}T%m3#om_mr`hl&6)_*6!r1 zy0+yjaxXJ4p%n~~L}z1&iMhwIaOMnZRj8Vn-Rbr>%0#wO>>+tGE*CqyCL1$JU~B_- z+sl<{rFv03j#a8{K?=HLrEWXwA19ZUt-RMV)>CAwPeEbVn$cOdG1xjlX?}8W9sAGGHanB=TMN# z5qy%140J8@J{&c!l6|~3GR;YLsYjTm$9F!pmCvBgg3Ci@-3EzlQRIdHtGw<&o)VNU zW2l3yPSo{JbOZ2+p$&b#fa$R6=+hao8cLY~+1iJsLh?cLF<)yUP5&<#vOl_STgXEG zVjBOZvy2qi3@z&9H&Wl-lir>M&N9q5;A?AH{FRP-52{3ES63lvO3G01z#grusiN&! zUuYKNFN{Qa^=zbRz{)DK^S*5g{%nh&swI zyZMTiflrh{>%%=!!+!IKb+57^kVsb6nkSU$8Ts_P_#}d{X^79dB|#nUJ9Tufno{^H$p|)qSo|ot}Y(nh@aFC7_n8 znd^0)FzAHlm~|>$yl7+FT!jnDF&=s{UN6={z+ET}AvW-SCtfji2q*!Q;*cx59}PZA zjoDA-q^*O6JZw4r(E^p(lRl0j(&UhYAs3CMys0ETNr%b6Sjhi z84i>x-^CCJ1ipF)l+4c~1d8}GQ*=p4uT+UV+0f#YuUeMW@@BNAjodXnH!Q9N3fS^y zQ;-i8CzmhquHIdruGJM#+wtZ$Xp7Wc6OqD=O0EdFNDco})E_j#hnmmYouiZc8%3t$?l=#0y}Ohn{n-IF5+J|3$8cl>=%T60^55+M zG&DO;;-)w=jg`j^j`rm0*F(j$&3q2C$DG-tcFF2&dS#qw{%&t5t0KmGV)fXEq@7Nu z+e)0~Va((tu4c;ZPi@0@gJQ&N4o+$uC)Wr^XD$ z?~#axb9!#%C3|+N?mcQ)K;JO>u1V!uiDI!i7N}(ERMoKeZoCfR_et&VNe&J#KWy>0 zR_r)EX6I%Nn%|9dV4qB-<8BFlx_e};MEX(o=?4*%%j&rd7Lrgn=90$#Y+V}yrL_|f z@4J*O0Nx|o;TKY$2<)j^h>)esuE-cdJg(ZmSUDI~^FA^}-1kLjBk}V80%6X*c-7!$ zHM8+$t3-`UW~twN0SEH4jSi{bXc}H4?ZcL$A&}!0%D75~MnUyp7(_a>vwOuMWd1Y( zUf|BL62!Y9>oCOr){RZlYgw}^j(uiGB&==Z<8}{+!K>?J_~|H8x4l6aGWIqrbx?7C zh6Q#a>y2NasRS(s2Xya}X0lJtCHRo&3B%-FFZr<@4FCnWnWvZx- zBLyq#a>^=Yg11W9zfoav{DTBJm;&pK>7Qg{JaxPE+w|cF?la`*SOqczKSx{?aBk$+ z?KHOlLK>|lm75GjBI!F3enSi>DGvGCew%VS>9r8j`Bl{W7A_u+-$VCu@z2N?m08Q2 zHnUuv@~2wDZJz6&Ryq5fd$079FZz-uT*UXv7CKoQtqf#8*!6ChC2KD%^nF|T1O8K2 za$ua(;pH2%8#dF(@Q>(273<%EP)H)1Ix`Evng_@3a9;TOFO&DnV(JKFT1nNK{cN05 zB4V($?$A9Rg|YrToXp<(?4DmV0=}Q061Va|Bx3@he8NUE(Md7=IIpjZab# zC0^tTfb3~4AL~swsp4s>;}Y@p?rrT>XPQ^PR=PA%>sR|)mC$$M zR04t{cF zTYg?~JM7|S#-m?o)B=w@?XH>et=S6SW4Q&dbzz)OEGZ_abtT?DN8aYS-GxxW*RQ|7 zT+{(&0z`hnecPP&I5@ceH)YVd_YiZ3{8Ug#Uz9Iogx|13iDp=NzuCN)o;JRp5gcjh z6_Cm!T++j%a%r%2z&;Jfl`~zh^S$b%VP~RrvMU;~@RLPbBAouy#&(bOw4V2mhFYc> zR7XFS85br|V)D$+HYVm-XjO26ysC8mG%{utA+MgwOty;qUOG^ji9&DYW#E{u`@PfNyWrFINrIcbPXs1b# z1??=m3NN>ocSBAziBwJbbwh#DZT4U7a_Y$VyRaE#`?apjnxDK)?}yB1eR-%5dD6^W z5VX;EBr6RztmpbmN;f?Wt66bSVSw98$21dOGYs6{{8W~5S?2?V^d|`a`?SFY+ZmKq zIo|S+>~8(ND&gPsN#7LQ98u^s3!E4;&9gyyMBq4|9IRPMz8I0d-GouWPBbp6UC40bYs5%rWPd&qlc-CGN7bpZt*~QSD~`ip6NmuuDV* z9)&&oFRrIiDRk_%?le*l?8uN1V-Ldilwdb!tH9f9ksR~<0M%g1LKnH4JD<>oV(@*S z|LNhF82IMQC6o1LK07e!6|%YC{+zt!eekl#QN1>54F!aIpO}T}q|0u{EzR>!{xf50sdHO?r`XOPeqO7dQ_$4y zG2xO_(T~}4jSt%uI-%y3n5q}^Au*|tp&0*m<@=|_rMdvpw@>R`x`CM|iY}e2LKjWQ z@v~$htNzj#V36PTK?cHsQ{iOf@!)cZ_nnj#u7a~8O3@$>!p#0)M`evy6_MqJ+f37T zSgjRZo>EPfzzrZx)3tMg$-!__F7DoXp-dZ^Rppw3-WJ22u>bL6pC)DZ)jqnIpgHJx z%6e1WR9u%Djf;h`@4^9x*V=bJEv^=yrTxV*=P5nsUk3c}PU@jYqt}SVWyU|`kec(^ z@G`V&#d2K4*a^L#&Tvq1hSH^ zaf6YA$k}{PM##H+A?aA#6>oPsmQOHE(z$Kq=Y>N1lpwrxW z0lwwC-gdH2?Q?>pUK(^uv9G-!-L>PHz>*yo)qI`VEy#nP5i^|@6z1`dP^CA0DqwnswZ8enfB4Mtg(N)D<)3r7wy&}DSWiYZ@*irlB z^+jFbqAVh2ZG%K&<*-1p zkUIFIXnQaz1Ut$Z$E+qJGVI+#J=@@8A%r>$(hQUqY(9KTIoyu#N?e!{Rx^2Qm1f#; zJjdyI>&4#1?%eu2cLx!ogx+DY)p6gqv8)EpLwsKT)*j;-;{>^P3ENmN_>=#u_73M zXXqa$kvF?C;rN5fP)ZR%i|;`R-6E;%tML)HslN^>@bHt;|AMw@p-gKgholhI7YE^* z%*w!~&?Z}27XumI8mALvJTs}Taw5Eo+GXbueeLF~?3dksJ4A4C%yX+es=u+n27u>~mfvt&=IqIrxA1YKjMyJT zNk_<LcW~?Sbxc%97-PVd)o%_!1Sp}l{zt3<1SX@xT`$Lp2*q?=EezGW{?x+ zZeITx@I5zf` zv&8mHCx%CQx4e$VhFjg+&>2m6=L2IkE+pKV^$hCtfY4TJY!5-qtu3Ymuc#h@a?XqB zhh{|-U^API;XP!3U$;$MSELu}gGt)g$-$fGT?1CyFNikVjfRb}?Y9va6(g;VzKz*2 z@G0W368$b*L0iV&`&>Z>TWt(a9sb`?+E^O3#%!Ho+&}%kr;yhj4L&E~B09>B%oWl9ubUdTHy z$lpTmn#~%Q&-6%Fv9(f&M?LcQ3}4)0-9dP9lTKjZUQ&NYr&*hJQ-W?x8}ayAij@~R zeNr(9sRh<3G~_~DbUTxrHNjJb!NdWL$127%U|i}YfPkH zL|CtzIlc!Kb$!FN4X!7l=w5#uM*qUpHPd`TR>KeMF@=YmE)HJ~4S@t%i#U ztj{$syQudyv1K%m5Ib+l`xQ2qaMPGwR{X?{|w^kZHULaBv&Jk%yyt?4g zi)dlzI&zrGNNu-IM&>cPg-cIWm}#;Z@*&7jlSBy_%wb8+`Aycb*h1|uHs zyxupLog+e`p59D^ddtnwv^{#3Zb~X4^#SFR?rT}ecKtGK&=k>lOpk0b684uKr~FlmN^uYAzADOvtUcw zPCx;Tht|R0?Z|M{{Yy>*$j0keUqooALUH2NmeKSIdrEcN z8x{~g{lTPBEQ%L7yTtAxDkE=Pps2OC5O{jWgtE_x4jrYNxodEc2fq z@E6E~-np^QZeS;^b>{2Ur^p2ZKADS_KmwwluUNdLd}E> zsSZh3DzRxFMRpEYzs$~{WO=#w`$M5cygYx$oPYKH+L}%BaP`W$zN&V0(rE z7FhdusZ5B0oVa&~LjB2OBPaQm$!~MQ%f&f;#Q%iE$xWZLEZBG$7xzT)4P5HU`j~Th zk~8`)m>iL=oHDPq#>(K!E9*!?s>1ntYry>ORHV6TYKUB_#$&M*XCzg>xUor*-q@G{ z|D{U3>!#BYowNp~A8zaM-`~~y^{?$gy)*1vu8S!oV zE4SgUIZfMns%mYw@Kea8@LfT}X(bp4@&%UCH%!x{;k3P@=oBMi2&rNg*x`;;5&6mK zLi*4>ZovO_iyng+N(Bt^y-qWQ%SH)A^|F)pLir%w2Vchd=Ts`%ukLV1D z7MyC+2wXP^_iCm(m2axlb2lfWFnW46j#nc?0-_Ti1-^$=ce-fQs$AcANd{`_UgHBo z&nJMR=^}HhWSB-n)S(r98mrZWcmMEO7cxB1`yq`Ic>C@>ppBeciuYn-lboT=HLjHW zI6M_}`}`Jy^0VS&8j03>koG2Vw(9<#TlxhU3ATka zi*+%7!XrK~MF~@JR*_r{*HNoSh(CNj$P?#FjH0HFa&93Fp>&ttFR+VYb;(qcw7G^&3S?s)A znF$PuBYU-3u-yL5KH>vY&-Rwyf3Yg1VkP8@6Q`yO@lB$=kq}=dhKYL6U}}@AO*Z^Y zb_R43{;w7BJbhAI{_PNbC!5?0RZqnihIJbGEyh8df#GYPzhf$I3D`kn)Aj1U{6*tm zFHc-yMh5<}i)UY{`lsHf+5rb&js4|P|6K(~C(*b(+{zj1iv;pzeon^eRN~ynrAG*V zXLUoX5oHSHWu1p+ZHZoG_fwOw6q9Thz(oQBCU%C@^G4xDfI`6urKj<^})pjv-HlR<^OV|IoX7!bp>1+s}G(JEp=6 zYbJ&(pN*Y*cYghUeuP5s_BTeaFRd%6trJ9SXlI4AoKi}jZ+**VFY$q;UZsFcFhon08a!(m81V6?8(Lf_;SaPw#)kgx;YP20wn{ z_@r!{dZ z-;>!9`Y8OzKGB8Mvs}jo{gFXS($DY|^mgxGW1RST5(jKzsCo5cHtg-@gQzL(FKnIs z``ISKBrC-iO8}9 zLS=xUQ_8j#c_hrr4aWYV1dlV;G(+BMjT(NcGpVlTy!P6*heAgLm-W%G#smwrK9}>` zTSz6`C;Xjc^{XMrkL2h-fKN7k+L+qJDR+#(PpEz`P7+oNXJ~Z z7veDLD$*-nyrFJek!TR8<@sK+d!Md1jp0L2v+KE^UGt+tar-Zc-C-OU>=l}Guis4c z*b2TSy9eJ%FRi%~7^AwxL4DRS%37k5)j_o$vFjt$pa#zih2bq}en(F|b;{6XGi-9R za*9!qP-9#1X)P4zL9{E$Wni{duHZ*Mj6OQ|^k=OF$(9dM^__ZqmbNSDgp<7;j}8a^ zo%Ppxfq8dOSRjk=hwcXOydK+1Sq@)ppU3!zZdu0J9r4xmc+e8jlI=rJKpnd0F0Y|Y zni zq$*V&eVWSFcvK{=(p&AnWa-r_KuY;Sm^7u(E5*s!O9r^%McDEe2L{tMmFEeGdo`nwY1s`p4o z7Sc+Blk|5XQG)gY7(h_J!)W@;dwt)&mmgMS5hlczD>4a{z15??|FcM5)3b&Cx$-+Q zXmBg;ix6F@1_d9Dj^2vgp7;BnLv7YPBOiOK(lc+PCeTEPcuL;?2o8!T50?qgxj-V7 zSt_)q)lfGdF-t?6%B>mD0%M~a7U;sXHG|s7mI{3Fi<$o}`ej~UoUQ&$Ns4Q|yoZd~ zle#YyF9YqY)R>L*n-T;7UwJo15GOR4fH^QV{`yrj9@7_|Bzj&Asq^wo#| zeEA~Jp;!+u7yeUr0b0}_eQw;6UT?3s@OOChuWI*FRNxZwf{i*~1itZYTyka2R3$mv zL6a0MLO(f6PyNuqrw-o|uX^|&EdE!UpRWri#7qF^<dBfcmY{ZhFPd zPg=+mW4!3Mpr7$iBM$yDuU6-oCuBu^_@Ly&Wt~~|DSGtv7nS;Ni%ve514cuAIzgNn{RrxUU+W$8g@~hq#h)_0#&O>vL z`E{Q*>TOzd`2+#zJL1`T`ycJ{$IDWm-%O%`dsi$)Or@i39+Yu(IMgA`7qWOiHAFq# zwuh?U{HHd3rrgiw_*>uit2jKeZ~eHQR+Yv&fh3mg$t>)+8`XFz-hT040x2j|uH~%e z-&}8cRcoFTVVq~eby?QQt<7A+0)Q)5XstDu2G%2_{>3vCwd1#1@77tAxzU=A=1)9i z4CYl>k*T;?PL$C~a>L5_DNpQFS8@r5(RWIR)$mRg)G&z5rHWZ`-3{yX(h3jhu<4(3 zEptu#(8R~8p&Qd#EX1jnva2yA-Y6m@A}(0)YEBR|?(yBa-!pZ^L)}(*=|gweZ zijRs9SQE)|5vJ57fU08KyWtemgHG)>)mV@3Bwpv=;kJN7U7JGYc0Yv32~LG0Ptek6 za$aM|-1fvkYWJ0PyHVDB@?otJc#b1n$S7+y2rioML6e%CqG22IU14=sz;FgYwO*zY zW4QEPebZNM$&x8mBL=CYVK--Ny|TJq-<6C4Ho2ihV*_nRB1hB7JNZ((UkT02WEU%T zJCwGYActvErizyzolB*I6hLgY)7DN}IS*nB#o@b8N7EA#O&YfIaf(h_KT`KqQA4+! zVuVzQY%CQ(LpIwW^y%jpH0N?+7^Tq^S)+?J(0XrXup)w=FNI|q4$@(+l7 zcjEhungQkQ(slu>Q@}yCj8RtiQvBkwUI3lmatgP9WGC+YQ68CMJ~!QoIK$h|1o1>Z zKZm&lU3u*;TGD+NBSkQE+p_!IftYAl9nD-_cn!F}ft>dkLG}>ARQ)iKIhe4;JH79& zuo|$n9;3~0hLgm*T7{)Y?ax5}u)X^2GAk3?^1GUE z4f#DdNSlSWSjQWLa&pEWN~AR<&#;f^{QVz_&ZhLryf~!b)j{_9a!gL&M9oYTM zum5WyeIa%+de-+uB;0eVQ1J2e3A;H~542%Eq3tqXfX2Qf{nMN53n$;-OtQYdJ5_a% z67cy=I_%-fV6pYNnG@QR%F-n^z9Mx{>e!Df<6rcqG1z-|)aB`xLXteL+3_?Ovt{3zn)fTD+m4%nBTxI?*J5H@ZCe;UuR~^WD^cX@b`p z#_!cs1!y?PcU6|SS9|&Y+$bz|#lI-1V@e^*RY;eYCs_=~0zpM4*s0I6>gJr`|NJ0_ zM}yZF^V_}Sk>$qft(j@U%wl+|MIXtyhoart-mI_FmZ8d z1I*R#Yi;?pFVxL(0 z5A(bxyek!dP^)r^VvN8@eIn_*M7BD=DnCVdd5??|EWzEf_ z=VUJf?i3_9Rp#et=bhpw{qKPf3e_rb7~6!FH~+@#*Qaj(K96G38QAFi+2ng1mBE&f z>&7c+<8K9@B;}v}!%JttGNe}7q*7JL$9XAZmp^`f6N;hdyTl=8RHyHG!SCYBq61ZP z%pYShM~M83xD%gXlJlUs2xYb_Gp`OAnrfGDDi_Qh6LhPrWf@=LOm#0p*g2G4vsStbQQa zi@$xX)k@S!E28tf{?+%X(R7$Lo4Rd~pI~x#bB^3-`lIkrRs&fD*T@i3z-3IZl^)vk z)nsD#wQyX1i5q#_savjOcbgMAjeotYku2M3Ft!N=9w*6E=MdV7RD_AWjQgEfPsZ_t z?sr<@Q`AMLkr-P+)gf8K7uUD1Lvg4PiA@EQS}jqH>VYF4Zg#Vn3@<)1F;m@k)xaBuxt?U+D&pK=Q>70 z>l*JJ05mEDBg5g=6vAz8(uuP{XH;PX9-k>03^0Ks)ASE@ONSk<*#NK1pl_15Jy={* zorZ}#QWBkGP6bo*2=~Lnz;m5-uD|3tE$OZbS(wkkz~x)02EzScUh$n+L4!&*k%azuvF+>-{VS^PAGTsqH?AIqHsU z-C|a@_MS)5zIY!>ef3E?{72>OaH1 zYEMy%hC(6k&%< z(diOc{WI8*Z!=#B*peKfQHYu{?6yk!EeA%4NzPz%xupC znLT$E`D3^1pNPf)=bF$8&t?wo|`hUkkIYZ4E*CT|k zvB0+8=$9Elm0Y(#iHSi9>;nJ)u>%_h?wVqShi_X?Nms_-9n-$O{T629Lr=%XoQjsN zt(Iv1rIpM_XaC*BQ)^Av?t2Bc0oM7TWR%c(v|IFjO!5KiP7e%SHScu@Yw+G59jJfD z`<;Aj@=)o%nKA;nuxHW(n#ci#i7*Uj^R>q4tBJO{Ce;)Q4UJ1S(a^slz2Nm}xdpToPo)tF|t?uZ)ro;^e?C0>x zy)yzYBg_CP-02TfgjwAGP_7~g^#-baa)2aJS9n%BE^y4dYnXbY*1OZyEN-g$#L9UG zRSs{D{WeamE zdpjwIZ&oKHJY0#Y2EFiW(3|o`EG>o>o;BY$r~KBmQPjMc+r0bs3bV)hYl0H}JRD&1 zbujZdIYr0iy=Ae@X@4B(_)L7>e$MN3a>vMQ2Cn@Xip0qqHgP4qKd};g|1-`hYwzam zZw<*`>|75M4}8mXi3R#EGz6XdKF`xDJp1X> zN|w>y^*5H!RWjP%)Z`eSLO*p!9iLe^+;U8@KY} z7z}61tF@7MhH||Kh%ZypKFTBQk4;Uc7WWvr(0kP`e-obaEx0S?bIowp|Jb)0<$`9@ zya3Fa8UOhs{FL~w`e@_mWubj1xO{pcMSYL1^Gg_&OV9ogFLi; zhQ7H!Q4-}smk7U#wB@y?laRRRd;1j;gbJa(vtKqpuU4D{PNrV=-2&)dxg$@ z?yHT*rWpZ`6gkDS+AYz%dtDJSqj&4@q0rfKgCjwD!+X11eftA~jn3K5voU0I-4I)6 z)qif-m>th9iBv0DV}!A`QvGSUdqAbI+&7O4G3QJ$bCtkN8gEeqsTnVGrpzCj{CDMY zlV(${V5)B{_7?`|O-{#9Q=mmpd(3;@Uirg*Q})kIOrKcXYyZ7lx&MCTc#~3X+nl@& zE3gTjoT%q8vh!b|Lg)_PCPOF%oA?$|V;}WyLR+~n%Tn=D#irVcpJvbhpYQ3E)SR}d zPrK|^=gt4vwC8+&q6MkkrfYs49r1@U&dz)19qhBO_x>Za+)N~@D}9f_JbN-rw~@kI zeK~xE3wsRcL50bW|2B>8_NXNIu0Di-y8PXKomxOh4VY`VSy@Z*_@oGYG#Qg~hWzx#r(%v-BKc62-+j}?)ayoeq=NEI{}kLE*4xmjx5m>a|BJ_Of&!a1 zVz*)9=R|fn_MWA@jWEGnodu>O4^r7<>-28yk3auAeCC`{Dfz^H?YsJSMng`wIr?7$+|R?%2O6C zoAJQt+XNk$xo27$@q)aSsoMDON$5Y4y%oW-e!4N0S@7(gae-Oog71iMBIQi#WBXV3 z@Sw}*D)7b*5bwPucmMg&givOL$gR+uPRS={&peiU0qG;fkA+;l7ac5CtC$?}R{!aL zk{2QDi09QyWIz^s_u#V1K1~0vKOUXi_I8kSOK%f%{P+n>hKhy6@#tfUcmCPFkjLyG zdg6Pkc)KSV`n=yHq;ud6{_3on5SEOov44l{&Cd#}ybU>jYbvWF(skJAJ@v4J^$hvM zdw|t~We@zmH|h7P0iNZb=I-H_p#6g=^90vVx({rsE{p~aj)soUhm&-4pUK^}+gJ1Gg6-*(=bvBQpYE+*uH5>lHNN@g zL-Xs~52-$uO>s>5>)?gIZ(J?3zIoYuL+c+4aw3*$ zjO_ElBRB9Vs7<8D5!hNgLtF|*B&%CN5;H#xjn@1QJ3kkOx<)0Oed3aYsE~wJ;U=S` zEyXA;z1jpb6ZmT|1L-0P@{L^4NcAa#`!5mvBIccO*cRZ{;SX9&15ZlPRYtr zJ6#QHnhk+am>55Q|EYm^>UGTaQ4Je@RnEHBSh4H1_uikRe%#tIHU&WgclHB$f>g3p-(|Knyit3^E;^N-J||$t z2Ti(#k1JqGxE-^Ag#ObD@c043aH3{CgK%2Nl4P0t^|M$k7}tr*TMtc)y6q!S+9!G` z0s7z93KZ0O?+1q*2&)y+AAQi+mOGqS$N!MMf!mrO{UbIEtzU0&0Qp#@dTHu13CETf z{&*n(s<4?eXM~Dt`Bm9lTHp_>&F@*c-^-&qeTvC3l%K1&)^tF^j zG4n0_K6I#m?M4m}cVNuvk9?pK*F!MTm+Jzh)MHDqoC ze_%AuHBr#pq;uH|2QUI%qsjd|#>KaB?&~X0UxcsybD#MZJx$NuGgYqVrr%$y6H>db zs>f!&lDs>xy;7he-Kn}tZhe!YGy3JFMbn_BLox+^i{A4J{s*Tgzw!iE$7F1)@IEUv zZfszmgCK56yK^4XdV^v7FCN`-T@L$qMin;>VTKMNL~Tn&acN_915WY756;qk3pWJi zytioY^?nJAD(GNP@QseeO01ch)k$+vUhcSAW7+b;eYD_so1oa@3~%sJzv8VsZV3_C zDq9&51NB(2Tbckf_YqF3(-e02KuWtsb~;VZRfo3uEmh`jgnDe9%#~8y_o% zO-)c$V924F%bv0dJC=g=4*Pc@niGt$J}z6{R)vtBpY6*+w(s9Xdki02)&OlQ&hFm7 z&8ax4w%y2y=Y6 zvi=7n8RGNn)b*%^SDoJvYJqY`KuAI$N|rcXWRgpg^C>2d zELdyM^VpR~AO+f>p#vZQmr|0iF{(Ba1B2`F;~hLRd4IiFRq^Bubg^ zM4UokeX|GlK2ItGZ(hn898W?~s%7Y;2j@~in+y&pzjg867(H?`am)C43t@T|aTm4T z#)#Bm4dzwz04R4(v@Gi{o_!&Mmq78FC0huVTU_uS5Pw!H+BGY@TRb%m`HX$$Na}hs zVJ(C^rh`9L7%M?&!P7-~-&?A1$l zl)YSIDkQBnv$u8AfO+CQULqQi96A{oti`AS&3r=kY8%E=eA-a4YK!CM+V&PgC5Ey7 zrYlo59ywjsI!zjI=8pQFOGHJ|n3(Y-Jjv38rpNEK?C(c?0G)%>G_2*xpsgW=wXCTZ zB_=hj&!haDp@0(fJ~xu4IWoP-z4LW?$7|%d`?>5Nd2DV>4ga@NvTS90XKEliJ>fY8 z$v3JBJJtS(4=o&>AejbjINe>I_6qPn{$nM@Bsg{iiC!O}<+v-Par%o555o`(?FfAW zcc?5%p5WLJVL;Gl_1i#c8JR93pqw1H7PHAx{2U0s#!+Xk_5p{BEdAZCv<;`<$in&_ z0FAGCHvHGM>%2#)!Ve8sckSz{3>EXQWZ&pZYEGj6&&gwX zTBksTE;Xj@gMkM-ZCf0wk=lsp`hd6Zkzt(yqv z9VIQD)>i;4zg-q!OR*j1ufJp8`(P}vriYXy-)hteIoh#C4+QJ51Cu<~gIGB4&@o%G z0PZF}_@?tQYIO?a%7X;*bxhLzkkdM_J!!KL73h9RSA$!=lxq;Q4 zg4GT4)D!n>6klHK@UFOgjsil|x*BZ@>(G5LJQzLvnmJlb*T2IB!sd_Hi^4e2HXL>v z>iW4`?zKYj*I%>gykU>8bK2wYk0BQR(qXETusmspqBDZyF1EqgLqkE^C<#fGU8J2O zIg(yl?7)CcAmSzoNBck?=QVg)utJwyA2YIWx9k zraViw$I0yH!QZmhEKfS9`~q!=w^F`$`$Hc+10M$)&s7nX&!LG1tM&E=cq6dy)29vV z3jBtb@Eid=HMu`4Q>@A+pI;iPYrW7DYCCtr%PcIw;aYZhi;RR2w58U=Eq>(vS3ri zy)XCpJ7C4Z>GoCd)zab17pCj@Mb9{c(UNaXJ zZ%-B?k;MkMGv~y%clt>qvc- z9g#Nu4Y-JjbG{zy^Jpa;BKI8N`bu-|xtI4@)`;q3Qh&K{wb`t%b@80s*fjcH%7YOL zm`zEDJXPIhy;jGtq1BMmd*Wb+S(w6A2xJQZChXtkUzDkBDCaMo(w0d1Gw`w8SY?CN z$PF-a$@0ot_Le$Gu|T~KqX4DRLh7*!s4(-aj(Ul1o=;Xu0)V`;pO6fqZPsniH2^wo zM~FOaL#=^$DJacrl67pcwTzOHx2VqiBv~4dWEB(RkWyMyDgf6c<-n-M8gaZcwKZ5X z5G$p{;OHOO-(qGHBDR_Kx2(o|qNlGBO&72AIMuQZ%=@YqhioT$$0L2i$MG^SVqWsF zVj^8g&80!i*As-G?~k8{7G>(_0GvK=x-s{Gn+lOzwBCx`m)U%MtHiQ(5zd&^X4Y!8 zBCX(~Z^Te~0sKk#-llEJ76*^0;tU-|@a&W#9oO2g(T zT?EKA7=yLacuQ2|8dANYPAb~>sB9^6`aG2`M8QpxmMWp}{aRX7QjvlxfOb++3{8*a zTU-P_;uOM}#NP;n(x&DUsTC67b!RY7N_JhE03ZMRlxGVxc)_9PV?uA9uy8>vVf3cX zE$1JYo$d@tzE(gxX@xFIFG{zDnA`YlIhxp*K-wS>bZpN@zO6Ye6~Lp3o!{qi`w~F; zJR>mmW&iuB0tf^WTPhr#zd1a~8Vdg8J?(99>to*Q!feL_oC;0 zx5}V28Ez~p`^4X9dK%n)kk0hlu3tHXZW{5^$MJ%3@XP#tJ$oLHBS*Mxq|y& ztG{$A)j=J+Rt`i>OZcCS_tz2-Givcjtwu&NlqSmiNZ$>@)7Q7g)B~3s;Zo=Rmr-gu zrc_J=*QGov(42QLm^bbpB1SZ$e3;0~p@giBuf4C}m)4&6xxQlxp6Bk-E~hmkV^Sq!d^4hCK72$? ze`gv*xEU1JkX_;glhdxG9nzW>{XOrNU+S)h&e}UyqmFRHLuSK)<&Vj4sQi_&2R%g z!@1K+)0A81idOgj=JYErYG(u#HmmM>xODHD&(+j~$WTeu_1E?xeD9AFB*7N<=*><- zhb@}AL;!eipOqHuNl5>7%HbFX*39CW`jrKIMX?Z(#FH|M5L`X|$uDUG0~MJB6adXq ziSWicKgg)65G8>Jo<|UPIVvkvBc}=l(fLKxfv~ogLFdx0h0nP&FR=p+*Id`e7mk_y z3VCNuCB*tLd8=kkp_dwFg~c5HjyE-|(jVViUqcU0qoPlwET#XlH#T|INaF){J~V%;cHY{S9H!5s7BB{s;2@9=^V6gnkwx zYnDZgvdFt&o_q8Y_Gb6#z(-=!Mw)v-Y4T$QmC$-D!PEa6x28G|AmhP_D2hEe&`4n{ zwgEaq7)w@ve>RcSl8FmxHnZ7aRP6%t_%dB7I*C22-bXKsL#j0d7!c}dj@)`9s(;p? z)F⁢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 z℞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⋙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 literal 0 HcmV?d00001 diff --git a/imcat.c b/imcat.c new file mode 100644 index 0000000..b02b9cb --- /dev/null +++ b/imcat.c @@ -0,0 +1,134 @@ +#include +#include +#include +#include + +#define STB_IMAGE_IMPLEMENTATION +#include "stb_image.h" + +static int termw=0, termh=0; + +#define RESETALL "\x1b[0m" + + +static void print_image( int w, int h, unsigned char* data ) +{ + const int linesz = 16384; + char line[ linesz ]; + unsigned char* reader = data; + + for ( int y=0; y= imh ? imh-1 : ey; + int sx = cx-kernelradius; + sx = sx < 0 ? 0 : sx; + int ex = cx+kernelradius; + ex = ex >= imw ? imw-1 : ex; + for ( int yy = sy; yy <= ey; ++yy ) + for ( int xx = sx; xx <= ex; ++xx ) + { + unsigned char* reader = data + ( yy * imw * 4 ) + xx * 4; + acc[ 0 ] += reader[0]; + acc[ 1 ] += reader[1]; + acc[ 2 ] += reader[2]; + acc[ 3 ] += reader[3]; + numsamples++; + } + out[ y ][ x ][ 0 ] = acc[ 0 ] / numsamples; + out[ y ][ x ][ 1 ] = acc[ 1 ] / numsamples; + out[ y ][ x ][ 2 ] = acc[ 2 ] / numsamples; + out[ y ][ x ][ 3 ] = acc[ 3 ] / numsamples; + } + + stbi_image_free( data ); + data = 0; + + print_image( outw, outh, (unsigned char*) out ); + return 0; +} + + +int main( int argc, char* argv[] ) +{ + if ( argc == 1 || !strcmp( argv[1], "--help" ) ) + { + fprintf( stderr, "Usage: %s image [image2 .. imageN]\n", argv[0] ); + exit( 0 ); + } + + // Step 1: figure out the width and height of terminal. + FILE* f = popen( "stty size", "r" ); + if ( !f ) + { + fprintf( stderr, "%s: Failed to determine terminal size using stty.\n", argv[0] ); + exit( 1 ); + } + const int num = fscanf( f, "%d %d", &termh, &termw ); + assert( num == 2 ); + pclose( f ); + + fprintf( stderr, "Your terminal is size %dx%d\n", termw, termh ); + + for ( int i=1; i +#endif // STBI_NO_STDIO + +#define STBI_VERSION 1 + +enum +{ + STBI_default = 0, // only used for desired_channels + + STBI_grey = 1, + STBI_grey_alpha = 2, + STBI_rgb = 3, + STBI_rgb_alpha = 4 +}; + +typedef unsigned char stbi_uc; +typedef unsigned short stbi_us; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef STB_IMAGE_STATIC +#define STBIDEF static +#else +#define STBIDEF extern +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// PRIMARY API - works on images of any type +// + +// +// load image by filename, open file, or memory buffer +// + +typedef struct +{ + int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read + void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative + int (*eof) (void *user); // returns nonzero if we are at end of file/data +} stbi_io_callbacks; + +//////////////////////////////////// +// +// 8-bits-per-channel interface +// + +STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +// for stbi_load_from_file, file pointer is left pointing immediately after image +#endif + +//////////////////////////////////// +// +// 16-bits-per-channel interface +// + +STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +#endif + +//////////////////////////////////// +// +// float-per-channel interface +// +#ifndef STBI_NO_LINEAR + STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + + #ifndef STBI_NO_STDIO + STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); + #endif +#endif + +#ifndef STBI_NO_HDR + STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); + STBIDEF void stbi_hdr_to_ldr_scale(float scale); +#endif // STBI_NO_HDR + +#ifndef STBI_NO_LINEAR + STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); + STBIDEF void stbi_ldr_to_hdr_scale(float scale); +#endif // STBI_NO_LINEAR + +// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename); +STBIDEF int stbi_is_hdr_from_file(FILE *f); +#endif // STBI_NO_STDIO + + +// get a VERY brief reason for failure +// NOT THREADSAFE +STBIDEF const char *stbi_failure_reason (void); + +// free the loaded image -- this is just free() +STBIDEF void stbi_image_free (void *retval_from_stbi_load); + +// get image dimensions & components without fully decoding +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); + +#endif + + + +// for image formats that explicitly notate that they have premultiplied alpha, +// we just return the colors as stored in the file. set this flag to force +// unpremultiplication. results are undefined if the unpremultiply overflow. +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); + +// indicate whether we should process iphone images back to canonical format, +// or just pass them through "as-is" +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); + +// flip the image vertically, so the first pixel in the output array is the bottom left +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); + +// ZLIB client - used by PNG, available for other purposes + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); +STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + +STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + + +#ifdef __cplusplus +} +#endif + +// +// +//// end header file ///////////////////////////////////////////////////// +#endif // STBI_INCLUDE_STB_IMAGE_H + +#ifdef STB_IMAGE_IMPLEMENTATION + +#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ + || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ + || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ + || defined(STBI_ONLY_ZLIB) + #ifndef STBI_ONLY_JPEG + #define STBI_NO_JPEG + #endif + #ifndef STBI_ONLY_PNG + #define STBI_NO_PNG + #endif + #ifndef STBI_ONLY_BMP + #define STBI_NO_BMP + #endif + #ifndef STBI_ONLY_PSD + #define STBI_NO_PSD + #endif + #ifndef STBI_ONLY_TGA + #define STBI_NO_TGA + #endif + #ifndef STBI_ONLY_GIF + #define STBI_NO_GIF + #endif + #ifndef STBI_ONLY_HDR + #define STBI_NO_HDR + #endif + #ifndef STBI_ONLY_PIC + #define STBI_NO_PIC + #endif + #ifndef STBI_ONLY_PNM + #define STBI_NO_PNM + #endif +#endif + +#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) +#define STBI_NO_ZLIB +#endif + + +#include +#include // ptrdiff_t on osx +#include +#include +#include + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +#include // ldexp +#endif + +#ifndef STBI_NO_STDIO +#include +#endif + +#ifndef STBI_ASSERT +#include +#define STBI_ASSERT(x) assert(x) +#endif + + +#ifndef _MSC_VER + #ifdef __cplusplus + #define stbi_inline inline + #else + #define stbi_inline + #endif +#else + #define stbi_inline __forceinline +#endif + + +#ifdef _MSC_VER +typedef unsigned short stbi__uint16; +typedef signed short stbi__int16; +typedef unsigned int stbi__uint32; +typedef signed int stbi__int32; +#else +#include +typedef uint16_t stbi__uint16; +typedef int16_t stbi__int16; +typedef uint32_t stbi__uint32; +typedef int32_t stbi__int32; +#endif + +// should produce compiler error if size is wrong +typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; + +#ifdef _MSC_VER +#define STBI_NOTUSED(v) (void)(v) +#else +#define STBI_NOTUSED(v) (void)sizeof(v) +#endif + +#ifdef _MSC_VER +#define STBI_HAS_LROTL +#endif + +#ifdef STBI_HAS_LROTL + #define stbi_lrot(x,y) _lrotl(x,y) +#else + #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) +#endif + +#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) +// ok +#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) +// ok +#else +#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." +#endif + +#ifndef STBI_MALLOC +#define STBI_MALLOC(sz) malloc(sz) +#define STBI_REALLOC(p,newsz) realloc(p,newsz) +#define STBI_FREE(p) free(p) +#endif + +#ifndef STBI_REALLOC_SIZED +#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) +#endif + +// x86/x64 detection +#if defined(__x86_64__) || defined(_M_X64) +#define STBI__X64_TARGET +#elif defined(__i386) || defined(_M_IX86) +#define STBI__X86_TARGET +#endif + +#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) +// gcc doesn't support sse2 intrinsics unless you compile with -msse2, +// which in turn means it gets to use SSE2 everywhere. This is unfortunate, +// but previous attempts to provide the SSE2 functions with runtime +// detection caused numerous issues. The way architecture extensions are +// exposed in GCC/Clang is, sadly, not really suited for one-file libs. +// New behavior: if compiled with -msse2, we use SSE2 without any +// detection; if not, we don't use it at all. +#define STBI_NO_SIMD +#endif + +#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) +// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET +// +// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the +// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. +// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not +// simultaneously enabling "-mstackrealign". +// +// See https://github.com/nothings/stb/issues/81 for more information. +// +// So default to no SSE2 on 32-bit MinGW. If you've read this far and added +// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. +#define STBI_NO_SIMD +#endif + +#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) +# define STBI_SSE2 +# include + +# ifdef _MSC_VER + +# if _MSC_VER >= 1400 // not VC6 +# include // __cpuid +static int stbi__cpuid3(void) +{ + int info[4]; + __cpuid(info,1); + return info[3]; +} +# else +static int stbi__cpuid3(void) +{ + int res; + __asm { + mov eax,1 + cpuid + mov res,edx + } + return res; +} +# endif + +# define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name + +# ifndef STBI_NO_JPEG +static int stbi__sse2_available(void) +{ + int info3 = stbi__cpuid3(); + return ((info3 >> 26) & 1) != 0; +} +# endif +# else // assume GCC-style if not VC++ +# define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) +# ifndef STBI_NO_JPEG +static int stbi__sse2_available(void) +{ + // If we're even attempting to compile this on GCC/Clang, that means + // -msse2 is on, which means the compiler is allowed to use SSE2 + // instructions at will, and so are we. + return 1; +} +# endif +# endif +#endif + +// ARM NEON +#if defined(STBI_NO_SIMD) && defined(STBI_NEON) +#undef STBI_NEON +#endif + +#ifdef STBI_NEON +#include +// assume GCC or Clang on ARM targets +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) +#endif + +#ifndef STBI_SIMD_ALIGN +#define STBI_SIMD_ALIGN(type, name) type name +#endif + +/////////////////////////////////////////////// +// +// stbi__context struct and start_xxx functions + +// stbi__context structure is our basic context used by all images, so it +// contains all the IO context, plus some basic image information +typedef struct +{ + stbi__uint32 img_x, img_y; + int img_n, img_out_n; + + stbi_io_callbacks io; + void *io_user_data; + + int read_from_callbacks; + int buflen; + stbi_uc buffer_start[128]; + + stbi_uc *img_buffer, *img_buffer_end; + stbi_uc *img_buffer_original, *img_buffer_original_end; +} stbi__context; + + +static void stbi__refill_buffer(stbi__context *s); + +// initialize a memory-decode context +static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len) +{ + s->io.read = NULL; + s->read_from_callbacks = 0; + s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; + s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len; +} + +// initialize a callback-based context +static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user) +{ + s->io = *c; + s->io_user_data = user; + s->buflen = sizeof(s->buffer_start); + s->read_from_callbacks = 1; + s->img_buffer_original = s->buffer_start; + stbi__refill_buffer(s); + s->img_buffer_original_end = s->img_buffer_end; +} + +#ifndef STBI_NO_STDIO + +static int stbi__stdio_read(void *user, char *data, int size) +{ + return (int) fread(data,1,size,(FILE*) user); +} + +static void stbi__stdio_skip(void *user, int n) +{ + fseek((FILE*) user, n, SEEK_CUR); +} + +static int stbi__stdio_eof(void *user) +{ + return feof((FILE*) user); +} + +static stbi_io_callbacks stbi__stdio_callbacks = +{ + stbi__stdio_read, + stbi__stdio_skip, + stbi__stdio_eof, +}; + +static void stbi__start_file(stbi__context *s, FILE *f) +{ + stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f); +} + +//static void stop_file(stbi__context *s) { } + +#endif // !STBI_NO_STDIO + +static void stbi__rewind(stbi__context *s) +{ + // conceptually rewind SHOULD rewind to the beginning of the stream, + // but we just rewind to the beginning of the initial buffer, because + // we only use it after doing 'test', which only ever looks at at most 92 bytes + s->img_buffer = s->img_buffer_original; + s->img_buffer_end = s->img_buffer_original_end; +} + +enum +{ + STBI_ORDER_RGB, + STBI_ORDER_BGR +}; + +typedef struct +{ + int bits_per_channel; + int num_channels; + int channel_order; +} stbi__result_info; + +#ifndef STBI_NO_JPEG +static int stbi__jpeg_test(stbi__context *s); +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNG +static int stbi__png_test(stbi__context *s); +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_BMP +static int stbi__bmp_test(stbi__context *s); +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_TGA +static int stbi__tga_test(stbi__context *s); +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s); +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc); +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_HDR +static int stbi__hdr_test(stbi__context *s); +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_test(stbi__context *s); +static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_GIF +static int stbi__gif_test(stbi__context *s); +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNM +static int stbi__pnm_test(stbi__context *s); +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +// this is not threadsafe +static const char *stbi__g_failure_reason; + +STBIDEF const char *stbi_failure_reason(void) +{ + return stbi__g_failure_reason; +} + +static int stbi__err(const char *str) +{ + stbi__g_failure_reason = str; + return 0; +} + +static void *stbi__malloc(size_t size) +{ + return STBI_MALLOC(size); +} + +// stb_image uses ints pervasively, including for offset calculations. +// therefore the largest decoded image size we can support with the +// current code, even on 64-bit targets, is INT_MAX. this is not a +// significant limitation for the intended use case. +// +// we do, however, need to make sure our size calculations don't +// overflow. hence a few helper functions for size calculations that +// multiply integers together, making sure that they're non-negative +// and no overflow occurs. + +// return 1 if the sum is valid, 0 on overflow. +// negative terms are considered invalid. +static int stbi__addsizes_valid(int a, int b) +{ + if (b < 0) return 0; + // now 0 <= b <= INT_MAX, hence also + // 0 <= INT_MAX - b <= INTMAX. + // And "a + b <= INT_MAX" (which might overflow) is the + // same as a <= INT_MAX - b (no overflow) + return a <= INT_MAX - b; +} + +// returns 1 if the product is valid, 0 on overflow. +// negative factors are considered invalid. +static int stbi__mul2sizes_valid(int a, int b) +{ + if (a < 0 || b < 0) return 0; + if (b == 0) return 1; // mul-by-0 is always safe + // portable way to check for no overflows in a*b + return a <= INT_MAX/b; +} + +// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow +static int stbi__mad2sizes_valid(int a, int b, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add); +} + +// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow +static int stbi__mad3sizes_valid(int a, int b, int c, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__addsizes_valid(a*b*c, add); +} + +// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow +static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add); +} + +// mallocs with size overflow checking +static void *stbi__malloc_mad2(int a, int b, int add) +{ + if (!stbi__mad2sizes_valid(a, b, add)) return NULL; + return stbi__malloc(a*b + add); +} + +static void *stbi__malloc_mad3(int a, int b, int c, int add) +{ + if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL; + return stbi__malloc(a*b*c + add); +} + +static void *stbi__malloc_mad4(int a, int b, int c, int d, int add) +{ + if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL; + return stbi__malloc(a*b*c*d + add); +} + +// stbi__err - error +// stbi__errpf - error returning pointer to float +// stbi__errpuc - error returning pointer to unsigned char + +#ifdef STBI_NO_FAILURE_STRINGS + #define stbi__err(x,y) 0 +#elif defined(STBI_FAILURE_USERMSG) + #define stbi__err(x,y) stbi__err(y) +#else + #define stbi__err(x,y) stbi__err(x) +#endif + +#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) +#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) + +STBIDEF void stbi_image_free(void *retval_from_stbi_load) +{ + STBI_FREE(retval_from_stbi_load); +} + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp); +#endif + +#ifndef STBI_NO_HDR +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp); +#endif + +static int stbi__vertically_flip_on_load = 0; + +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load = flag_true_if_should_flip; +} + +static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields + ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed + ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order + ri->num_channels = 0; + + #ifndef STBI_NO_JPEG + if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PNG + if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_BMP + if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_GIF + if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PSD + if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc); + #endif + #ifndef STBI_NO_PIC + if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PNM + if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri); + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri); + return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); + } + #endif + + #ifndef STBI_NO_TGA + // test tga last because it's a crappy test! + if (stbi__tga_test(s)) + return stbi__tga_load(s,x,y,comp,req_comp, ri); + #endif + + return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); +} + +static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi_uc *reduced; + + reduced = (stbi_uc *) stbi__malloc(img_len); + if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling + + STBI_FREE(orig); + return reduced; +} + +static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi__uint16 *enlarged; + + enlarged = (stbi__uint16 *) stbi__malloc(img_len*2); + if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff + + STBI_FREE(orig); + return enlarged; +} + +static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel) +{ + int row; + size_t bytes_per_row = (size_t)w * bytes_per_pixel; + stbi_uc temp[2048]; + stbi_uc *bytes = (stbi_uc *)image; + + for (row = 0; row < (h>>1); row++) { + stbi_uc *row0 = bytes + row*bytes_per_row; + stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row; + // swap row0 with row1 + size_t bytes_left = bytes_per_row; + while (bytes_left) { + size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp); + memcpy(temp, row0, bytes_copy); + memcpy(row0, row1, bytes_copy); + memcpy(row1, temp, bytes_copy); + row0 += bytes_copy; + row1 += bytes_copy; + bytes_left -= bytes_copy; + } + } +} + +static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8); + + if (result == NULL) + return NULL; + + if (ri.bits_per_channel != 8) { + STBI_ASSERT(ri.bits_per_channel == 16); + result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 8; + } + + // @TODO: move stbi__convert_format to here + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc)); + } + + return (unsigned char *) result; +} + +static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16); + + if (result == NULL) + return NULL; + + if (ri.bits_per_channel != 16) { + STBI_ASSERT(ri.bits_per_channel == 8); + result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 16; + } + + // @TODO: move stbi__convert_format16 to here + // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16)); + } + + return (stbi__uint16 *) result; +} + +#ifndef STBI_NO_HDR +static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp) +{ + if (stbi__vertically_flip_on_load && result != NULL) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(float)); + } +} +#endif + +#ifndef STBI_NO_STDIO + +static FILE *stbi__fopen(char const *filename, char const *mode) +{ + FILE *f; +#if defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != fopen_s(&f, filename, mode)) + f=0; +#else + f = fopen(filename, mode); +#endif + return f; +} + + +STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + unsigned char *result; + if (!f) return stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__uint16 *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + stbi__uint16 *result; + if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file_16(f,x,y,comp,req_comp); + fclose(f); + return result; +} + + +#endif //!STBI_NO_STDIO + +STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_LINEAR +static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *data; + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + stbi__result_info ri; + float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri); + if (hdr_data) + stbi__float_postprocess(hdr_data,x,y,comp,req_comp); + return hdr_data; + } + #endif + data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp); + if (data) + return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); + return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); +} + +STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_STDIO +STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + float *result; + FILE *f = stbi__fopen(filename, "rb"); + if (!f) return stbi__errpf("can't fopen", "Unable to open file"); + result = stbi_loadf_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_file(&s,f); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} +#endif // !STBI_NO_STDIO + +#endif // !STBI_NO_LINEAR + +// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is +// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always +// reports false! + +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(buffer); + STBI_NOTUSED(len); + return 0; + #endif +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result=0; + if (f) { + result = stbi_is_hdr_from_file(f); + fclose(f); + } + return result; +} + +STBIDEF int stbi_is_hdr_from_file(FILE *f) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_file(&s,f); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(f); + return 0; + #endif +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(clbk); + STBI_NOTUSED(user); + return 0; + #endif +} + +#ifndef STBI_NO_LINEAR +static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f; + +STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } +STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } +#endif + +static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; + +STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } +STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } + + +////////////////////////////////////////////////////////////////////////////// +// +// Common code used by all image loaders +// + +enum +{ + STBI__SCAN_load=0, + STBI__SCAN_type, + STBI__SCAN_header +}; + +static void stbi__refill_buffer(stbi__context *s) +{ + int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); + if (n == 0) { + // at end of file, treat same as if from memory, but need to handle case + // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file + s->read_from_callbacks = 0; + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start+1; + *s->img_buffer = 0; + } else { + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start + n; + } +} + +stbi_inline static stbi_uc stbi__get8(stbi__context *s) +{ + if (s->img_buffer < s->img_buffer_end) + return *s->img_buffer++; + if (s->read_from_callbacks) { + stbi__refill_buffer(s); + return *s->img_buffer++; + } + return 0; +} + +stbi_inline static int stbi__at_eof(stbi__context *s) +{ + if (s->io.read) { + if (!(s->io.eof)(s->io_user_data)) return 0; + // if feof() is true, check if buffer = end + // special case: we've only got the special 0 character at the end + if (s->read_from_callbacks == 0) return 1; + } + + return s->img_buffer >= s->img_buffer_end; +} + +static void stbi__skip(stbi__context *s, int n) +{ + if (n < 0) { + s->img_buffer = s->img_buffer_end; + return; + } + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + s->img_buffer = s->img_buffer_end; + (s->io.skip)(s->io_user_data, n - blen); + return; + } + } + s->img_buffer += n; +} + +static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n) +{ + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + int res, count; + + memcpy(buffer, s->img_buffer, blen); + + count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); + res = (count == (n-blen)); + s->img_buffer = s->img_buffer_end; + return res; + } + } + + if (s->img_buffer+n <= s->img_buffer_end) { + memcpy(buffer, s->img_buffer, n); + s->img_buffer += n; + return 1; + } else + return 0; +} + +static int stbi__get16be(stbi__context *s) +{ + int z = stbi__get8(s); + return (z << 8) + stbi__get8(s); +} + +static stbi__uint32 stbi__get32be(stbi__context *s) +{ + stbi__uint32 z = stbi__get16be(s); + return (z << 16) + stbi__get16be(s); +} + +#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) +// nothing +#else +static int stbi__get16le(stbi__context *s) +{ + int z = stbi__get8(s); + return z + (stbi__get8(s) << 8); +} +#endif + +#ifndef STBI_NO_BMP +static stbi__uint32 stbi__get32le(stbi__context *s) +{ + stbi__uint32 z = stbi__get16le(s); + return z + (stbi__get16le(s) << 16); +} +#endif + +#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings + + +////////////////////////////////////////////////////////////////////////////// +// +// generic converter from built-in img_n to req_comp +// individual types do this automatically as much as possible (e.g. jpeg +// does all cases internally since it needs to colorspace convert anyway, +// and it never has alpha, so very few cases ). png can automatically +// interleave an alpha=255 channel, but falls back to this for other cases +// +// assume data buffer is malloced, so malloc a new one and free that one +// only failure mode is malloc failing + +static stbi_uc stbi__compute_y(int r, int g, int b) +{ + return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8); +} + +static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + unsigned char *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0); + if (good == NULL) { + STBI_FREE(data); + return stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + unsigned char *src = data + j * x * img_n ; + unsigned char *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0], dest[1]=255; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; } break; + default: STBI_ASSERT(0); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} + +static stbi__uint16 stbi__compute_y_16(int r, int g, int b) +{ + return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8); +} + +static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + stbi__uint16 *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2); + if (good == NULL) { + STBI_FREE(data); + return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + stbi__uint16 *src = data + j * x * img_n ; + stbi__uint16 *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0], dest[1]=0xffff; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=0xffff; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=0xffff; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = 0xffff; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; } break; + default: STBI_ASSERT(0); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) +{ + int i,k,n; + float *output; + if (!data) return NULL; + output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0); + if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale); + } + if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f; + } + STBI_FREE(data); + return output; +} +#endif + +#ifndef STBI_NO_HDR +#define stbi__float2int(x) ((int) (x)) +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) +{ + int i,k,n; + stbi_uc *output; + if (!data) return NULL; + output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0); + if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + if (k < comp) { + float z = data[i*comp+k] * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + } + STBI_FREE(data); + return output; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// "baseline" JPEG/JFIF decoder +// +// simple implementation +// - doesn't support delayed output of y-dimension +// - simple interface (only one output format: 8-bit interleaved RGB) +// - doesn't try to recover corrupt jpegs +// - doesn't allow partial loading, loading multiple at once +// - still fast on x86 (copying globals into locals doesn't help x86) +// - allocates lots of intermediate memory (full size of all components) +// - non-interleaved case requires this anyway +// - allows good upsampling (see next) +// high-quality +// - upsampled channels are bilinearly interpolated, even across blocks +// - quality integer IDCT derived from IJG's 'slow' +// performance +// - fast huffman; reasonable integer IDCT +// - some SIMD kernels for common paths on targets with SSE2/NEON +// - uses a lot of intermediate memory, could cache poorly + +#ifndef STBI_NO_JPEG + +// huffman decoding acceleration +#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache + +typedef struct +{ + stbi_uc fast[1 << FAST_BITS]; + // weirdly, repacking this into AoS is a 10% speed loss, instead of a win + stbi__uint16 code[256]; + stbi_uc values[256]; + stbi_uc size[257]; + unsigned int maxcode[18]; + int delta[17]; // old 'firstsymbol' - old 'firstcode' +} stbi__huffman; + +typedef struct +{ + stbi__context *s; + stbi__huffman huff_dc[4]; + stbi__huffman huff_ac[4]; + stbi__uint16 dequant[4][64]; + stbi__int16 fast_ac[4][1 << FAST_BITS]; + +// sizes for components, interleaved MCUs + int img_h_max, img_v_max; + int img_mcu_x, img_mcu_y; + int img_mcu_w, img_mcu_h; + +// definition of jpeg image component + struct + { + int id; + int h,v; + int tq; + int hd,ha; + int dc_pred; + + int x,y,w2,h2; + stbi_uc *data; + void *raw_data, *raw_coeff; + stbi_uc *linebuf; + short *coeff; // progressive only + int coeff_w, coeff_h; // number of 8x8 coefficient blocks + } img_comp[4]; + + stbi__uint32 code_buffer; // jpeg entropy-coded buffer + int code_bits; // number of valid bits + unsigned char marker; // marker seen while filling entropy buffer + int nomore; // flag if we saw a marker so must stop + + int progressive; + int spec_start; + int spec_end; + int succ_high; + int succ_low; + int eob_run; + int jfif; + int app14_color_transform; // Adobe APP14 tag + int rgb; + + int scan_n, order[4]; + int restart_interval, todo; + +// kernels + void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]); + void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step); + stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs); +} stbi__jpeg; + +static int stbi__build_huffman(stbi__huffman *h, int *count) +{ + int i,j,k=0,code; + // build size list for each symbol (from JPEG spec) + for (i=0; i < 16; ++i) + for (j=0; j < count[i]; ++j) + h->size[k++] = (stbi_uc) (i+1); + h->size[k] = 0; + + // compute actual symbols (from jpeg spec) + code = 0; + k = 0; + for(j=1; j <= 16; ++j) { + // compute delta to add to code to compute symbol id + h->delta[j] = k - code; + if (h->size[k] == j) { + while (h->size[k] == j) + h->code[k++] = (stbi__uint16) (code++); + if (code-1 >= (1 << j)) return stbi__err("bad code lengths","Corrupt JPEG"); + } + // compute largest code + 1 for this size, preshifted as needed later + h->maxcode[j] = code << (16-j); + code <<= 1; + } + h->maxcode[j] = 0xffffffff; + + // build non-spec acceleration table; 255 is flag for not-accelerated + memset(h->fast, 255, 1 << FAST_BITS); + for (i=0; i < k; ++i) { + int s = h->size[i]; + if (s <= FAST_BITS) { + int c = h->code[i] << (FAST_BITS-s); + int m = 1 << (FAST_BITS-s); + for (j=0; j < m; ++j) { + h->fast[c+j] = (stbi_uc) i; + } + } + } + return 1; +} + +// build a table that decodes both magnitude and value of small ACs in +// one go. +static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) +{ + int i; + for (i=0; i < (1 << FAST_BITS); ++i) { + stbi_uc fast = h->fast[i]; + fast_ac[i] = 0; + if (fast < 255) { + int rs = h->values[fast]; + int run = (rs >> 4) & 15; + int magbits = rs & 15; + int len = h->size[fast]; + + if (magbits && len + magbits <= FAST_BITS) { + // magnitude code followed by receive_extend code + int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); + int m = 1 << (magbits - 1); + if (k < m) k += (~0U << magbits) + 1; + // if the result is small enough, we can fit it in fast_ac table + if (k >= -128 && k <= 127) + fast_ac[i] = (stbi__int16) ((k << 8) + (run << 4) + (len + magbits)); + } + } + } +} + +static void stbi__grow_buffer_unsafe(stbi__jpeg *j) +{ + do { + int b = j->nomore ? 0 : stbi__get8(j->s); + if (b == 0xff) { + int c = stbi__get8(j->s); + while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes + if (c != 0) { + j->marker = (unsigned char) c; + j->nomore = 1; + return; + } + } + j->code_buffer |= b << (24 - j->code_bits); + j->code_bits += 8; + } while (j->code_bits <= 24); +} + +// (1 << n) - 1 +static stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; + +// decode a jpeg huffman value from the bitstream +stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) +{ + unsigned int temp; + int c,k; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + // look at the top FAST_BITS and determine what symbol ID it is, + // if the code is <= FAST_BITS + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + k = h->fast[c]; + if (k < 255) { + int s = h->size[k]; + if (s > j->code_bits) + return -1; + j->code_buffer <<= s; + j->code_bits -= s; + return h->values[k]; + } + + // naive test is to shift the code_buffer down so k bits are + // valid, then test against maxcode. To speed this up, we've + // preshifted maxcode left so that it has (16-k) 0s at the + // end; in other words, regardless of the number of bits, it + // wants to be compared against something shifted to have 16; + // that way we don't need to shift inside the loop. + temp = j->code_buffer >> 16; + for (k=FAST_BITS+1 ; ; ++k) + if (temp < h->maxcode[k]) + break; + if (k == 17) { + // error! code not found + j->code_bits -= 16; + return -1; + } + + if (k > j->code_bits) + return -1; + + // convert the huffman code to the symbol id + c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; + STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); + + // convert the id to a symbol + j->code_bits -= k; + j->code_buffer <<= k; + return h->values[c]; +} + +// bias[n] = (-1<code_bits < n) stbi__grow_buffer_unsafe(j); + + sgn = (stbi__int32)j->code_buffer >> 31; // sign bit is always in MSB + k = stbi_lrot(j->code_buffer, n); + STBI_ASSERT(n >= 0 && n < (int) (sizeof(stbi__bmask)/sizeof(*stbi__bmask))); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k + (stbi__jbias[n] & ~sgn); +} + +// get some unsigned bits +stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n) +{ + unsigned int k; + if (j->code_bits < n) stbi__grow_buffer_unsafe(j); + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k; +} + +stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j) +{ + unsigned int k; + if (j->code_bits < 1) stbi__grow_buffer_unsafe(j); + k = j->code_buffer; + j->code_buffer <<= 1; + --j->code_bits; + return k & 0x80000000; +} + +// given a value that's at position X in the zigzag stream, +// where does it appear in the 8x8 matrix coded as row-major? +static stbi_uc stbi__jpeg_dezigzag[64+15] = +{ + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + // let corrupt input sample past end + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63 +}; + +// decode one 64-entry block-- +static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant) +{ + int diff,dc,k; + int t; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + t = stbi__jpeg_huff_decode(j, hdc); + if (t < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + + // 0 all the ac values now so we can do it 32-bits at a time + memset(data,0,64*sizeof(data[0])); + + diff = t ? stbi__extend_receive(j, t) : 0; + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + data[0] = (short) (dc * dequant[0]); + + // decode AC components, see JPEG spec + k = 1; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + j->code_buffer <<= s; + j->code_bits -= s; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) * dequant[zig]); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (rs != 0xf0) break; // end block + k += 16; + } else { + k += r; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]); + } + } + } while (k < 64); + return 1; +} + +static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b) +{ + int diff,dc; + int t; + if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + if (j->succ_high == 0) { + // first scan for DC coefficient, must be first + memset(data,0,64*sizeof(data[0])); // 0 all the ac values now + t = stbi__jpeg_huff_decode(j, hdc); + diff = t ? stbi__extend_receive(j, t) : 0; + + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + data[0] = (short) (dc << j->succ_low); + } else { + // refinement scan for DC coefficient + if (stbi__jpeg_get_bit(j)) + data[0] += (short) (1 << j->succ_low); + } + return 1; +} + +// @OPTIMIZE: store non-zigzagged during the decode passes, +// and only de-zigzag when dequantizing +static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac) +{ + int k; + if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->succ_high == 0) { + int shift = j->succ_low; + + if (j->eob_run) { + --j->eob_run; + return 1; + } + + k = j->spec_start; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + j->code_buffer <<= s; + j->code_bits -= s; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) << shift); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r); + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + --j->eob_run; + break; + } + k += 16; + } else { + k += r; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) << shift); + } + } + } while (k <= j->spec_end); + } else { + // refinement scan for these AC coefficients + + short bit = (short) (1 << j->succ_low); + + if (j->eob_run) { + --j->eob_run; + for (k = j->spec_start; k <= j->spec_end; ++k) { + short *p = &data[stbi__jpeg_dezigzag[k]]; + if (*p != 0) + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } + } else { + k = j->spec_start; + do { + int r,s; + int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r) - 1; + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + r = 64; // force end of block + } else { + // r=15 s=0 should write 16 0s, so we just do + // a run of 15 0s and then write s (which is 0), + // so we don't have to do anything special here + } + } else { + if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG"); + // sign bit + if (stbi__jpeg_get_bit(j)) + s = bit; + else + s = -bit; + } + + // advance by r + while (k <= j->spec_end) { + short *p = &data[stbi__jpeg_dezigzag[k++]]; + if (*p != 0) { + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } else { + if (r == 0) { + *p = (short) s; + break; + } + --r; + } + } + } while (k <= j->spec_end); + } + } + return 1; +} + +// take a -128..127 value and stbi__clamp it and convert to 0..255 +stbi_inline static stbi_uc stbi__clamp(int x) +{ + // trick to use a single test to catch both cases + if ((unsigned int) x > 255) { + if (x < 0) return 0; + if (x > 255) return 255; + } + return (stbi_uc) x; +} + +#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) +#define stbi__fsh(x) ((x) << 12) + +// derived from jidctint -- DCT_ISLOW +#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ + int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ + p2 = s2; \ + p3 = s6; \ + p1 = (p2+p3) * stbi__f2f(0.5411961f); \ + t2 = p1 + p3*stbi__f2f(-1.847759065f); \ + t3 = p1 + p2*stbi__f2f( 0.765366865f); \ + p2 = s0; \ + p3 = s4; \ + t0 = stbi__fsh(p2+p3); \ + t1 = stbi__fsh(p2-p3); \ + x0 = t0+t3; \ + x3 = t0-t3; \ + x1 = t1+t2; \ + x2 = t1-t2; \ + t0 = s7; \ + t1 = s5; \ + t2 = s3; \ + t3 = s1; \ + p3 = t0+t2; \ + p4 = t1+t3; \ + p1 = t0+t3; \ + p2 = t1+t2; \ + p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ + t0 = t0*stbi__f2f( 0.298631336f); \ + t1 = t1*stbi__f2f( 2.053119869f); \ + t2 = t2*stbi__f2f( 3.072711026f); \ + t3 = t3*stbi__f2f( 1.501321110f); \ + p1 = p5 + p1*stbi__f2f(-0.899976223f); \ + p2 = p5 + p2*stbi__f2f(-2.562915447f); \ + p3 = p3*stbi__f2f(-1.961570560f); \ + p4 = p4*stbi__f2f(-0.390180644f); \ + t3 += p1+p4; \ + t2 += p2+p3; \ + t1 += p2+p4; \ + t0 += p1+p3; + +static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64]) +{ + int i,val[64],*v=val; + stbi_uc *o; + short *d = data; + + // columns + for (i=0; i < 8; ++i,++d, ++v) { + // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing + if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 + && d[40]==0 && d[48]==0 && d[56]==0) { + // no shortcut 0 seconds + // (1|2|3|4|5|6|7)==0 0 seconds + // all separate -0.047 seconds + // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds + int dcterm = d[0] << 2; + v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; + } else { + STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56]) + // constants scaled things up by 1<<12; let's bring them back + // down, but keep 2 extra bits of precision + x0 += 512; x1 += 512; x2 += 512; x3 += 512; + v[ 0] = (x0+t3) >> 10; + v[56] = (x0-t3) >> 10; + v[ 8] = (x1+t2) >> 10; + v[48] = (x1-t2) >> 10; + v[16] = (x2+t1) >> 10; + v[40] = (x2-t1) >> 10; + v[24] = (x3+t0) >> 10; + v[32] = (x3-t0) >> 10; + } + } + + for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { + // no fast case since the first 1D IDCT spread components out + STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) + // constants scaled things up by 1<<12, plus we had 1<<2 from first + // loop, plus horizontal and vertical each scale by sqrt(8) so together + // we've got an extra 1<<3, so 1<<17 total we need to remove. + // so we want to round that, which means adding 0.5 * 1<<17, + // aka 65536. Also, we'll end up with -128 to 127 that we want + // to encode as 0..255 by adding 128, so we'll add that before the shift + x0 += 65536 + (128<<17); + x1 += 65536 + (128<<17); + x2 += 65536 + (128<<17); + x3 += 65536 + (128<<17); + // tried computing the shifts into temps, or'ing the temps to see + // if any were out of range, but that was slower + o[0] = stbi__clamp((x0+t3) >> 17); + o[7] = stbi__clamp((x0-t3) >> 17); + o[1] = stbi__clamp((x1+t2) >> 17); + o[6] = stbi__clamp((x1-t2) >> 17); + o[2] = stbi__clamp((x2+t1) >> 17); + o[5] = stbi__clamp((x2-t1) >> 17); + o[3] = stbi__clamp((x3+t0) >> 17); + o[4] = stbi__clamp((x3-t0) >> 17); + } +} + +#ifdef STBI_SSE2 +// sse2 integer IDCT. not the fastest possible implementation but it +// produces bit-identical results to the generic C version so it's +// fully "transparent". +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + // This is constructed to match our regular (generic) integer IDCT exactly. + __m128i row0, row1, row2, row3, row4, row5, row6, row7; + __m128i tmp; + + // dot product constant: even elems=x, odd elems=y + #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) + + // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) + // out(1) = c1[even]*x + c1[odd]*y + #define dct_rot(out0,out1, x,y,c0,c1) \ + __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ + __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ + __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ + __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ + __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ + __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) + + // out = in << 12 (in 16-bit, out 32-bit) + #define dct_widen(out, in) \ + __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ + __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) + + // wide add + #define dct_wadd(out, a, b) \ + __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_add_epi32(a##_h, b##_h) + + // wide sub + #define dct_wsub(out, a, b) \ + __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) + + // butterfly a/b, add bias, then shift by "s" and pack + #define dct_bfly32o(out0, out1, a,b,bias,s) \ + { \ + __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ + __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ + dct_wadd(sum, abiased, b); \ + dct_wsub(dif, abiased, b); \ + out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ + out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ + } + + // 8-bit interleave step (for transposes) + #define dct_interleave8(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi8(a, b); \ + b = _mm_unpackhi_epi8(tmp, b) + + // 16-bit interleave step (for transposes) + #define dct_interleave16(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi16(a, b); \ + b = _mm_unpackhi_epi16(tmp, b) + + #define dct_pass(bias,shift) \ + { \ + /* even part */ \ + dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ + __m128i sum04 = _mm_add_epi16(row0, row4); \ + __m128i dif04 = _mm_sub_epi16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ + dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ + __m128i sum17 = _mm_add_epi16(row1, row7); \ + __m128i sum35 = _mm_add_epi16(row3, row5); \ + dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ + dct_wadd(x4, y0o, y4o); \ + dct_wadd(x5, y1o, y5o); \ + dct_wadd(x6, y2o, y5o); \ + dct_wadd(x7, y3o, y4o); \ + dct_bfly32o(row0,row7, x0,x7,bias,shift); \ + dct_bfly32o(row1,row6, x1,x6,bias,shift); \ + dct_bfly32o(row2,row5, x2,x5,bias,shift); \ + dct_bfly32o(row3,row4, x3,x4,bias,shift); \ + } + + __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f)); + __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f)); + __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f)); + __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f)); + __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f)); + __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f)); + __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f)); + __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f)); + + // rounding biases in column/row passes, see stbi__idct_block for explanation. + __m128i bias_0 = _mm_set1_epi32(512); + __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17)); + + // load + row0 = _mm_load_si128((const __m128i *) (data + 0*8)); + row1 = _mm_load_si128((const __m128i *) (data + 1*8)); + row2 = _mm_load_si128((const __m128i *) (data + 2*8)); + row3 = _mm_load_si128((const __m128i *) (data + 3*8)); + row4 = _mm_load_si128((const __m128i *) (data + 4*8)); + row5 = _mm_load_si128((const __m128i *) (data + 5*8)); + row6 = _mm_load_si128((const __m128i *) (data + 6*8)); + row7 = _mm_load_si128((const __m128i *) (data + 7*8)); + + // column pass + dct_pass(bias_0, 10); + + { + // 16bit 8x8 transpose pass 1 + dct_interleave16(row0, row4); + dct_interleave16(row1, row5); + dct_interleave16(row2, row6); + dct_interleave16(row3, row7); + + // transpose pass 2 + dct_interleave16(row0, row2); + dct_interleave16(row1, row3); + dct_interleave16(row4, row6); + dct_interleave16(row5, row7); + + // transpose pass 3 + dct_interleave16(row0, row1); + dct_interleave16(row2, row3); + dct_interleave16(row4, row5); + dct_interleave16(row6, row7); + } + + // row pass + dct_pass(bias_1, 17); + + { + // pack + __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7 + __m128i p1 = _mm_packus_epi16(row2, row3); + __m128i p2 = _mm_packus_epi16(row4, row5); + __m128i p3 = _mm_packus_epi16(row6, row7); + + // 8bit 8x8 transpose pass 1 + dct_interleave8(p0, p2); // a0e0a1e1... + dct_interleave8(p1, p3); // c0g0c1g1... + + // transpose pass 2 + dct_interleave8(p0, p1); // a0c0e0g0... + dct_interleave8(p2, p3); // b0d0f0h0... + + // transpose pass 3 + dct_interleave8(p0, p2); // a0b0c0d0... + dct_interleave8(p1, p3); // a4b4c4d4... + + // store + _mm_storel_epi64((__m128i *) out, p0); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p2); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p1); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p3); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e)); + } + +#undef dct_const +#undef dct_rot +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_interleave8 +#undef dct_interleave16 +#undef dct_pass +} + +#endif // STBI_SSE2 + +#ifdef STBI_NEON + +// NEON integer IDCT. should produce bit-identical +// results to the generic C version. +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; + + int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f)); + int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f)); + int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f)); + int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f)); + int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f)); + int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f)); + int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f)); + int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f)); + int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f)); + int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f)); + int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f)); + int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f)); + +#define dct_long_mul(out, inq, coeff) \ + int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) + +#define dct_long_mac(out, acc, inq, coeff) \ + int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) + +#define dct_widen(out, inq) \ + int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ + int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) + +// wide add +#define dct_wadd(out, a, b) \ + int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vaddq_s32(a##_h, b##_h) + +// wide sub +#define dct_wsub(out, a, b) \ + int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vsubq_s32(a##_h, b##_h) + +// butterfly a/b, then shift using "shiftop" by "s" and pack +#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ + { \ + dct_wadd(sum, a, b); \ + dct_wsub(dif, a, b); \ + out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ + out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ + } + +#define dct_pass(shiftop, shift) \ + { \ + /* even part */ \ + int16x8_t sum26 = vaddq_s16(row2, row6); \ + dct_long_mul(p1e, sum26, rot0_0); \ + dct_long_mac(t2e, p1e, row6, rot0_1); \ + dct_long_mac(t3e, p1e, row2, rot0_2); \ + int16x8_t sum04 = vaddq_s16(row0, row4); \ + int16x8_t dif04 = vsubq_s16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + int16x8_t sum15 = vaddq_s16(row1, row5); \ + int16x8_t sum17 = vaddq_s16(row1, row7); \ + int16x8_t sum35 = vaddq_s16(row3, row5); \ + int16x8_t sum37 = vaddq_s16(row3, row7); \ + int16x8_t sumodd = vaddq_s16(sum17, sum35); \ + dct_long_mul(p5o, sumodd, rot1_0); \ + dct_long_mac(p1o, p5o, sum17, rot1_1); \ + dct_long_mac(p2o, p5o, sum35, rot1_2); \ + dct_long_mul(p3o, sum37, rot2_0); \ + dct_long_mul(p4o, sum15, rot2_1); \ + dct_wadd(sump13o, p1o, p3o); \ + dct_wadd(sump24o, p2o, p4o); \ + dct_wadd(sump23o, p2o, p3o); \ + dct_wadd(sump14o, p1o, p4o); \ + dct_long_mac(x4, sump13o, row7, rot3_0); \ + dct_long_mac(x5, sump24o, row5, rot3_1); \ + dct_long_mac(x6, sump23o, row3, rot3_2); \ + dct_long_mac(x7, sump14o, row1, rot3_3); \ + dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ + dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ + dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ + dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ + } + + // load + row0 = vld1q_s16(data + 0*8); + row1 = vld1q_s16(data + 1*8); + row2 = vld1q_s16(data + 2*8); + row3 = vld1q_s16(data + 3*8); + row4 = vld1q_s16(data + 4*8); + row5 = vld1q_s16(data + 5*8); + row6 = vld1q_s16(data + 6*8); + row7 = vld1q_s16(data + 7*8); + + // add DC bias + row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); + + // column pass + dct_pass(vrshrn_n_s32, 10); + + // 16bit 8x8 transpose + { +// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. +// whether compilers actually get this is another story, sadly. +#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } +#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } + + // pass 1 + dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6 + dct_trn16(row2, row3); + dct_trn16(row4, row5); + dct_trn16(row6, row7); + + // pass 2 + dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4 + dct_trn32(row1, row3); + dct_trn32(row4, row6); + dct_trn32(row5, row7); + + // pass 3 + dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0 + dct_trn64(row1, row5); + dct_trn64(row2, row6); + dct_trn64(row3, row7); + +#undef dct_trn16 +#undef dct_trn32 +#undef dct_trn64 + } + + // row pass + // vrshrn_n_s32 only supports shifts up to 16, we need + // 17. so do a non-rounding shift of 16 first then follow + // up with a rounding shift by 1. + dct_pass(vshrn_n_s32, 16); + + { + // pack and round + uint8x8_t p0 = vqrshrun_n_s16(row0, 1); + uint8x8_t p1 = vqrshrun_n_s16(row1, 1); + uint8x8_t p2 = vqrshrun_n_s16(row2, 1); + uint8x8_t p3 = vqrshrun_n_s16(row3, 1); + uint8x8_t p4 = vqrshrun_n_s16(row4, 1); + uint8x8_t p5 = vqrshrun_n_s16(row5, 1); + uint8x8_t p6 = vqrshrun_n_s16(row6, 1); + uint8x8_t p7 = vqrshrun_n_s16(row7, 1); + + // again, these can translate into one instruction, but often don't. +#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } +#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } + + // sadly can't use interleaved stores here since we only write + // 8 bytes to each scan line! + + // 8x8 8-bit transpose pass 1 + dct_trn8_8(p0, p1); + dct_trn8_8(p2, p3); + dct_trn8_8(p4, p5); + dct_trn8_8(p6, p7); + + // pass 2 + dct_trn8_16(p0, p2); + dct_trn8_16(p1, p3); + dct_trn8_16(p4, p6); + dct_trn8_16(p5, p7); + + // pass 3 + dct_trn8_32(p0, p4); + dct_trn8_32(p1, p5); + dct_trn8_32(p2, p6); + dct_trn8_32(p3, p7); + + // store + vst1_u8(out, p0); out += out_stride; + vst1_u8(out, p1); out += out_stride; + vst1_u8(out, p2); out += out_stride; + vst1_u8(out, p3); out += out_stride; + vst1_u8(out, p4); out += out_stride; + vst1_u8(out, p5); out += out_stride; + vst1_u8(out, p6); out += out_stride; + vst1_u8(out, p7); + +#undef dct_trn8_8 +#undef dct_trn8_16 +#undef dct_trn8_32 + } + +#undef dct_long_mul +#undef dct_long_mac +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_pass +} + +#endif // STBI_NEON + +#define STBI__MARKER_none 0xff +// if there's a pending marker from the entropy stream, return that +// otherwise, fetch from the stream and get a marker. if there's no +// marker, return 0xff, which is never a valid marker value +static stbi_uc stbi__get_marker(stbi__jpeg *j) +{ + stbi_uc x; + if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; } + x = stbi__get8(j->s); + if (x != 0xff) return STBI__MARKER_none; + while (x == 0xff) + x = stbi__get8(j->s); // consume repeated 0xff fill bytes + return x; +} + +// in each scan, we'll have scan_n components, and the order +// of the components is specified by order[] +#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) + +// after a restart interval, stbi__jpeg_reset the entropy decoder and +// the dc prediction +static void stbi__jpeg_reset(stbi__jpeg *j) +{ + j->code_bits = 0; + j->code_buffer = 0; + j->nomore = 0; + j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0; + j->marker = STBI__MARKER_none; + j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; + j->eob_run = 0; + // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, + // since we don't even allow 1<<30 pixels +} + +static int stbi__parse_entropy_coded_data(stbi__jpeg *z) +{ + stbi__jpeg_reset(z); + if (!z->progressive) { + if (z->scan_n == 1) { + int i,j; + STBI_SIMD_ALIGN(short, data[64]); + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + STBI_SIMD_ALIGN(short, data[64]); + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x)*8; + int y2 = (j*z->img_comp[n].v + y)*8; + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data); + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } else { + if (z->scan_n == 1) { + int i,j; + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + if (z->spec_start == 0) { + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } else { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) + return 0; + } + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x); + int y2 = (j*z->img_comp[n].v + y); + short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } +} + +static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant) +{ + int i; + for (i=0; i < 64; ++i) + data[i] *= dequant[i]; +} + +static void stbi__jpeg_finish(stbi__jpeg *z) +{ + if (z->progressive) { + // dequantize and idct the data + int i,j,n; + for (n=0; n < z->s->img_n; ++n) { + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + } + } + } + } +} + +static int stbi__process_marker(stbi__jpeg *z, int m) +{ + int L; + switch (m) { + case STBI__MARKER_none: // no marker found + return stbi__err("expected marker","Corrupt JPEG"); + + case 0xDD: // DRI - specify restart interval + if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG"); + z->restart_interval = stbi__get16be(z->s); + return 1; + + case 0xDB: // DQT - define quantization table + L = stbi__get16be(z->s)-2; + while (L > 0) { + int q = stbi__get8(z->s); + int p = q >> 4, sixteen = (p != 0); + int t = q & 15,i; + if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG"); + if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); + + for (i=0; i < 64; ++i) + z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s)); + L -= (sixteen ? 129 : 65); + } + return L==0; + + case 0xC4: // DHT - define huffman table + L = stbi__get16be(z->s)-2; + while (L > 0) { + stbi_uc *v; + int sizes[16],i,n=0; + int q = stbi__get8(z->s); + int tc = q >> 4; + int th = q & 15; + if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG"); + for (i=0; i < 16; ++i) { + sizes[i] = stbi__get8(z->s); + n += sizes[i]; + } + L -= 17; + if (tc == 0) { + if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0; + v = z->huff_dc[th].values; + } else { + if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0; + v = z->huff_ac[th].values; + } + for (i=0; i < n; ++i) + v[i] = stbi__get8(z->s); + if (tc != 0) + stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th); + L -= n; + } + return L==0; + } + + // check for comment block or APP blocks + if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { + L = stbi__get16be(z->s); + if (L < 2) { + if (m == 0xFE) + return stbi__err("bad COM len","Corrupt JPEG"); + else + return stbi__err("bad APP len","Corrupt JPEG"); + } + L -= 2; + + if (m == 0xE0 && L >= 5) { // JFIF APP0 segment + static const unsigned char tag[5] = {'J','F','I','F','\0'}; + int ok = 1; + int i; + for (i=0; i < 5; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 5; + if (ok) + z->jfif = 1; + } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment + static const unsigned char tag[6] = {'A','d','o','b','e','\0'}; + int ok = 1; + int i; + for (i=0; i < 6; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 6; + if (ok) { + stbi__get8(z->s); // version + stbi__get16be(z->s); // flags0 + stbi__get16be(z->s); // flags1 + z->app14_color_transform = stbi__get8(z->s); // color transform + L -= 6; + } + } + + stbi__skip(z->s, L); + return 1; + } + + return stbi__err("unknown marker","Corrupt JPEG"); +} + +// after we see SOS +static int stbi__process_scan_header(stbi__jpeg *z) +{ + int i; + int Ls = stbi__get16be(z->s); + z->scan_n = stbi__get8(z->s); + if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count","Corrupt JPEG"); + if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG"); + for (i=0; i < z->scan_n; ++i) { + int id = stbi__get8(z->s), which; + int q = stbi__get8(z->s); + for (which = 0; which < z->s->img_n; ++which) + if (z->img_comp[which].id == id) + break; + if (which == z->s->img_n) return 0; // no match + z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG"); + z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG"); + z->order[i] = which; + } + + { + int aa; + z->spec_start = stbi__get8(z->s); + z->spec_end = stbi__get8(z->s); // should be 63, but might be 0 + aa = stbi__get8(z->s); + z->succ_high = (aa >> 4); + z->succ_low = (aa & 15); + if (z->progressive) { + if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13) + return stbi__err("bad SOS", "Corrupt JPEG"); + } else { + if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG"); + if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG"); + z->spec_end = 63; + } + } + + return 1; +} + +static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why) +{ + int i; + for (i=0; i < ncomp; ++i) { + if (z->img_comp[i].raw_data) { + STBI_FREE(z->img_comp[i].raw_data); + z->img_comp[i].raw_data = NULL; + z->img_comp[i].data = NULL; + } + if (z->img_comp[i].raw_coeff) { + STBI_FREE(z->img_comp[i].raw_coeff); + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].coeff = 0; + } + if (z->img_comp[i].linebuf) { + STBI_FREE(z->img_comp[i].linebuf); + z->img_comp[i].linebuf = NULL; + } + } + return why; +} + +static int stbi__process_frame_header(stbi__jpeg *z, int scan) +{ + stbi__context *s = z->s; + int Lf,p,i,q, h_max=1,v_max=1,c; + Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG + p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline + s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG + s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires + c = stbi__get8(s); + if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG"); + s->img_n = c; + for (i=0; i < c; ++i) { + z->img_comp[i].data = NULL; + z->img_comp[i].linebuf = NULL; + } + + if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG"); + + z->rgb = 0; + for (i=0; i < s->img_n; ++i) { + static unsigned char rgb[3] = { 'R', 'G', 'B' }; + z->img_comp[i].id = stbi__get8(s); + if (s->img_n == 3 && z->img_comp[i].id == rgb[i]) + ++z->rgb; + q = stbi__get8(s); + z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG"); + z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG"); + z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG"); + } + + if (scan != STBI__SCAN_load) return 1; + + if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode"); + + for (i=0; i < s->img_n; ++i) { + if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; + if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; + } + + // compute interleaved mcu info + z->img_h_max = h_max; + z->img_v_max = v_max; + z->img_mcu_w = h_max * 8; + z->img_mcu_h = v_max * 8; + // these sizes can't be more than 17 bits + z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; + z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; + + for (i=0; i < s->img_n; ++i) { + // number of effective pixels (e.g. for non-interleaved MCU) + z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; + z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; + // to simplify generation, we'll allocate enough memory to decode + // the bogus oversized data from using interleaved MCUs and their + // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't + // discard the extra data until colorspace conversion + // + // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) + // so these muls can't overflow with 32-bit ints (which we require) + z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; + z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; + z->img_comp[i].coeff = 0; + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].linebuf = NULL; + z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15); + if (z->img_comp[i].raw_data == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); + // align blocks for idct using mmx/sse + z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); + if (z->progressive) { + // w2, h2 are multiples of 8 (see above) + z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; + z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; + z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15); + if (z->img_comp[i].raw_coeff == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); + z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); + } + } + + return 1; +} + +// use comparisons since in some cases we handle more than one case (e.g. SOF) +#define stbi__DNL(x) ((x) == 0xdc) +#define stbi__SOI(x) ((x) == 0xd8) +#define stbi__EOI(x) ((x) == 0xd9) +#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) +#define stbi__SOS(x) ((x) == 0xda) + +#define stbi__SOF_progressive(x) ((x) == 0xc2) + +static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) +{ + int m; + z->jfif = 0; + z->app14_color_transform = -1; // valid values are 0,1,2 + z->marker = STBI__MARKER_none; // initialize cached marker to empty + m = stbi__get_marker(z); + if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG"); + if (scan == STBI__SCAN_type) return 1; + m = stbi__get_marker(z); + while (!stbi__SOF(m)) { + if (!stbi__process_marker(z,m)) return 0; + m = stbi__get_marker(z); + while (m == STBI__MARKER_none) { + // some files have extra padding after their blocks, so ok, we'll scan + if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG"); + m = stbi__get_marker(z); + } + } + z->progressive = stbi__SOF_progressive(m); + if (!stbi__process_frame_header(z, scan)) return 0; + return 1; +} + +// decode image to YCbCr format +static int stbi__decode_jpeg_image(stbi__jpeg *j) +{ + int m; + for (m = 0; m < 4; m++) { + j->img_comp[m].raw_data = NULL; + j->img_comp[m].raw_coeff = NULL; + } + j->restart_interval = 0; + if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0; + m = stbi__get_marker(j); + while (!stbi__EOI(m)) { + if (stbi__SOS(m)) { + if (!stbi__process_scan_header(j)) return 0; + if (!stbi__parse_entropy_coded_data(j)) return 0; + if (j->marker == STBI__MARKER_none ) { + // handle 0s at the end of image data from IP Kamera 9060 + while (!stbi__at_eof(j->s)) { + int x = stbi__get8(j->s); + if (x == 255) { + j->marker = stbi__get8(j->s); + break; + } + } + // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 + } + } else if (stbi__DNL(m)) { + int Ld = stbi__get16be(j->s); + stbi__uint32 NL = stbi__get16be(j->s); + if (Ld != 4) stbi__err("bad DNL len", "Corrupt JPEG"); + if (NL != j->s->img_y) stbi__err("bad DNL height", "Corrupt JPEG"); + } else { + if (!stbi__process_marker(j, m)) return 0; + } + m = stbi__get_marker(j); + } + if (j->progressive) + stbi__jpeg_finish(j); + return 1; +} + +// static jfif-centered resampling (across block boundaries) + +typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1, + int w, int hs); + +#define stbi__div4(x) ((stbi_uc) ((x) >> 2)) + +static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + STBI_NOTUSED(out); + STBI_NOTUSED(in_far); + STBI_NOTUSED(w); + STBI_NOTUSED(hs); + return in_near; +} + +static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples vertically for every one in input + int i; + STBI_NOTUSED(hs); + for (i=0; i < w; ++i) + out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2); + return out; +} + +static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples horizontally for every one in input + int i; + stbi_uc *input = in_near; + + if (w == 1) { + // if only one sample, can't do any interpolation + out[0] = out[1] = input[0]; + return out; + } + + out[0] = input[0]; + out[1] = stbi__div4(input[0]*3 + input[1] + 2); + for (i=1; i < w-1; ++i) { + int n = 3*input[i]+2; + out[i*2+0] = stbi__div4(n+input[i-1]); + out[i*2+1] = stbi__div4(n+input[i+1]); + } + out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2); + out[i*2+1] = input[w-1]; + + STBI_NOTUSED(in_far); + STBI_NOTUSED(hs); + + return out; +} + +#define stbi__div16(x) ((stbi_uc) ((x) >> 4)) + +static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i,t0,t1; + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + out[0] = stbi__div4(t1+2); + for (i=1; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i=0,t0,t1; + + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + // process groups of 8 pixels for as long as we can. + // note we can't handle the last pixel in a row in this loop + // because we need to handle the filter boundary conditions. + for (; i < ((w-1) & ~7); i += 8) { +#if defined(STBI_SSE2) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + __m128i zero = _mm_setzero_si128(); + __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i)); + __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i)); + __m128i farw = _mm_unpacklo_epi8(farb, zero); + __m128i nearw = _mm_unpacklo_epi8(nearb, zero); + __m128i diff = _mm_sub_epi16(farw, nearw); + __m128i nears = _mm_slli_epi16(nearw, 2); + __m128i curr = _mm_add_epi16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + __m128i prv0 = _mm_slli_si128(curr, 2); + __m128i nxt0 = _mm_srli_si128(curr, 2); + __m128i prev = _mm_insert_epi16(prv0, t1, 0); + __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + __m128i bias = _mm_set1_epi16(8); + __m128i curs = _mm_slli_epi16(curr, 2); + __m128i prvd = _mm_sub_epi16(prev, curr); + __m128i nxtd = _mm_sub_epi16(next, curr); + __m128i curb = _mm_add_epi16(curs, bias); + __m128i even = _mm_add_epi16(prvd, curb); + __m128i odd = _mm_add_epi16(nxtd, curb); + + // interleave even and odd pixels, then undo scaling. + __m128i int0 = _mm_unpacklo_epi16(even, odd); + __m128i int1 = _mm_unpackhi_epi16(even, odd); + __m128i de0 = _mm_srli_epi16(int0, 4); + __m128i de1 = _mm_srli_epi16(int1, 4); + + // pack and write output + __m128i outv = _mm_packus_epi16(de0, de1); + _mm_storeu_si128((__m128i *) (out + i*2), outv); +#elif defined(STBI_NEON) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + uint8x8_t farb = vld1_u8(in_far + i); + uint8x8_t nearb = vld1_u8(in_near + i); + int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); + int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); + int16x8_t curr = vaddq_s16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + int16x8_t prv0 = vextq_s16(curr, curr, 7); + int16x8_t nxt0 = vextq_s16(curr, curr, 1); + int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); + int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + int16x8_t curs = vshlq_n_s16(curr, 2); + int16x8_t prvd = vsubq_s16(prev, curr); + int16x8_t nxtd = vsubq_s16(next, curr); + int16x8_t even = vaddq_s16(curs, prvd); + int16x8_t odd = vaddq_s16(curs, nxtd); + + // undo scaling and round, then store with even/odd phases interleaved + uint8x8x2_t o; + o.val[0] = vqrshrun_n_s16(even, 4); + o.val[1] = vqrshrun_n_s16(odd, 4); + vst2_u8(out + i*2, o); +#endif + + // "previous" value for next iter + t1 = 3*in_near[i+7] + in_far[i+7]; + } + + t0 = t1; + t1 = 3*in_near[i] + in_far[i]; + out[i*2] = stbi__div16(3*t1 + t0 + 8); + + for (++i; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} +#endif + +static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // resample with nearest-neighbor + int i,j; + STBI_NOTUSED(in_far); + for (i=0; i < w; ++i) + for (j=0; j < hs; ++j) + out[i*hs+j] = in_near[i]; + return out; +} + +// this is a reduced-precision calculation of YCbCr-to-RGB introduced +// to make sure the code produces the same results in both SIMD and scalar +#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) +static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) +{ + int i; + for (i=0; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) +{ + int i = 0; + +#ifdef STBI_SSE2 + // step == 3 is pretty ugly on the final interleave, and i'm not convinced + // it's useful in practice (you wouldn't use it for textures, for example). + // so just accelerate step == 4 case. + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + __m128i signflip = _mm_set1_epi8(-0x80); + __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f)); + __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f)); + __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f)); + __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f)); + __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128); + __m128i xw = _mm_set1_epi16(255); // alpha channel + + for (; i+7 < count; i += 8) { + // load + __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i)); + __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i)); + __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i)); + __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128 + __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128 + + // unpack to short (and left-shift cr, cb by 8) + __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); + __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); + __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); + + // color transform + __m128i yws = _mm_srli_epi16(yw, 4); + __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); + __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); + __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); + __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); + __m128i rws = _mm_add_epi16(cr0, yws); + __m128i gwt = _mm_add_epi16(cb0, yws); + __m128i bws = _mm_add_epi16(yws, cb1); + __m128i gws = _mm_add_epi16(gwt, cr1); + + // descale + __m128i rw = _mm_srai_epi16(rws, 4); + __m128i bw = _mm_srai_epi16(bws, 4); + __m128i gw = _mm_srai_epi16(gws, 4); + + // back to byte, set up for transpose + __m128i brb = _mm_packus_epi16(rw, bw); + __m128i gxb = _mm_packus_epi16(gw, xw); + + // transpose to interleave channels + __m128i t0 = _mm_unpacklo_epi8(brb, gxb); + __m128i t1 = _mm_unpackhi_epi8(brb, gxb); + __m128i o0 = _mm_unpacklo_epi16(t0, t1); + __m128i o1 = _mm_unpackhi_epi16(t0, t1); + + // store + _mm_storeu_si128((__m128i *) (out + 0), o0); + _mm_storeu_si128((__m128i *) (out + 16), o1); + out += 32; + } + } +#endif + +#ifdef STBI_NEON + // in this version, step=3 support would be easy to add. but is there demand? + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + uint8x8_t signflip = vdup_n_u8(0x80); + int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f)); + int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f)); + int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f)); + int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f)); + + for (; i+7 < count; i += 8) { + // load + uint8x8_t y_bytes = vld1_u8(y + i); + uint8x8_t cr_bytes = vld1_u8(pcr + i); + uint8x8_t cb_bytes = vld1_u8(pcb + i); + int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); + int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); + + // expand to s16 + int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); + int16x8_t crw = vshll_n_s8(cr_biased, 7); + int16x8_t cbw = vshll_n_s8(cb_biased, 7); + + // color transform + int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); + int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); + int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); + int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); + int16x8_t rws = vaddq_s16(yws, cr0); + int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); + int16x8_t bws = vaddq_s16(yws, cb1); + + // undo scaling, round, convert to byte + uint8x8x4_t o; + o.val[0] = vqrshrun_n_s16(rws, 4); + o.val[1] = vqrshrun_n_s16(gws, 4); + o.val[2] = vqrshrun_n_s16(bws, 4); + o.val[3] = vdup_n_u8(255); + + // store, interleaving r/g/b/a + vst4_u8(out, o); + out += 8*4; + } + } +#endif + + for (; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} +#endif + +// set up the kernels +static void stbi__setup_jpeg(stbi__jpeg *j) +{ + j->idct_block_kernel = stbi__idct_block; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; + +#ifdef STBI_SSE2 + if (stbi__sse2_available()) { + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; + } +#endif + +#ifdef STBI_NEON + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; +#endif +} + +// clean up the temporary component buffers +static void stbi__cleanup_jpeg(stbi__jpeg *j) +{ + stbi__free_jpeg_components(j, j->s->img_n, 0); +} + +typedef struct +{ + resample_row_func resample; + stbi_uc *line0,*line1; + int hs,vs; // expansion factor in each axis + int w_lores; // horizontal pixels pre-expansion + int ystep; // how far through vertical expansion we are + int ypos; // which pre-expansion row we're on +} stbi__resample; + +// fast 0..255 * 0..255 => 0..255 rounded multiplication +static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y) +{ + unsigned int t = x*y + 128; + return (stbi_uc) ((t + (t >>8)) >> 8); +} + +static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) +{ + int n, decode_n, is_rgb; + z->s->img_n = 0; // make stbi__cleanup_jpeg safe + + // validate req_comp + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + + // load a jpeg image from whichever source, but leave in YCbCr format + if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } + + // determine actual number of components to generate + n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1; + + is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif)); + + if (z->s->img_n == 3 && n < 3 && !is_rgb) + decode_n = 1; + else + decode_n = z->s->img_n; + + // resample and color-convert + { + int k; + unsigned int i,j; + stbi_uc *output; + stbi_uc *coutput[4]; + + stbi__resample res_comp[4]; + + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + + // allocate line buffer big enough for upsampling off the edges + // with upsample factor of 4 + z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3); + if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + r->hs = z->img_h_max / z->img_comp[k].h; + r->vs = z->img_v_max / z->img_comp[k].v; + r->ystep = r->vs >> 1; + r->w_lores = (z->s->img_x + r->hs-1) / r->hs; + r->ypos = 0; + r->line0 = r->line1 = z->img_comp[k].data; + + if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; + else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2; + else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2; + else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel; + else r->resample = stbi__resample_row_generic; + } + + // can't error after this so, this is safe + output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1); + if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + // now go ahead and resample + for (j=0; j < z->s->img_y; ++j) { + stbi_uc *out = output + n * z->s->img_x * j; + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + int y_bot = r->ystep >= (r->vs >> 1); + coutput[k] = r->resample(z->img_comp[k].linebuf, + y_bot ? r->line1 : r->line0, + y_bot ? r->line0 : r->line1, + r->w_lores, r->hs); + if (++r->ystep >= r->vs) { + r->ystep = 0; + r->line0 = r->line1; + if (++r->ypos < z->img_comp[k].y) + r->line1 += z->img_comp[k].w2; + } + } + if (n >= 3) { + stbi_uc *y = coutput[0]; + if (z->s->img_n == 3) { + if (is_rgb) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = y[i]; + out[1] = coutput[1][i]; + out[2] = coutput[2][i]; + out[3] = 255; + out += n; + } + } else { + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else if (z->s->img_n == 4) { + if (z->app14_color_transform == 0) { // CMYK + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(coutput[0][i], m); + out[1] = stbi__blinn_8x8(coutput[1][i], m); + out[2] = stbi__blinn_8x8(coutput[2][i], m); + out[3] = 255; + out += n; + } + } else if (z->app14_color_transform == 2) { // YCCK + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(255 - out[0], m); + out[1] = stbi__blinn_8x8(255 - out[1], m); + out[2] = stbi__blinn_8x8(255 - out[2], m); + out += n; + } + } else { // YCbCr + alpha? Ignore the fourth channel for now + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else + for (i=0; i < z->s->img_x; ++i) { + out[0] = out[1] = out[2] = y[i]; + out[3] = 255; // not used if n==3 + out += n; + } + } else { + if (is_rgb) { + if (n == 1) + for (i=0; i < z->s->img_x; ++i) + *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + else { + for (i=0; i < z->s->img_x; ++i, out += 2) { + out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + out[1] = 255; + } + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 0) { + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + stbi_uc r = stbi__blinn_8x8(coutput[0][i], m); + stbi_uc g = stbi__blinn_8x8(coutput[1][i], m); + stbi_uc b = stbi__blinn_8x8(coutput[2][i], m); + out[0] = stbi__compute_y(r, g, b); + out[1] = 255; + out += n; + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 2) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]); + out[1] = 255; + out += n; + } + } else { + stbi_uc *y = coutput[0]; + if (n == 1) + for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; + else + for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255; + } + } + } + stbi__cleanup_jpeg(z); + *out_x = z->s->img_x; + *out_y = z->s->img_y; + if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output + return output; + } +} + +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + unsigned char* result; + stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg)); + STBI_NOTUSED(ri); + j->s = s; + stbi__setup_jpeg(j); + result = load_jpeg_image(j, x,y,comp,req_comp); + STBI_FREE(j); + return result; +} + +static int stbi__jpeg_test(stbi__context *s) +{ + int r; + stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg)); + j->s = s; + stbi__setup_jpeg(j); + r = stbi__decode_jpeg_header(j, STBI__SCAN_type); + stbi__rewind(s); + STBI_FREE(j); + return r; +} + +static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) +{ + if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) { + stbi__rewind( j->s ); + return 0; + } + if (x) *x = j->s->img_x; + if (y) *y = j->s->img_y; + if (comp) *comp = j->s->img_n >= 3 ? 3 : 1; + return 1; +} + +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) +{ + int result; + stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg))); + j->s = s; + result = stbi__jpeg_info_raw(j, x, y, comp); + STBI_FREE(j); + return result; +} +#endif + +// public domain zlib decode v0.2 Sean Barrett 2006-11-18 +// simple implementation +// - all input must be provided in an upfront buffer +// - all output is written to a single output buffer (can malloc/realloc) +// performance +// - fast huffman + +#ifndef STBI_NO_ZLIB + +// fast-way is faster to check than jpeg huffman, but slow way is slower +#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables +#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) + +// zlib-style huffman encoding +// (jpegs packs from left, zlib from right, so can't share code) +typedef struct +{ + stbi__uint16 fast[1 << STBI__ZFAST_BITS]; + stbi__uint16 firstcode[16]; + int maxcode[17]; + stbi__uint16 firstsymbol[16]; + stbi_uc size[288]; + stbi__uint16 value[288]; +} stbi__zhuffman; + +stbi_inline static int stbi__bitreverse16(int n) +{ + n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); + n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); + n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); + n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); + return n; +} + +stbi_inline static int stbi__bit_reverse(int v, int bits) +{ + STBI_ASSERT(bits <= 16); + // to bit reverse n bits, reverse 16 and shift + // e.g. 11 bits, bit reverse and shift away 5 + return stbi__bitreverse16(v) >> (16-bits); +} + +static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num) +{ + int i,k=0; + int code, next_code[16], sizes[17]; + + // DEFLATE spec for generating codes + memset(sizes, 0, sizeof(sizes)); + memset(z->fast, 0, sizeof(z->fast)); + for (i=0; i < num; ++i) + ++sizes[sizelist[i]]; + sizes[0] = 0; + for (i=1; i < 16; ++i) + if (sizes[i] > (1 << i)) + return stbi__err("bad sizes", "Corrupt PNG"); + code = 0; + for (i=1; i < 16; ++i) { + next_code[i] = code; + z->firstcode[i] = (stbi__uint16) code; + z->firstsymbol[i] = (stbi__uint16) k; + code = (code + sizes[i]); + if (sizes[i]) + if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG"); + z->maxcode[i] = code << (16-i); // preshift for inner loop + code <<= 1; + k += sizes[i]; + } + z->maxcode[16] = 0x10000; // sentinel + for (i=0; i < num; ++i) { + int s = sizelist[i]; + if (s) { + int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; + stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i); + z->size [c] = (stbi_uc ) s; + z->value[c] = (stbi__uint16) i; + if (s <= STBI__ZFAST_BITS) { + int j = stbi__bit_reverse(next_code[s],s); + while (j < (1 << STBI__ZFAST_BITS)) { + z->fast[j] = fastv; + j += (1 << s); + } + } + ++next_code[s]; + } + } + return 1; +} + +// zlib-from-memory implementation for PNG reading +// because PNG allows splitting the zlib stream arbitrarily, +// and it's annoying structurally to have PNG call ZLIB call PNG, +// we require PNG read all the IDATs and combine them into a single +// memory buffer + +typedef struct +{ + stbi_uc *zbuffer, *zbuffer_end; + int num_bits; + stbi__uint32 code_buffer; + + char *zout; + char *zout_start; + char *zout_end; + int z_expandable; + + stbi__zhuffman z_length, z_distance; +} stbi__zbuf; + +stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z) +{ + if (z->zbuffer >= z->zbuffer_end) return 0; + return *z->zbuffer++; +} + +static void stbi__fill_bits(stbi__zbuf *z) +{ + do { + STBI_ASSERT(z->code_buffer < (1U << z->num_bits)); + z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits; + z->num_bits += 8; + } while (z->num_bits <= 24); +} + +stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n) +{ + unsigned int k; + if (z->num_bits < n) stbi__fill_bits(z); + k = z->code_buffer & ((1 << n) - 1); + z->code_buffer >>= n; + z->num_bits -= n; + return k; +} + +static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s,k; + // not resolved by fast table, so compute it the slow way + // use jpeg approach, which requires MSbits at top + k = stbi__bit_reverse(a->code_buffer, 16); + for (s=STBI__ZFAST_BITS+1; ; ++s) + if (k < z->maxcode[s]) + break; + if (s == 16) return -1; // invalid code! + // code size is s, so: + b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; + STBI_ASSERT(z->size[b] == s); + a->code_buffer >>= s; + a->num_bits -= s; + return z->value[b]; +} + +stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s; + if (a->num_bits < 16) stbi__fill_bits(a); + b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; + if (b) { + s = b >> 9; + a->code_buffer >>= s; + a->num_bits -= s; + return b & 511; + } + return stbi__zhuffman_decode_slowpath(a, z); +} + +static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes +{ + char *q; + int cur, limit, old_limit; + z->zout = zout; + if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); + cur = (int) (z->zout - z->zout_start); + limit = old_limit = (int) (z->zout_end - z->zout_start); + while (cur + n > limit) + limit *= 2; + q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); + STBI_NOTUSED(old_limit); + if (q == NULL) return stbi__err("outofmem", "Out of memory"); + z->zout_start = q; + z->zout = q + cur; + z->zout_end = q + limit; + return 1; +} + +static int stbi__zlength_base[31] = { + 3,4,5,6,7,8,9,10,11,13, + 15,17,19,23,27,31,35,43,51,59, + 67,83,99,115,131,163,195,227,258,0,0 }; + +static int stbi__zlength_extra[31]= +{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; + +static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, +257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; + +static int stbi__zdist_extra[32] = +{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +static int stbi__parse_huffman_block(stbi__zbuf *a) +{ + char *zout = a->zout; + for(;;) { + int z = stbi__zhuffman_decode(a, &a->z_length); + if (z < 256) { + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes + if (zout >= a->zout_end) { + if (!stbi__zexpand(a, zout, 1)) return 0; + zout = a->zout; + } + *zout++ = (char) z; + } else { + stbi_uc *p; + int len,dist; + if (z == 256) { + a->zout = zout; + return 1; + } + z -= 257; + len = stbi__zlength_base[z]; + if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); + z = stbi__zhuffman_decode(a, &a->z_distance); + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); + dist = stbi__zdist_base[z]; + if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); + if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); + if (zout + len > a->zout_end) { + if (!stbi__zexpand(a, zout, len)) return 0; + zout = a->zout; + } + p = (stbi_uc *) (zout - dist); + if (dist == 1) { // run of one byte; common in images. + stbi_uc v = *p; + if (len) { do *zout++ = v; while (--len); } + } else { + if (len) { do *zout++ = *p++; while (--len); } + } + } + } +} + +static int stbi__compute_huffman_codes(stbi__zbuf *a) +{ + static stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + stbi__zhuffman z_codelength; + stbi_uc lencodes[286+32+137];//padding for maximum single op + stbi_uc codelength_sizes[19]; + int i,n; + + int hlit = stbi__zreceive(a,5) + 257; + int hdist = stbi__zreceive(a,5) + 1; + int hclen = stbi__zreceive(a,4) + 4; + int ntot = hlit + hdist; + + memset(codelength_sizes, 0, sizeof(codelength_sizes)); + for (i=0; i < hclen; ++i) { + int s = stbi__zreceive(a,3); + codelength_sizes[length_dezigzag[i]] = (stbi_uc) s; + } + if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; + + n = 0; + while (n < ntot) { + int c = stbi__zhuffman_decode(a, &z_codelength); + if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); + if (c < 16) + lencodes[n++] = (stbi_uc) c; + else { + stbi_uc fill = 0; + if (c == 16) { + c = stbi__zreceive(a,2)+3; + if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG"); + fill = lencodes[n-1]; + } else if (c == 17) + c = stbi__zreceive(a,3)+3; + else { + STBI_ASSERT(c == 18); + c = stbi__zreceive(a,7)+11; + } + if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG"); + memset(lencodes+n, fill, c); + n += c; + } + } + if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG"); + if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; + return 1; +} + +static int stbi__parse_uncompressed_block(stbi__zbuf *a) +{ + stbi_uc header[4]; + int len,nlen,k; + if (a->num_bits & 7) + stbi__zreceive(a, a->num_bits & 7); // discard + // drain the bit-packed data into header + k = 0; + while (a->num_bits > 0) { + header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check + a->code_buffer >>= 8; + a->num_bits -= 8; + } + STBI_ASSERT(a->num_bits == 0); + // now fill header the normal way + while (k < 4) + header[k++] = stbi__zget8(a); + len = header[1] * 256 + header[0]; + nlen = header[3] * 256 + header[2]; + if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG"); + if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG"); + if (a->zout + len > a->zout_end) + if (!stbi__zexpand(a, a->zout, len)) return 0; + memcpy(a->zout, a->zbuffer, len); + a->zbuffer += len; + a->zout += len; + return 1; +} + +static int stbi__parse_zlib_header(stbi__zbuf *a) +{ + int cmf = stbi__zget8(a); + int cm = cmf & 15; + /* int cinfo = cmf >> 4; */ + int flg = stbi__zget8(a); + if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec + if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png + if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png + // window = 1 << (8 + cinfo)... but who cares, we fully buffer output + return 1; +} + +static const stbi_uc stbi__zdefault_length[288] = +{ + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8 +}; +static const stbi_uc stbi__zdefault_distance[32] = +{ + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 +}; +/* +Init algorithm: +{ + int i; // use <= to match clearly with spec + for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; + for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; + for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; + for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; + + for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; +} +*/ + +static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) +{ + int final, type; + if (parse_header) + if (!stbi__parse_zlib_header(a)) return 0; + a->num_bits = 0; + a->code_buffer = 0; + do { + final = stbi__zreceive(a,1); + type = stbi__zreceive(a,2); + if (type == 0) { + if (!stbi__parse_uncompressed_block(a)) return 0; + } else if (type == 3) { + return 0; + } else { + if (type == 1) { + // use fixed code lengths + if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; + } else { + if (!stbi__compute_huffman_codes(a)) return 0; + } + if (!stbi__parse_huffman_block(a)) return 0; + } + } while (!final); + return 1; +} + +static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header) +{ + a->zout_start = obuf; + a->zout = obuf; + a->zout_end = obuf + olen; + a->z_expandable = exp; + + return stbi__parse_zlib(a, parse_header); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, 1)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) +{ + return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 1)) + return (int) (a.zout - a.zout_start); + else + return -1; +} + +STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(16384); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer+len; + if (stbi__do_zlib(&a, p, 16384, 1, 0)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 0)) + return (int) (a.zout - a.zout_start); + else + return -1; +} +#endif + +// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 +// simple implementation +// - only 8-bit samples +// - no CRC checking +// - allocates lots of intermediate memory +// - avoids problem of streaming data between subsystems +// - avoids explicit window management +// performance +// - uses stb_zlib, a PD zlib implementation with fast huffman decoding + +#ifndef STBI_NO_PNG +typedef struct +{ + stbi__uint32 length; + stbi__uint32 type; +} stbi__pngchunk; + +static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) +{ + stbi__pngchunk c; + c.length = stbi__get32be(s); + c.type = stbi__get32be(s); + return c; +} + +static int stbi__check_png_header(stbi__context *s) +{ + static stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; + int i; + for (i=0; i < 8; ++i) + if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG"); + return 1; +} + +typedef struct +{ + stbi__context *s; + stbi_uc *idata, *expanded, *out; + int depth; +} stbi__png; + + +enum { + STBI__F_none=0, + STBI__F_sub=1, + STBI__F_up=2, + STBI__F_avg=3, + STBI__F_paeth=4, + // synthetic filters used for first scanline to avoid needing a dummy row of 0s + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static stbi_uc first_row_filter[5] = +{ + STBI__F_none, + STBI__F_sub, + STBI__F_none, + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static int stbi__paeth(int a, int b, int c) +{ + int p = a + b - c; + int pa = abs(p-a); + int pb = abs(p-b); + int pc = abs(p-c); + if (pa <= pb && pa <= pc) return a; + if (pb <= pc) return b; + return c; +} + +static stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; + +// create the png data from post-deflated data +static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color) +{ + int bytes = (depth == 16? 2 : 1); + stbi__context *s = a->s; + stbi__uint32 i,j,stride = x*out_n*bytes; + stbi__uint32 img_len, img_width_bytes; + int k; + int img_n = s->img_n; // copy it into a local for later + + int output_bytes = out_n*bytes; + int filter_bytes = img_n*bytes; + int width = x; + + STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); + a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into + if (!a->out) return stbi__err("outofmem", "Out of memory"); + + img_width_bytes = (((img_n * x * depth) + 7) >> 3); + img_len = (img_width_bytes + 1) * y; + // we used to check for exact match between raw_len and img_len on non-interlaced PNGs, + // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), + // so just check for raw_len < img_len always. + if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); + + for (j=0; j < y; ++j) { + stbi_uc *cur = a->out + stride*j; + stbi_uc *prior; + int filter = *raw++; + + if (filter > 4) + return stbi__err("invalid filter","Corrupt PNG"); + + if (depth < 8) { + STBI_ASSERT(img_width_bytes <= x); + cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place + filter_bytes = 1; + width = img_width_bytes; + } + prior = cur - stride; // bugfix: need to compute this after 'cur +=' computation above + + // if first row, use special filter that doesn't sample previous row + if (j == 0) filter = first_row_filter[filter]; + + // handle first byte explicitly + for (k=0; k < filter_bytes; ++k) { + switch (filter) { + case STBI__F_none : cur[k] = raw[k]; break; + case STBI__F_sub : cur[k] = raw[k]; break; + case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; + case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); break; + case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); break; + case STBI__F_avg_first : cur[k] = raw[k]; break; + case STBI__F_paeth_first: cur[k] = raw[k]; break; + } + } + + if (depth == 8) { + if (img_n != out_n) + cur[img_n] = 255; // first pixel + raw += img_n; + cur += out_n; + prior += out_n; + } else if (depth == 16) { + if (img_n != out_n) { + cur[filter_bytes] = 255; // first pixel top byte + cur[filter_bytes+1] = 255; // first pixel bottom byte + } + raw += filter_bytes; + cur += output_bytes; + prior += output_bytes; + } else { + raw += 1; + cur += 1; + prior += 1; + } + + // this is a little gross, so that we don't switch per-pixel or per-component + if (depth < 8 || img_n == out_n) { + int nk = (width - 1)*filter_bytes; + #define STBI__CASE(f) \ + case f: \ + for (k=0; k < nk; ++k) + switch (filter) { + // "none" filter turns into a memcpy here; make that explicit. + case STBI__F_none: memcpy(cur, raw, nk); break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); } break; + } + #undef STBI__CASE + raw += nk; + } else { + STBI_ASSERT(img_n+1 == out_n); + #define STBI__CASE(f) \ + case f: \ + for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \ + for (k=0; k < filter_bytes; ++k) + switch (filter) { + STBI__CASE(STBI__F_none) { cur[k] = raw[k]; } break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); } break; + } + #undef STBI__CASE + + // the loop above sets the high byte of the pixels' alpha, but for + // 16 bit png files we also need the low byte set. we'll do that here. + if (depth == 16) { + cur = a->out + stride*j; // start at the beginning of the row again + for (i=0; i < x; ++i,cur+=output_bytes) { + cur[filter_bytes+1] = 255; + } + } + } + } + + // we make a separate pass to expand bits to pixels; for performance, + // this could run two scanlines behind the above code, so it won't + // intefere with filtering but will still be in the cache. + if (depth < 8) { + for (j=0; j < y; ++j) { + stbi_uc *cur = a->out + stride*j; + stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes; + // unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for 1/2/4-bit + // png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that will be skipped in the later loop + stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range + + // note that the final byte might overshoot and write more data than desired. + // we can allocate enough data that this never writes out of memory, but it + // could also overwrite the next scanline. can it overwrite non-empty data + // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel. + // so we need to explicitly clamp the final ones + + if (depth == 4) { + for (k=x*img_n; k >= 2; k-=2, ++in) { + *cur++ = scale * ((*in >> 4) ); + *cur++ = scale * ((*in ) & 0x0f); + } + if (k > 0) *cur++ = scale * ((*in >> 4) ); + } else if (depth == 2) { + for (k=x*img_n; k >= 4; k-=4, ++in) { + *cur++ = scale * ((*in >> 6) ); + *cur++ = scale * ((*in >> 4) & 0x03); + *cur++ = scale * ((*in >> 2) & 0x03); + *cur++ = scale * ((*in ) & 0x03); + } + if (k > 0) *cur++ = scale * ((*in >> 6) ); + if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03); + if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03); + } else if (depth == 1) { + for (k=x*img_n; k >= 8; k-=8, ++in) { + *cur++ = scale * ((*in >> 7) ); + *cur++ = scale * ((*in >> 6) & 0x01); + *cur++ = scale * ((*in >> 5) & 0x01); + *cur++ = scale * ((*in >> 4) & 0x01); + *cur++ = scale * ((*in >> 3) & 0x01); + *cur++ = scale * ((*in >> 2) & 0x01); + *cur++ = scale * ((*in >> 1) & 0x01); + *cur++ = scale * ((*in ) & 0x01); + } + if (k > 0) *cur++ = scale * ((*in >> 7) ); + if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01); + if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01); + if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01); + if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01); + if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01); + if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01); + } + if (img_n != out_n) { + int q; + // insert alpha = 255 + cur = a->out + stride*j; + if (img_n == 1) { + for (q=x-1; q >= 0; --q) { + cur[q*2+1] = 255; + cur[q*2+0] = cur[q]; + } + } else { + STBI_ASSERT(img_n == 3); + for (q=x-1; q >= 0; --q) { + cur[q*4+3] = 255; + cur[q*4+2] = cur[q*3+2]; + cur[q*4+1] = cur[q*3+1]; + cur[q*4+0] = cur[q*3+0]; + } + } + } + } + } else if (depth == 16) { + // force the image data from big-endian to platform-native. + // this is done in a separate pass due to the decoding relying + // on the data being untouched, but could probably be done + // per-line during decode if care is taken. + stbi_uc *cur = a->out; + stbi__uint16 *cur16 = (stbi__uint16*)cur; + + for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) { + *cur16 = (cur[0] << 8) | cur[1]; + } + } + + return 1; +} + +static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) +{ + int bytes = (depth == 16 ? 2 : 1); + int out_bytes = out_n * bytes; + stbi_uc *final; + int p; + if (!interlaced) + return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); + + // de-interlacing + final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); + for (p=0; p < 7; ++p) { + int xorig[] = { 0,4,0,2,0,1,0 }; + int yorig[] = { 0,0,4,0,2,0,1 }; + int xspc[] = { 8,8,4,4,2,2,1 }; + int yspc[] = { 8,8,8,4,4,2,2 }; + int i,j,x,y; + // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 + x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; + y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; + if (x && y) { + stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; + if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { + STBI_FREE(final); + return 0; + } + for (j=0; j < y; ++j) { + for (i=0; i < x; ++i) { + int out_y = j*yspc[p]+yorig[p]; + int out_x = i*xspc[p]+xorig[p]; + memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes, + a->out + (j*x+i)*out_bytes, out_bytes); + } + } + STBI_FREE(a->out); + image_data += img_len; + image_data_len -= img_len; + } + } + a->out = final; + + return 1; +} + +static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + // compute color-based transparency, assuming we've + // already got 255 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i=0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 255); + p += 2; + } + } else { + for (i=0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi__uint16 *p = (stbi__uint16*) z->out; + + // compute color-based transparency, assuming we've + // already got 65535 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i = 0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 65535); + p += 2; + } + } else { + for (i = 0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n) +{ + stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; + stbi_uc *p, *temp_out, *orig = a->out; + + p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0); + if (p == NULL) return stbi__err("outofmem", "Out of memory"); + + // between here and free(out) below, exitting would leak + temp_out = p; + + if (pal_img_n == 3) { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p += 3; + } + } else { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p[3] = palette[n+3]; + p += 4; + } + } + STBI_FREE(a->out); + a->out = temp_out; + + STBI_NOTUSED(len); + + return 1; +} + +static int stbi__unpremultiply_on_load = 0; +static int stbi__de_iphone_flag = 0; + +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag = flag_true_if_should_convert; +} + +static void stbi__de_iphone(stbi__png *z) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + if (s->img_out_n == 3) { // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 3; + } + } else { + STBI_ASSERT(s->img_out_n == 4); + if (stbi__unpremultiply_on_load) { + // convert bgr to rgb and unpremultiply + for (i=0; i < pixel_count; ++i) { + stbi_uc a = p[3]; + stbi_uc t = p[0]; + if (a) { + stbi_uc half = a / 2; + p[0] = (p[2] * 255 + half) / a; + p[1] = (p[1] * 255 + half) / a; + p[2] = ( t * 255 + half) / a; + } else { + p[0] = p[2]; + p[2] = t; + } + p += 4; + } + } else { + // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 4; + } + } + } +} + +#define STBI__PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) + +static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) +{ + stbi_uc palette[1024], pal_img_n=0; + stbi_uc has_trans=0, tc[3]; + stbi__uint16 tc16[3]; + stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; + int first=1,k,interlace=0, color=0, is_iphone=0; + stbi__context *s = z->s; + + z->expanded = NULL; + z->idata = NULL; + z->out = NULL; + + if (!stbi__check_png_header(s)) return 0; + + if (scan == STBI__SCAN_type) return 1; + + for (;;) { + stbi__pngchunk c = stbi__get_chunk_header(s); + switch (c.type) { + case STBI__PNG_TYPE('C','g','B','I'): + is_iphone = 1; + stbi__skip(s, c.length); + break; + case STBI__PNG_TYPE('I','H','D','R'): { + int comp,filter; + if (!first) return stbi__err("multiple IHDR","Corrupt PNG"); + first = 0; + if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); + s->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); + s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); + z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only"); + color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); + comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); + filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG"); + interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG"); + if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG"); + if (!pal_img_n) { + s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); + if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); + if (scan == STBI__SCAN_header) return 1; + } else { + // if paletted, then pal_n is our final components, and + // img_n is # components to decompress/filter. + s->img_n = 1; + if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG"); + // if SCAN_header, have to scan to see if we have a tRNS + } + break; + } + + case STBI__PNG_TYPE('P','L','T','E'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG"); + pal_len = c.length / 3; + if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG"); + for (i=0; i < pal_len; ++i) { + palette[i*4+0] = stbi__get8(s); + palette[i*4+1] = stbi__get8(s); + palette[i*4+2] = stbi__get8(s); + palette[i*4+3] = 255; + } + break; + } + + case STBI__PNG_TYPE('t','R','N','S'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG"); + if (pal_img_n) { + if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; } + if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG"); + if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG"); + pal_img_n = 4; + for (i=0; i < c.length; ++i) + palette[i*4+3] = stbi__get8(s); + } else { + if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG"); + if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); + has_trans = 1; + if (z->depth == 16) { + for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is + } else { + for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger + } + } + break; + } + + case STBI__PNG_TYPE('I','D','A','T'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); + if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; } + if ((int)(ioff + c.length) < (int)ioff) return 0; + if (ioff + c.length > idata_limit) { + stbi__uint32 idata_limit_old = idata_limit; + stbi_uc *p; + if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; + while (ioff + c.length > idata_limit) + idata_limit *= 2; + STBI_NOTUSED(idata_limit_old); + p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); + z->idata = p; + } + if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); + ioff += c.length; + break; + } + + case STBI__PNG_TYPE('I','E','N','D'): { + stbi__uint32 raw_len, bpl; + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (scan != STBI__SCAN_load) return 1; + if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); + // initial guess for decoded data size to avoid unnecessary reallocs + bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component + raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; + z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone); + if (z->expanded == NULL) return 0; // zlib should set error + STBI_FREE(z->idata); z->idata = NULL; + if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) + s->img_out_n = s->img_n+1; + else + s->img_out_n = s->img_n; + if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; + if (has_trans) { + if (z->depth == 16) { + if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; + } else { + if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; + } + } + if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) + stbi__de_iphone(z); + if (pal_img_n) { + // pal_img_n == 3 or 4 + s->img_n = pal_img_n; // record the actual colors we had + s->img_out_n = pal_img_n; + if (req_comp >= 3) s->img_out_n = req_comp; + if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) + return 0; + } else if (has_trans) { + // non-paletted image with tRNS -> source image has (constant) alpha + ++s->img_n; + } + STBI_FREE(z->expanded); z->expanded = NULL; + return 1; + } + + default: + // if critical, fail + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if ((c.type & (1 << 29)) == 0) { + #ifndef STBI_NO_FAILURE_STRINGS + // not threadsafe + static char invalid_chunk[] = "XXXX PNG chunk not known"; + invalid_chunk[0] = STBI__BYTECAST(c.type >> 24); + invalid_chunk[1] = STBI__BYTECAST(c.type >> 16); + invalid_chunk[2] = STBI__BYTECAST(c.type >> 8); + invalid_chunk[3] = STBI__BYTECAST(c.type >> 0); + #endif + return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type"); + } + stbi__skip(s, c.length); + break; + } + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + } +} + +static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri) +{ + void *result=NULL; + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { + if (p->depth < 8) + ri->bits_per_channel = 8; + else + ri->bits_per_channel = p->depth; + result = p->out; + p->out = NULL; + if (req_comp && req_comp != p->s->img_out_n) { + if (ri->bits_per_channel == 8) + result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + else + result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + p->s->img_out_n = req_comp; + if (result == NULL) return result; + } + *x = p->s->img_x; + *y = p->s->img_y; + if (n) *n = p->s->img_n; + } + STBI_FREE(p->out); p->out = NULL; + STBI_FREE(p->expanded); p->expanded = NULL; + STBI_FREE(p->idata); p->idata = NULL; + + return result; +} + +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi__png p; + p.s = s; + return stbi__do_png(&p, x,y,comp,req_comp, ri); +} + +static int stbi__png_test(stbi__context *s) +{ + int r; + r = stbi__check_png_header(s); + stbi__rewind(s); + return r; +} + +static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp) +{ + if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { + stbi__rewind( p->s ); + return 0; + } + if (x) *x = p->s->img_x; + if (y) *y = p->s->img_y; + if (comp) *comp = p->s->img_n; + return 1; +} + +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__png p; + p.s = s; + return stbi__png_info_raw(&p, x, y, comp); +} +#endif + +// Microsoft/Windows BMP image + +#ifndef STBI_NO_BMP +static int stbi__bmp_test_raw(stbi__context *s) +{ + int r; + int sz; + if (stbi__get8(s) != 'B') return 0; + if (stbi__get8(s) != 'M') return 0; + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + stbi__get32le(s); // discard data offset + sz = stbi__get32le(s); + r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124); + return r; +} + +static int stbi__bmp_test(stbi__context *s) +{ + int r = stbi__bmp_test_raw(s); + stbi__rewind(s); + return r; +} + + +// returns 0..31 for the highest set bit +static int stbi__high_bit(unsigned int z) +{ + int n=0; + if (z == 0) return -1; + if (z >= 0x10000) n += 16, z >>= 16; + if (z >= 0x00100) n += 8, z >>= 8; + if (z >= 0x00010) n += 4, z >>= 4; + if (z >= 0x00004) n += 2, z >>= 2; + if (z >= 0x00002) n += 1, z >>= 1; + return n; +} + +static int stbi__bitcount(unsigned int a) +{ + a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 + a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits + a = (a + (a >> 8)); // max 16 per 8 bits + a = (a + (a >> 16)); // max 32 per 8 bits + return a & 0xff; +} + +static int stbi__shiftsigned(int v, int shift, int bits) +{ + int result; + int z=0; + + if (shift < 0) v <<= -shift; + else v >>= shift; + result = v; + + z = bits; + while (z < 8) { + result += v >> z; + z += bits; + } + return result; +} + +typedef struct +{ + int bpp, offset, hsz; + unsigned int mr,mg,mb,ma, all_a; +} stbi__bmp_data; + +static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) +{ + int hsz; + if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP"); + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + info->offset = stbi__get32le(s); + info->hsz = hsz = stbi__get32le(s); + info->mr = info->mg = info->mb = info->ma = 0; + + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); + if (hsz == 12) { + s->img_x = stbi__get16le(s); + s->img_y = stbi__get16le(s); + } else { + s->img_x = stbi__get32le(s); + s->img_y = stbi__get32le(s); + } + if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP"); + info->bpp = stbi__get16le(s); + if (info->bpp == 1) return stbi__errpuc("monochrome", "BMP type not supported: 1-bit"); + if (hsz != 12) { + int compress = stbi__get32le(s); + if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); + stbi__get32le(s); // discard sizeof + stbi__get32le(s); // discard hres + stbi__get32le(s); // discard vres + stbi__get32le(s); // discard colorsused + stbi__get32le(s); // discard max important + if (hsz == 40 || hsz == 56) { + if (hsz == 56) { + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + } + if (info->bpp == 16 || info->bpp == 32) { + if (compress == 0) { + if (info->bpp == 32) { + info->mr = 0xffu << 16; + info->mg = 0xffu << 8; + info->mb = 0xffu << 0; + info->ma = 0xffu << 24; + info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 + } else { + info->mr = 31u << 10; + info->mg = 31u << 5; + info->mb = 31u << 0; + } + } else if (compress == 3) { + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + // not documented, but generated by photoshop and handled by mspaint + if (info->mr == info->mg && info->mg == info->mb) { + // ?!?!? + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else { + int i; + if (hsz != 108 && hsz != 124) + return stbi__errpuc("bad BMP", "bad BMP"); + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->ma = stbi__get32le(s); + stbi__get32le(s); // discard color space + for (i=0; i < 12; ++i) + stbi__get32le(s); // discard color space parameters + if (hsz == 124) { + stbi__get32le(s); // discard rendering intent + stbi__get32le(s); // discard offset of profile data + stbi__get32le(s); // discard size of profile data + stbi__get32le(s); // discard reserved + } + } + } + return (void *) 1; +} + + +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + unsigned int mr=0,mg=0,mb=0,ma=0, all_a; + stbi_uc pal[256][4]; + int psize=0,i,j,width; + int flip_vertically, pad, target; + stbi__bmp_data info; + STBI_NOTUSED(ri); + + info.all_a = 255; + if (stbi__bmp_parse_header(s, &info) == NULL) + return NULL; // error code already set + + flip_vertically = ((int) s->img_y) > 0; + s->img_y = abs((int) s->img_y); + + mr = info.mr; + mg = info.mg; + mb = info.mb; + ma = info.ma; + all_a = info.all_a; + + if (info.hsz == 12) { + if (info.bpp < 24) + psize = (info.offset - 14 - 24) / 3; + } else { + if (info.bpp < 16) + psize = (info.offset - 14 - info.hsz) >> 2; + } + + s->img_n = ma ? 4 : 3; + if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 + target = req_comp; + else + target = s->img_n; // if they want monochrome, we'll post-convert + + // sanity-check size + if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "Corrupt BMP"); + + out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + if (info.bpp < 16) { + int z=0; + if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); } + for (i=0; i < psize; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + if (info.hsz != 12) stbi__get8(s); + pal[i][3] = 255; + } + stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); + if (info.bpp == 4) width = (s->img_x + 1) >> 1; + else if (info.bpp == 8) width = s->img_x; + else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } + pad = (-width)&3; + for (j=0; j < (int) s->img_y; ++j) { + for (i=0; i < (int) s->img_x; i += 2) { + int v=stbi__get8(s),v2=0; + if (info.bpp == 4) { + v2 = v & 15; + v >>= 4; + } + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + v = (info.bpp == 8) ? stbi__get8(s) : v2; + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + } + stbi__skip(s, pad); + } + } else { + int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; + int z = 0; + int easy=0; + stbi__skip(s, info.offset - 14 - info.hsz); + if (info.bpp == 24) width = 3 * s->img_x; + else if (info.bpp == 16) width = 2*s->img_x; + else /* bpp = 32 and pad = 0 */ width=0; + pad = (-width) & 3; + if (info.bpp == 24) { + easy = 1; + } else if (info.bpp == 32) { + if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) + easy = 2; + } + if (!easy) { + if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + // right shift amt to put high bit in position #7 + rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr); + gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg); + bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb); + ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma); + } + for (j=0; j < (int) s->img_y; ++j) { + if (easy) { + for (i=0; i < (int) s->img_x; ++i) { + unsigned char a; + out[z+2] = stbi__get8(s); + out[z+1] = stbi__get8(s); + out[z+0] = stbi__get8(s); + z += 3; + a = (easy == 2 ? stbi__get8(s) : 255); + all_a |= a; + if (target == 4) out[z++] = a; + } + } else { + int bpp = info.bpp; + for (i=0; i < (int) s->img_x; ++i) { + stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s)); + int a; + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); + a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); + all_a |= a; + if (target == 4) out[z++] = STBI__BYTECAST(a); + } + } + stbi__skip(s, pad); + } + } + + // if alpha channel is all 0s, replace with all 255s + if (target == 4 && all_a == 0) + for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4) + out[i] = 255; + + if (flip_vertically) { + stbi_uc t; + for (j=0; j < (int) s->img_y>>1; ++j) { + stbi_uc *p1 = out + j *s->img_x*target; + stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; + for (i=0; i < (int) s->img_x*target; ++i) { + t = p1[i], p1[i] = p2[i], p2[i] = t; + } + } + } + + if (req_comp && req_comp != target) { + out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + return out; +} +#endif + +// Targa Truevision - TGA +// by Jonathan Dummer +#ifndef STBI_NO_TGA +// returns STBI_rgb or whatever, 0 on error +static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16) +{ + // only RGB or RGBA (incl. 16bit) or grey allowed + if(is_rgb16) *is_rgb16 = 0; + switch(bits_per_pixel) { + case 8: return STBI_grey; + case 16: if(is_grey) return STBI_grey_alpha; + // else: fall-through + case 15: if(is_rgb16) *is_rgb16 = 1; + return STBI_rgb; + case 24: // fall-through + case 32: return bits_per_pixel/8; + default: return 0; + } +} + +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) +{ + int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp; + int sz, tga_colormap_type; + stbi__get8(s); // discard Offset + tga_colormap_type = stbi__get8(s); // colormap type + if( tga_colormap_type > 1 ) { + stbi__rewind(s); + return 0; // only RGB or indexed allowed + } + tga_image_type = stbi__get8(s); // image type + if ( tga_colormap_type == 1 ) { // colormapped (paletted) image + if (tga_image_type != 1 && tga_image_type != 9) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip image x and y origin + tga_colormap_bpp = sz; + } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE + if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) { + stbi__rewind(s); + return 0; // only RGB or grey allowed, +/- RLE + } + stbi__skip(s,9); // skip colormap specification and image x/y origin + tga_colormap_bpp = 0; + } + tga_w = stbi__get16le(s); + if( tga_w < 1 ) { + stbi__rewind(s); + return 0; // test width + } + tga_h = stbi__get16le(s); + if( tga_h < 1 ) { + stbi__rewind(s); + return 0; // test height + } + tga_bits_per_pixel = stbi__get8(s); // bits per pixel + stbi__get8(s); // ignore alpha bits + if (tga_colormap_bpp != 0) { + if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) { + // when using a colormap, tga_bits_per_pixel is the size of the indexes + // I don't think anything but 8 or 16bit indexes makes sense + stbi__rewind(s); + return 0; + } + tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL); + } else { + tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL); + } + if(!tga_comp) { + stbi__rewind(s); + return 0; + } + if (x) *x = tga_w; + if (y) *y = tga_h; + if (comp) *comp = tga_comp; + return 1; // seems to have passed everything +} + +static int stbi__tga_test(stbi__context *s) +{ + int res = 0; + int sz, tga_color_type; + stbi__get8(s); // discard Offset + tga_color_type = stbi__get8(s); // color type + if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed + sz = stbi__get8(s); // image type + if ( tga_color_type == 1 ) { // colormapped (paletted) image + if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9 + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + stbi__skip(s,4); // skip image x and y origin + } else { // "normal" image w/o colormap + if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE + stbi__skip(s,9); // skip colormap specification and image x/y origin + } + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height + sz = stbi__get8(s); // bits per pixel + if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + + res = 1; // if we got this far, everything's good and we can return 1 instead of 0 + +errorEnd: + stbi__rewind(s); + return res; +} + +// read 16bit value and convert to 24bit RGB +static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out) +{ + stbi__uint16 px = (stbi__uint16)stbi__get16le(s); + stbi__uint16 fiveBitMask = 31; + // we have 3 channels with 5bits each + int r = (px >> 10) & fiveBitMask; + int g = (px >> 5) & fiveBitMask; + int b = px & fiveBitMask; + // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later + out[0] = (stbi_uc)((r * 255)/31); + out[1] = (stbi_uc)((g * 255)/31); + out[2] = (stbi_uc)((b * 255)/31); + + // some people claim that the most significant bit might be used for alpha + // (possibly if an alpha-bit is set in the "image descriptor byte") + // but that only made 16bit test images completely translucent.. + // so let's treat all 15 and 16bit TGAs as RGB with no alpha. +} + +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + // read in the TGA header stuff + int tga_offset = stbi__get8(s); + int tga_indexed = stbi__get8(s); + int tga_image_type = stbi__get8(s); + int tga_is_RLE = 0; + int tga_palette_start = stbi__get16le(s); + int tga_palette_len = stbi__get16le(s); + int tga_palette_bits = stbi__get8(s); + int tga_x_origin = stbi__get16le(s); + int tga_y_origin = stbi__get16le(s); + int tga_width = stbi__get16le(s); + int tga_height = stbi__get16le(s); + int tga_bits_per_pixel = stbi__get8(s); + int tga_comp, tga_rgb16=0; + int tga_inverted = stbi__get8(s); + // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) + // image data + unsigned char *tga_data; + unsigned char *tga_palette = NULL; + int i, j; + unsigned char raw_data[4] = {0}; + int RLE_count = 0; + int RLE_repeating = 0; + int read_next_pixel = 1; + STBI_NOTUSED(ri); + + // do a tiny bit of precessing + if ( tga_image_type >= 8 ) + { + tga_image_type -= 8; + tga_is_RLE = 1; + } + tga_inverted = 1 - ((tga_inverted >> 5) & 1); + + // If I'm paletted, then I'll use the number of bits from the palette + if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16); + else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16); + + if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency + return stbi__errpuc("bad format", "Can't find out TGA pixelformat"); + + // tga info + *x = tga_width; + *y = tga_height; + if (comp) *comp = tga_comp; + + if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0)) + return stbi__errpuc("too large", "Corrupt TGA"); + + tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0); + if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); + + // skip to the data's starting position (offset usually = 0) + stbi__skip(s, tga_offset ); + + if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) { + for (i=0; i < tga_height; ++i) { + int row = tga_inverted ? tga_height -i - 1 : i; + stbi_uc *tga_row = tga_data + row*tga_width*tga_comp; + stbi__getn(s, tga_row, tga_width * tga_comp); + } + } else { + // do I need to load a palette? + if ( tga_indexed) + { + // any data to skip? (offset usually = 0) + stbi__skip(s, tga_palette_start ); + // load the palette + tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0); + if (!tga_palette) { + STBI_FREE(tga_data); + return stbi__errpuc("outofmem", "Out of memory"); + } + if (tga_rgb16) { + stbi_uc *pal_entry = tga_palette; + STBI_ASSERT(tga_comp == STBI_rgb); + for (i=0; i < tga_palette_len; ++i) { + stbi__tga_read_rgb16(s, pal_entry); + pal_entry += tga_comp; + } + } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) { + STBI_FREE(tga_data); + STBI_FREE(tga_palette); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + } + // load the data + for (i=0; i < tga_width * tga_height; ++i) + { + // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? + if ( tga_is_RLE ) + { + if ( RLE_count == 0 ) + { + // yep, get the next byte as a RLE command + int RLE_cmd = stbi__get8(s); + RLE_count = 1 + (RLE_cmd & 127); + RLE_repeating = RLE_cmd >> 7; + read_next_pixel = 1; + } else if ( !RLE_repeating ) + { + read_next_pixel = 1; + } + } else + { + read_next_pixel = 1; + } + // OK, if I need to read a pixel, do it now + if ( read_next_pixel ) + { + // load however much data we did have + if ( tga_indexed ) + { + // read in index, then perform the lookup + int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s); + if ( pal_idx >= tga_palette_len ) { + // invalid index + pal_idx = 0; + } + pal_idx *= tga_comp; + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = tga_palette[pal_idx+j]; + } + } else if(tga_rgb16) { + STBI_ASSERT(tga_comp == STBI_rgb); + stbi__tga_read_rgb16(s, raw_data); + } else { + // read in the data raw + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = stbi__get8(s); + } + } + // clear the reading flag for the next pixel + read_next_pixel = 0; + } // end of reading a pixel + + // copy data + for (j = 0; j < tga_comp; ++j) + tga_data[i*tga_comp+j] = raw_data[j]; + + // in case we're in RLE mode, keep counting down + --RLE_count; + } + // do I need to invert the image? + if ( tga_inverted ) + { + for (j = 0; j*2 < tga_height; ++j) + { + int index1 = j * tga_width * tga_comp; + int index2 = (tga_height - 1 - j) * tga_width * tga_comp; + for (i = tga_width * tga_comp; i > 0; --i) + { + unsigned char temp = tga_data[index1]; + tga_data[index1] = tga_data[index2]; + tga_data[index2] = temp; + ++index1; + ++index2; + } + } + } + // clear my palette, if I had one + if ( tga_palette != NULL ) + { + STBI_FREE( tga_palette ); + } + } + + // swap RGB - if the source data was RGB16, it already is in the right order + if (tga_comp >= 3 && !tga_rgb16) + { + unsigned char* tga_pixel = tga_data; + for (i=0; i < tga_width * tga_height; ++i) + { + unsigned char temp = tga_pixel[0]; + tga_pixel[0] = tga_pixel[2]; + tga_pixel[2] = temp; + tga_pixel += tga_comp; + } + } + + // convert to target component count + if (req_comp && req_comp != tga_comp) + tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height); + + // the things I do to get rid of an error message, and yet keep + // Microsoft's C compilers happy... [8^( + tga_palette_start = tga_palette_len = tga_palette_bits = + tga_x_origin = tga_y_origin = 0; + // OK, done + return tga_data; +} +#endif + +// ************************************************************************************************* +// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s) +{ + int r = (stbi__get32be(s) == 0x38425053); + stbi__rewind(s); + return r; +} + +static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount) +{ + int count, nleft, len; + + count = 0; + while ((nleft = pixelCount - count) > 0) { + len = stbi__get8(s); + if (len == 128) { + // No-op. + } else if (len < 128) { + // Copy next len+1 bytes literally. + len++; + if (len > nleft) return 0; // corrupt data + count += len; + while (len) { + *p = stbi__get8(s); + p += 4; + len--; + } + } else if (len > 128) { + stbi_uc val; + // Next -len+1 bytes in the dest are replicated from next source byte. + // (Interpret len as a negative 8-bit int.) + len = 257 - len; + if (len > nleft) return 0; // corrupt data + val = stbi__get8(s); + count += len; + while (len) { + *p = val; + p += 4; + len--; + } + } + } + + return 1; +} + +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + int pixelCount; + int channelCount, compression; + int channel, i; + int bitdepth; + int w,h; + stbi_uc *out; + STBI_NOTUSED(ri); + + // Check identifier + if (stbi__get32be(s) != 0x38425053) // "8BPS" + return stbi__errpuc("not PSD", "Corrupt PSD image"); + + // Check file type version. + if (stbi__get16be(s) != 1) + return stbi__errpuc("wrong version", "Unsupported version of PSD image"); + + // Skip 6 reserved bytes. + stbi__skip(s, 6 ); + + // Read the number of channels (R, G, B, A, etc). + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) + return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image"); + + // Read the rows and columns of the image. + h = stbi__get32be(s); + w = stbi__get32be(s); + + // Make sure the depth is 8 bits. + bitdepth = stbi__get16be(s); + if (bitdepth != 8 && bitdepth != 16) + return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit"); + + // Make sure the color mode is RGB. + // Valid options are: + // 0: Bitmap + // 1: Grayscale + // 2: Indexed color + // 3: RGB color + // 4: CMYK color + // 7: Multichannel + // 8: Duotone + // 9: Lab color + if (stbi__get16be(s) != 3) + return stbi__errpuc("wrong color format", "PSD is not in RGB color format"); + + // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) + stbi__skip(s,stbi__get32be(s) ); + + // Skip the image resources. (resolution, pen tool paths, etc) + stbi__skip(s, stbi__get32be(s) ); + + // Skip the reserved data. + stbi__skip(s, stbi__get32be(s) ); + + // Find out if the data is compressed. + // Known values: + // 0: no compression + // 1: RLE compressed + compression = stbi__get16be(s); + if (compression > 1) + return stbi__errpuc("bad compression", "PSD has an unknown compression format"); + + // Check size + if (!stbi__mad3sizes_valid(4, w, h, 0)) + return stbi__errpuc("too large", "Corrupt PSD"); + + // Create the destination image. + + if (!compression && bitdepth == 16 && bpc == 16) { + out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0); + ri->bits_per_channel = 16; + } else + out = (stbi_uc *) stbi__malloc(4 * w*h); + + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + pixelCount = w*h; + + // Initialize the data to zero. + //memset( out, 0, pixelCount * 4 ); + + // Finally, the image data. + if (compression) { + // RLE as used by .PSD and .TIFF + // Loop until you get the number of unpacked bytes you are expecting: + // Read the next source byte into n. + // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. + // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. + // Else if n is 128, noop. + // Endloop + + // The RLE-compressed data is preceeded by a 2-byte data count for each row in the data, + // which we're going to just skip. + stbi__skip(s, h * channelCount * 2 ); + + // Read the RLE data by channel. + for (channel = 0; channel < 4; channel++) { + stbi_uc *p; + + p = out+channel; + if (channel >= channelCount) { + // Fill this channel with default data. + for (i = 0; i < pixelCount; i++, p += 4) + *p = (channel == 3 ? 255 : 0); + } else { + // Read the RLE data. + if (!stbi__psd_decode_rle(s, p, pixelCount)) { + STBI_FREE(out); + return stbi__errpuc("corrupt", "bad RLE data"); + } + } + } + + } else { + // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) + // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. + + // Read the data by channel. + for (channel = 0; channel < 4; channel++) { + if (channel >= channelCount) { + // Fill this channel with default data. + if (bitdepth == 16 && bpc == 16) { + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + stbi__uint16 val = channel == 3 ? 65535 : 0; + for (i = 0; i < pixelCount; i++, q += 4) + *q = val; + } else { + stbi_uc *p = out+channel; + stbi_uc val = channel == 3 ? 255 : 0; + for (i = 0; i < pixelCount; i++, p += 4) + *p = val; + } + } else { + if (ri->bits_per_channel == 16) { // output bpc + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + for (i = 0; i < pixelCount; i++, q += 4) + *q = (stbi__uint16) stbi__get16be(s); + } else { + stbi_uc *p = out+channel; + if (bitdepth == 16) { // input bpc + for (i = 0; i < pixelCount; i++, p += 4) + *p = (stbi_uc) (stbi__get16be(s) >> 8); + } else { + for (i = 0; i < pixelCount; i++, p += 4) + *p = stbi__get8(s); + } + } + } + } + } + + // remove weird white matte from PSD + if (channelCount >= 4) { + if (ri->bits_per_channel == 16) { + for (i=0; i < w*h; ++i) { + stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i; + if (pixel[3] != 0 && pixel[3] != 65535) { + float a = pixel[3] / 65535.0f; + float ra = 1.0f / a; + float inv_a = 65535.0f * (1 - ra); + pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a); + pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a); + pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a); + } + } + } else { + for (i=0; i < w*h; ++i) { + unsigned char *pixel = out + 4*i; + if (pixel[3] != 0 && pixel[3] != 255) { + float a = pixel[3] / 255.0f; + float ra = 1.0f / a; + float inv_a = 255.0f * (1 - ra); + pixel[0] = (unsigned char) (pixel[0]*ra + inv_a); + pixel[1] = (unsigned char) (pixel[1]*ra + inv_a); + pixel[2] = (unsigned char) (pixel[2]*ra + inv_a); + } + } + } + } + + // convert to desired output format + if (req_comp && req_comp != 4) { + if (ri->bits_per_channel == 16) + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h); + else + out = stbi__convert_format(out, 4, req_comp, w, h); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + if (comp) *comp = 4; + *y = h; + *x = w; + + return out; +} +#endif + +// ************************************************************************************************* +// Softimage PIC loader +// by Tom Seddon +// +// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format +// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ + +#ifndef STBI_NO_PIC +static int stbi__pic_is4(stbi__context *s,const char *str) +{ + int i; + for (i=0; i<4; ++i) + if (stbi__get8(s) != (stbi_uc)str[i]) + return 0; + + return 1; +} + +static int stbi__pic_test_core(stbi__context *s) +{ + int i; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) + return 0; + + for(i=0;i<84;++i) + stbi__get8(s); + + if (!stbi__pic_is4(s,"PICT")) + return 0; + + return 1; +} + +typedef struct +{ + stbi_uc size,type,channel; +} stbi__pic_packet; + +static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest) +{ + int mask=0x80, i; + + for (i=0; i<4; ++i, mask>>=1) { + if (channel & mask) { + if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short"); + dest[i]=stbi__get8(s); + } + } + + return dest; +} + +static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src) +{ + int mask=0x80,i; + + for (i=0;i<4; ++i, mask>>=1) + if (channel&mask) + dest[i]=src[i]; +} + +static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result) +{ + int act_comp=0,num_packets=0,y,chained; + stbi__pic_packet packets[10]; + + // this will (should...) cater for even some bizarre stuff like having data + // for the same channel in multiple packets. + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return stbi__errpuc("bad format","too many packets"); + + packet = &packets[num_packets++]; + + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + + act_comp |= packet->channel; + + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)"); + if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp"); + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? + + for(y=0; ytype) { + default: + return stbi__errpuc("bad format","packet has bad compression type"); + + case 0: {//uncompressed + int x; + + for(x=0;xchannel,dest)) + return 0; + break; + } + + case 1://Pure RLE + { + int left=width, i; + + while (left>0) { + stbi_uc count,value[4]; + + count=stbi__get8(s); + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)"); + + if (count > left) + count = (stbi_uc) left; + + if (!stbi__readval(s,packet->channel,value)) return 0; + + for(i=0; ichannel,dest,value); + left -= count; + } + } + break; + + case 2: {//Mixed RLE + int left=width; + while (left>0) { + int count = stbi__get8(s), i; + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)"); + + if (count >= 128) { // Repeated + stbi_uc value[4]; + + if (count==128) + count = stbi__get16be(s); + else + count -= 127; + if (count > left) + return stbi__errpuc("bad file","scanline overrun"); + + if (!stbi__readval(s,packet->channel,value)) + return 0; + + for(i=0;ichannel,dest,value); + } else { // Raw + ++count; + if (count>left) return stbi__errpuc("bad file","scanline overrun"); + + for(i=0;ichannel,dest)) + return 0; + } + left-=count; + } + break; + } + } + } + } + + return result; +} + +static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri) +{ + stbi_uc *result; + int i, x,y, internal_comp; + STBI_NOTUSED(ri); + + if (!comp) comp = &internal_comp; + + for (i=0; i<92; ++i) + stbi__get8(s); + + x = stbi__get16be(s); + y = stbi__get16be(s); + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); + if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode"); + + stbi__get32be(s); //skip `ratio' + stbi__get16be(s); //skip `fields' + stbi__get16be(s); //skip `pad' + + // intermediate buffer is RGBA + result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0); + memset(result, 0xff, x*y*4); + + if (!stbi__pic_load_core(s,x,y,comp, result)) { + STBI_FREE(result); + result=0; + } + *px = x; + *py = y; + if (req_comp == 0) req_comp = *comp; + result=stbi__convert_format(result,4,req_comp,x,y); + + return result; +} + +static int stbi__pic_test(stbi__context *s) +{ + int r = stbi__pic_test_core(s); + stbi__rewind(s); + return r; +} +#endif + +// ************************************************************************************************* +// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb + +#ifndef STBI_NO_GIF +typedef struct +{ + stbi__int16 prefix; + stbi_uc first; + stbi_uc suffix; +} stbi__gif_lzw; + +typedef struct +{ + int w,h; + stbi_uc *out, *old_out; // output buffer (always 4 components) + int flags, bgindex, ratio, transparent, eflags, delay; + stbi_uc pal[256][4]; + stbi_uc lpal[256][4]; + stbi__gif_lzw codes[4096]; + stbi_uc *color_table; + int parse, step; + int lflags; + int start_x, start_y; + int max_x, max_y; + int cur_x, cur_y; + int line_size; +} stbi__gif; + +static int stbi__gif_test_raw(stbi__context *s) +{ + int sz; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0; + sz = stbi__get8(s); + if (sz != '9' && sz != '7') return 0; + if (stbi__get8(s) != 'a') return 0; + return 1; +} + +static int stbi__gif_test(stbi__context *s) +{ + int r = stbi__gif_test_raw(s); + stbi__rewind(s); + return r; +} + +static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp) +{ + int i; + for (i=0; i < num_entries; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + pal[i][3] = transp == i ? 0 : 255; + } +} + +static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info) +{ + stbi_uc version; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') + return stbi__err("not GIF", "Corrupt GIF"); + + version = stbi__get8(s); + if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF"); + if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); + + stbi__g_failure_reason = ""; + g->w = stbi__get16le(s); + g->h = stbi__get16le(s); + g->flags = stbi__get8(s); + g->bgindex = stbi__get8(s); + g->ratio = stbi__get8(s); + g->transparent = -1; + + if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments + + if (is_info) return 1; + + if (g->flags & 0x80) + stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1); + + return 1; +} + +static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); + if (!stbi__gif_header(s, g, comp, 1)) { + STBI_FREE(g); + stbi__rewind( s ); + return 0; + } + if (x) *x = g->w; + if (y) *y = g->h; + STBI_FREE(g); + return 1; +} + +static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) +{ + stbi_uc *p, *c; + + // recurse to decode the prefixes, since the linked-list is backwards, + // and working backwards through an interleaved image would be nasty + if (g->codes[code].prefix >= 0) + stbi__out_gif_code(g, g->codes[code].prefix); + + if (g->cur_y >= g->max_y) return; + + p = &g->out[g->cur_x + g->cur_y]; + c = &g->color_table[g->codes[code].suffix * 4]; + + if (c[3] >= 128) { + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = c[3]; + } + g->cur_x += 4; + + if (g->cur_x >= g->max_x) { + g->cur_x = g->start_x; + g->cur_y += g->step; + + while (g->cur_y >= g->max_y && g->parse > 0) { + g->step = (1 << g->parse) * g->line_size; + g->cur_y = g->start_y + (g->step >> 1); + --g->parse; + } + } +} + +static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) +{ + stbi_uc lzw_cs; + stbi__int32 len, init_code; + stbi__uint32 first; + stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; + stbi__gif_lzw *p; + + lzw_cs = stbi__get8(s); + if (lzw_cs > 12) return NULL; + clear = 1 << lzw_cs; + first = 1; + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + bits = 0; + valid_bits = 0; + for (init_code = 0; init_code < clear; init_code++) { + g->codes[init_code].prefix = -1; + g->codes[init_code].first = (stbi_uc) init_code; + g->codes[init_code].suffix = (stbi_uc) init_code; + } + + // support no starting clear code + avail = clear+2; + oldcode = -1; + + len = 0; + for(;;) { + if (valid_bits < codesize) { + if (len == 0) { + len = stbi__get8(s); // start new block + if (len == 0) + return g->out; + } + --len; + bits |= (stbi__int32) stbi__get8(s) << valid_bits; + valid_bits += 8; + } else { + stbi__int32 code = bits & codemask; + bits >>= codesize; + valid_bits -= codesize; + // @OPTIMIZE: is there some way we can accelerate the non-clear path? + if (code == clear) { // clear code + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + avail = clear + 2; + oldcode = -1; + first = 0; + } else if (code == clear + 1) { // end of stream code + stbi__skip(s, len); + while ((len = stbi__get8(s)) > 0) + stbi__skip(s,len); + return g->out; + } else if (code <= avail) { + if (first) return stbi__errpuc("no clear code", "Corrupt GIF"); + + if (oldcode >= 0) { + p = &g->codes[avail++]; + if (avail > 4096) return stbi__errpuc("too many codes", "Corrupt GIF"); + p->prefix = (stbi__int16) oldcode; + p->first = g->codes[oldcode].first; + p->suffix = (code == avail) ? p->first : g->codes[code].first; + } else if (code == avail) + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + + stbi__out_gif_code(g, (stbi__uint16) code); + + if ((avail & codemask) == 0 && avail <= 0x0FFF) { + codesize++; + codemask = (1 << codesize) - 1; + } + + oldcode = code; + } else { + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + } + } + } +} + +static void stbi__fill_gif_background(stbi__gif *g, int x0, int y0, int x1, int y1) +{ + int x, y; + stbi_uc *c = g->pal[g->bgindex]; + for (y = y0; y < y1; y += 4 * g->w) { + for (x = x0; x < x1; x += 4) { + stbi_uc *p = &g->out[y + x]; + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = 0; + } + } +} + +// this function is designed to support animated gifs, although stb_image doesn't support it +static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp) +{ + int i; + stbi_uc *prev_out = 0; + + if (g->out == 0 && !stbi__gif_header(s, g, comp,0)) + return 0; // stbi__g_failure_reason set by stbi__gif_header + + if (!stbi__mad3sizes_valid(g->w, g->h, 4, 0)) + return stbi__errpuc("too large", "GIF too large"); + + prev_out = g->out; + g->out = (stbi_uc *) stbi__malloc_mad3(4, g->w, g->h, 0); + if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory"); + + switch ((g->eflags & 0x1C) >> 2) { + case 0: // unspecified (also always used on 1st frame) + stbi__fill_gif_background(g, 0, 0, 4 * g->w, 4 * g->w * g->h); + break; + case 1: // do not dispose + if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h); + g->old_out = prev_out; + break; + case 2: // dispose to background + if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h); + stbi__fill_gif_background(g, g->start_x, g->start_y, g->max_x, g->max_y); + break; + case 3: // dispose to previous + if (g->old_out) { + for (i = g->start_y; i < g->max_y; i += 4 * g->w) + memcpy(&g->out[i + g->start_x], &g->old_out[i + g->start_x], g->max_x - g->start_x); + } + break; + } + + for (;;) { + switch (stbi__get8(s)) { + case 0x2C: /* Image Descriptor */ + { + int prev_trans = -1; + stbi__int32 x, y, w, h; + stbi_uc *o; + + x = stbi__get16le(s); + y = stbi__get16le(s); + w = stbi__get16le(s); + h = stbi__get16le(s); + if (((x + w) > (g->w)) || ((y + h) > (g->h))) + return stbi__errpuc("bad Image Descriptor", "Corrupt GIF"); + + g->line_size = g->w * 4; + g->start_x = x * 4; + g->start_y = y * g->line_size; + g->max_x = g->start_x + w * 4; + g->max_y = g->start_y + h * g->line_size; + g->cur_x = g->start_x; + g->cur_y = g->start_y; + + g->lflags = stbi__get8(s); + + if (g->lflags & 0x40) { + g->step = 8 * g->line_size; // first interlaced spacing + g->parse = 3; + } else { + g->step = g->line_size; + g->parse = 0; + } + + if (g->lflags & 0x80) { + stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); + g->color_table = (stbi_uc *) g->lpal; + } else if (g->flags & 0x80) { + if (g->transparent >= 0 && (g->eflags & 0x01)) { + prev_trans = g->pal[g->transparent][3]; + g->pal[g->transparent][3] = 0; + } + g->color_table = (stbi_uc *) g->pal; + } else + return stbi__errpuc("missing color table", "Corrupt GIF"); + + o = stbi__process_gif_raster(s, g); + if (o == NULL) return NULL; + + if (prev_trans != -1) + g->pal[g->transparent][3] = (stbi_uc) prev_trans; + + return o; + } + + case 0x21: // Comment Extension. + { + int len; + if (stbi__get8(s) == 0xF9) { // Graphic Control Extension. + len = stbi__get8(s); + if (len == 4) { + g->eflags = stbi__get8(s); + g->delay = stbi__get16le(s); + g->transparent = stbi__get8(s); + } else { + stbi__skip(s, len); + break; + } + } + while ((len = stbi__get8(s)) != 0) + stbi__skip(s, len); + break; + } + + case 0x3B: // gif stream termination code + return (stbi_uc *) s; // using '1' causes warning on some compilers + + default: + return stbi__errpuc("unknown code", "Corrupt GIF"); + } + } + + STBI_NOTUSED(req_comp); +} + +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *u = 0; + stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); + memset(g, 0, sizeof(*g)); + STBI_NOTUSED(ri); + + u = stbi__gif_load_next(s, g, comp, req_comp); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + if (u) { + *x = g->w; + *y = g->h; + if (req_comp && req_comp != 4) + u = stbi__convert_format(u, 4, req_comp, g->w, g->h); + } + else if (g->out) + STBI_FREE(g->out); + STBI_FREE(g); + return u; +} + +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) +{ + return stbi__gif_info_raw(s,x,y,comp); +} +#endif + +// ************************************************************************************************* +// Radiance RGBE HDR loader +// originally by Nicolas Schulz +#ifndef STBI_NO_HDR +static int stbi__hdr_test_core(stbi__context *s, const char *signature) +{ + int i; + for (i=0; signature[i]; ++i) + if (stbi__get8(s) != signature[i]) + return 0; + stbi__rewind(s); + return 1; +} + +static int stbi__hdr_test(stbi__context* s) +{ + int r = stbi__hdr_test_core(s, "#?RADIANCE\n"); + stbi__rewind(s); + if(!r) { + r = stbi__hdr_test_core(s, "#?RGBE\n"); + stbi__rewind(s); + } + return r; +} + +#define STBI__HDR_BUFLEN 1024 +static char *stbi__hdr_gettoken(stbi__context *z, char *buffer) +{ + int len=0; + char c = '\0'; + + c = (char) stbi__get8(z); + + while (!stbi__at_eof(z) && c != '\n') { + buffer[len++] = c; + if (len == STBI__HDR_BUFLEN-1) { + // flush to end of line + while (!stbi__at_eof(z) && stbi__get8(z) != '\n') + ; + break; + } + c = (char) stbi__get8(z); + } + + buffer[len] = 0; + return buffer; +} + +static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp) +{ + if ( input[3] != 0 ) { + float f1; + // Exponent + f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); + if (req_comp <= 2) + output[0] = (input[0] + input[1] + input[2]) * f1 / 3; + else { + output[0] = input[0] * f1; + output[1] = input[1] * f1; + output[2] = input[2] * f1; + } + if (req_comp == 2) output[1] = 1; + if (req_comp == 4) output[3] = 1; + } else { + switch (req_comp) { + case 4: output[3] = 1; /* fallthrough */ + case 3: output[0] = output[1] = output[2] = 0; + break; + case 2: output[1] = 1; /* fallthrough */ + case 1: output[0] = 0; + break; + } + } +} + +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int width, height; + stbi_uc *scanline; + float *hdr_data; + int len; + unsigned char count, value; + int i, j, k, c1,c2, z; + const char *headerToken; + STBI_NOTUSED(ri); + + // Check identifier + headerToken = stbi__hdr_gettoken(s,buffer); + if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0) + return stbi__errpf("not HDR", "Corrupt HDR image"); + + // Parse header + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format"); + + // Parse width and height + // can't use sscanf() if we're not using stdio! + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + height = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + width = (int) strtol(token, NULL, 10); + + *x = width; + *y = height; + + if (comp) *comp = 3; + if (req_comp == 0) req_comp = 3; + + if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0)) + return stbi__errpf("too large", "HDR image is too large"); + + // Read data + hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0); + if (!hdr_data) + return stbi__errpf("outofmem", "Out of memory"); + + // Load image data + // image data is stored as some number of sca + if ( width < 8 || width >= 32768) { + // Read flat data + for (j=0; j < height; ++j) { + for (i=0; i < width; ++i) { + stbi_uc rgbe[4]; + main_decode_loop: + stbi__getn(s, rgbe, 4); + stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); + } + } + } else { + // Read RLE-encoded data + scanline = NULL; + + for (j = 0; j < height; ++j) { + c1 = stbi__get8(s); + c2 = stbi__get8(s); + len = stbi__get8(s); + if (c1 != 2 || c2 != 2 || (len & 0x80)) { + // not run-length encoded, so we have to actually use THIS data as a decoded + // pixel (note this can't be a valid pixel--one of RGB must be >= 128) + stbi_uc rgbe[4]; + rgbe[0] = (stbi_uc) c1; + rgbe[1] = (stbi_uc) c2; + rgbe[2] = (stbi_uc) len; + rgbe[3] = (stbi_uc) stbi__get8(s); + stbi__hdr_convert(hdr_data, rgbe, req_comp); + i = 1; + j = 0; + STBI_FREE(scanline); + goto main_decode_loop; // yes, this makes no sense + } + len <<= 8; + len |= stbi__get8(s); + if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } + if (scanline == NULL) { + scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0); + if (!scanline) { + STBI_FREE(hdr_data); + return stbi__errpf("outofmem", "Out of memory"); + } + } + + for (k = 0; k < 4; ++k) { + int nleft; + i = 0; + while ((nleft = width - i) > 0) { + count = stbi__get8(s); + if (count > 128) { + // Run + value = stbi__get8(s); + count -= 128; + if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = value; + } else { + // Dump + if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = stbi__get8(s); + } + } + } + for (i=0; i < width; ++i) + stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); + } + if (scanline) + STBI_FREE(scanline); + } + + return hdr_data; +} + +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int dummy; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (stbi__hdr_test(s) == 0) { + stbi__rewind( s ); + return 0; + } + + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) { + stbi__rewind( s ); + return 0; + } + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *y = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *x = (int) strtol(token, NULL, 10); + *comp = 3; + return 1; +} +#endif // STBI_NO_HDR + +#ifndef STBI_NO_BMP +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) +{ + void *p; + stbi__bmp_data info; + + info.all_a = 255; + p = stbi__bmp_parse_header(s, &info); + stbi__rewind( s ); + if (p == NULL) + return 0; + if (x) *x = s->img_x; + if (y) *y = s->img_y; + if (comp) *comp = info.ma ? 4 : 3; + return 1; +} +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) +{ + int channelCount, dummy; + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + *y = stbi__get32be(s); + *x = stbi__get32be(s); + if (stbi__get16be(s) != 8) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 3) { + stbi__rewind( s ); + return 0; + } + *comp = 4; + return 1; +} +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) +{ + int act_comp=0,num_packets=0,chained,dummy; + stbi__pic_packet packets[10]; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) { + stbi__rewind(s); + return 0; + } + + stbi__skip(s, 88); + + *x = stbi__get16be(s); + *y = stbi__get16be(s); + if (stbi__at_eof(s)) { + stbi__rewind( s); + return 0; + } + if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { + stbi__rewind( s ); + return 0; + } + + stbi__skip(s, 8); + + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return 0; + + packet = &packets[num_packets++]; + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + act_comp |= packet->channel; + + if (stbi__at_eof(s)) { + stbi__rewind( s ); + return 0; + } + if (packet->size != 8) { + stbi__rewind( s ); + return 0; + } + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); + + return 1; +} +#endif + +// ************************************************************************************************* +// Portable Gray Map and Portable Pixel Map loader +// by Ken Miller +// +// PGM: http://netpbm.sourceforge.net/doc/pgm.html +// PPM: http://netpbm.sourceforge.net/doc/ppm.html +// +// Known limitations: +// Does not support comments in the header section +// Does not support ASCII image data (formats P2 and P3) +// Does not support 16-bit-per-channel + +#ifndef STBI_NO_PNM + +static int stbi__pnm_test(stbi__context *s) +{ + char p, t; + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind( s ); + return 0; + } + return 1; +} + +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + STBI_NOTUSED(ri); + + if (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n)) + return 0; + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + + if (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "PNM too large"); + + out = (stbi_uc *) stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + stbi__getn(s, out, s->img_n * s->img_x * s->img_y); + + if (req_comp && req_comp != s->img_n) { + out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + return out; +} + +static int stbi__pnm_isspace(char c) +{ + return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; +} + +static void stbi__pnm_skip_whitespace(stbi__context *s, char *c) +{ + for (;;) { + while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) + *c = (char) stbi__get8(s); + + if (stbi__at_eof(s) || *c != '#') + break; + + while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' ) + *c = (char) stbi__get8(s); + } +} + +static int stbi__pnm_isdigit(char c) +{ + return c >= '0' && c <= '9'; +} + +static int stbi__pnm_getinteger(stbi__context *s, char *c) +{ + int value = 0; + + while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { + value = value*10 + (*c - '0'); + *c = (char) stbi__get8(s); + } + + return value; +} + +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) +{ + int maxv, dummy; + char c, p, t; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + stbi__rewind(s); + + // Get identifier + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind(s); + return 0; + } + + *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm + + c = (char) stbi__get8(s); + stbi__pnm_skip_whitespace(s, &c); + + *x = stbi__pnm_getinteger(s, &c); // read width + stbi__pnm_skip_whitespace(s, &c); + + *y = stbi__pnm_getinteger(s, &c); // read height + stbi__pnm_skip_whitespace(s, &c); + + maxv = stbi__pnm_getinteger(s, &c); // read max value + + if (maxv > 255) + return stbi__err("max value > 255", "PPM image not 8-bit"); + else + return 1; +} +#endif + +static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) +{ + #ifndef STBI_NO_JPEG + if (stbi__jpeg_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNG + if (stbi__png_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_GIF + if (stbi__gif_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_BMP + if (stbi__bmp_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PIC + if (stbi__pic_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNM + if (stbi__pnm_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_info(s, x, y, comp)) return 1; + #endif + + // test tga last because it's a crappy test! + #ifndef STBI_NO_TGA + if (stbi__tga_info(s, x, y, comp)) + return 1; + #endif + return stbi__err("unknown image type", "Image not of any known type, or corrupt"); +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_info_from_file(f, x, y, comp); + fclose(f); + return result; +} + +STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__info_main(&s,x,y,comp); + fseek(f,pos,SEEK_SET); + return r; +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__info_main(&s,x,y,comp); +} + +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__info_main(&s,x,y,comp); +} + +#endif // STB_IMAGE_IMPLEMENTATION + +/* + revision history: + 2.16 (2017-07-23) all functions have 16-bit variants; + STBI_NO_STDIO works again; + compilation fixes; + fix rounding in unpremultiply; + optimize vertical flip; + disable raw_len validation; + documentation fixes + 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; + warning fixes; disable run-time SSE detection on gcc; + uniform handling of optional "return" values; + thread-safe initialization of zlib tables + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) allocate large structures on the stack + remove white matting for transparent PSD + fix reported channel count for PNG & BMP + re-enable SSE2 in non-gcc 64-bit + support RGB-formatted JPEG + read 16-bit PNGs (only as 8-bit) + 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED + 2.09 (2016-01-16) allow comments in PNM files + 16-bit-per-pixel TGA (not bit-per-component) + info() for TGA could break due to .hdr handling + info() for BMP to shares code instead of sloppy parse + can use STBI_REALLOC_SIZED if allocator doesn't support realloc + code cleanup + 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA + 2.07 (2015-09-13) fix compiler warnings + partial animated GIF support + limited 16-bpc PSD support + #ifdef unused functions + bug with < 92 byte PIC,PNM,HDR,TGA + 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value + 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning + 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit + 2.03 (2015-04-12) extra corruption checking (mmozeiko) + stbi_set_flip_vertically_on_load (nguillemot) + fix NEON support; fix mingw support + 2.02 (2015-01-19) fix incorrect assert, fix warning + 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 + 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG + 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) + progressive JPEG (stb) + PGM/PPM support (Ken Miller) + STBI_MALLOC,STBI_REALLOC,STBI_FREE + GIF bugfix -- seemingly never worked + STBI_NO_*, STBI_ONLY_* + 1.48 (2014-12-14) fix incorrectly-named assert() + 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) + optimize PNG (ryg) + fix bug in interlaced PNG with user-specified channel count (stb) + 1.46 (2014-08-26) + fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG + 1.45 (2014-08-16) + fix MSVC-ARM internal compiler error by wrapping malloc + 1.44 (2014-08-07) + various warning fixes from Ronny Chevalier + 1.43 (2014-07-15) + fix MSVC-only compiler problem in code changed in 1.42 + 1.42 (2014-07-09) + don't define _CRT_SECURE_NO_WARNINGS (affects user code) + fixes to stbi__cleanup_jpeg path + added STBI_ASSERT to avoid requiring assert.h + 1.41 (2014-06-25) + fix search&replace from 1.36 that messed up comments/error messages + 1.40 (2014-06-22) + fix gcc struct-initialization warning + 1.39 (2014-06-15) + fix to TGA optimization when req_comp != number of components in TGA; + fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) + add support for BMP version 5 (more ignored fields) + 1.38 (2014-06-06) + suppress MSVC warnings on integer casts truncating values + fix accidental rename of 'skip' field of I/O + 1.37 (2014-06-04) + remove duplicate typedef + 1.36 (2014-06-03) + convert to header file single-file library + if de-iphone isn't set, load iphone images color-swapped instead of returning NULL + 1.35 (2014-05-27) + various warnings + fix broken STBI_SIMD path + fix bug where stbi_load_from_file no longer left file pointer in correct place + fix broken non-easy path for 32-bit BMP (possibly never used) + TGA optimization by Arseny Kapoulkine + 1.34 (unknown) + use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case + 1.33 (2011-07-14) + make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements + 1.32 (2011-07-13) + support for "info" function for all supported filetypes (SpartanJ) + 1.31 (2011-06-20) + a few more leak fixes, bug in PNG handling (SpartanJ) + 1.30 (2011-06-11) + added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) + removed deprecated format-specific test/load functions + removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway + error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) + fix inefficiency in decoding 32-bit BMP (David Woo) + 1.29 (2010-08-16) + various warning fixes from Aurelien Pocheville + 1.28 (2010-08-01) + fix bug in GIF palette transparency (SpartanJ) + 1.27 (2010-08-01) + cast-to-stbi_uc to fix warnings + 1.26 (2010-07-24) + fix bug in file buffering for PNG reported by SpartanJ + 1.25 (2010-07-17) + refix trans_data warning (Won Chun) + 1.24 (2010-07-12) + perf improvements reading from files on platforms with lock-heavy fgetc() + minor perf improvements for jpeg + deprecated type-specific functions so we'll get feedback if they're needed + attempt to fix trans_data warning (Won Chun) + 1.23 fixed bug in iPhone support + 1.22 (2010-07-10) + removed image *writing* support + stbi_info support from Jetro Lauha + GIF support from Jean-Marc Lienher + iPhone PNG-extensions from James Brown + warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) + 1.21 fix use of 'stbi_uc' in header (reported by jon blow) + 1.20 added support for Softimage PIC, by Tom Seddon + 1.19 bug in interlaced PNG corruption check (found by ryg) + 1.18 (2008-08-02) + fix a threading bug (local mutable static) + 1.17 support interlaced PNG + 1.16 major bugfix - stbi__convert_format converted one too many pixels + 1.15 initialize some fields for thread safety + 1.14 fix threadsafe conversion bug + header-file-only version (#define STBI_HEADER_FILE_ONLY before including) + 1.13 threadsafe + 1.12 const qualifiers in the API + 1.11 Support installable IDCT, colorspace conversion routines + 1.10 Fixes for 64-bit (don't use "unsigned long") + optimized upsampling by Fabian "ryg" Giesen + 1.09 Fix format-conversion for PSD code (bad global variables!) + 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz + 1.07 attempt to fix C++ warning/errors again + 1.06 attempt to fix C++ warning/errors again + 1.05 fix TGA loading to return correct *comp and use good luminance calc + 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free + 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR + 1.02 support for (subset of) HDR files, float interface for preferred access to them + 1.01 fix bug: possible bug in handling right-side up bmps... not sure + fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all + 1.00 interface to zlib that skips zlib header + 0.99 correct handling of alpha in palette + 0.98 TGA loader by lonesock; dynamically add loaders (untested) + 0.97 jpeg errors on too large a file; also catch another malloc failure + 0.96 fix detection of invalid v value - particleman@mollyrocket forum + 0.95 during header scan, seek to markers in case of padding + 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same + 0.93 handle jpegtran output; verbose errors + 0.92 read 4,8,16,24,32-bit BMP files of several formats + 0.91 output 24-bit Windows 3.0 BMP files + 0.90 fix a few more warnings; bump version number to approach 1.0 + 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd + 0.60 fix compiling as c++ + 0.59 fix warnings: merge Dave Moore's -Wall fixes + 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian + 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available + 0.56 fix bug: zlib uncompressed mode len vs. nlen + 0.55 fix bug: restart_interval not initialized to 0 + 0.54 allow NULL for 'int *comp' + 0.53 fix bug in png 3->4; speedup png decoding + 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments + 0.51 obey req_comp requests, 1-component jpegs return as 1-component, + on 'test' only check type, not whether we support this variant + 0.50 (2006-11-19) + first released version +*/ + + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/