From 1344610a5243b86c3867a121ed7748a5e6401fd3 Mon Sep 17 00:00:00 2001 From: Euan Goddard Date: Mon, 13 May 2013 17:01:42 +0100 Subject: [PATCH] Added support for alpha transparent webp images #204 --- Images/transparent.png | Bin 0 -> 26538 bytes Images/transparent.webp | Bin 0 -> 8094 bytes PIL/WebPImagePlugin.py | 68 ++++++++++++++++++++++--- Tests/test_file_webp.py | 107 +++++++++++++++++++++++++++------------- _webp.c | 68 ++++++++++++++++++++++++- 5 files changed, 202 insertions(+), 41 deletions(-) create mode 100644 Images/transparent.png create mode 100644 Images/transparent.webp diff --git a/Images/transparent.png b/Images/transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..902ea82723b84c0ed9cd77f159a701a7c5c7ddb6 GIT binary patch literal 26538 zcmV)qK$^daP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*i3 z3=$!g*DZqp03ZNKL_t(|+U&h)j9q7XCicAVx14kCRx68DBt=rB_I+)&yVc!pxi@bU zk7t~;4FryniGPeUnP31TnY0Iq5ibbf8DKCT!!VK`!2p2`8{=_1@i=1}-rcQksVPwl zMM)I*VzH`j)m_i>ZEt?uDvDCK$Id|QR$F{8F78s7m*;-xd%kyhp6@-tExTp6?3UfK zTXxHC*)6+ex9pbPvTvH*e!JXw{@{cD)_~ly|ESU5#ve5|cM8Mdqc;O01E2upBFL2j z+HH?4o46QLs4C^_I`bh|f9Q~sXP=!7%Wb#4iOZMoxHU^|0pxGN521epk^d6F{|e^& z+lz~juC-c+4r^_Xh+s(s9ROWs;VeUFwaUa?OVdzYRe2MFsQ@=lX|fGemtsuUuUuK( z2HH4r;#Iu$)_ot?Npi=}-hns2@a8Rmd^?-9zf}P42odf!X7P@8`{ZqTe&i6dIz)se zX0!lkt&`4k2V)wfltNjWrfEz_Db_$a0?Hkca6N={K1TN@bM;EARiA(J&8M4g_kX~6 z{J;I}oekdu;CJ?(e>VsWt8=AnH&dOpwxJ^&vvyXE+{h1pd>|hLfaq`cA8_#Cxn4@) zWJ>NKrRoQ@F7MPjyN#I-63INXw5%mCdk}dj<-zQb5>VF`-W!NS02P1+B2fTT%wYql z&xUaMbiaT0xjg^xpHGP|0f>KFCqt{#GR=S1^kRyuU>tx(FXhsSMJ$~1CUcp1bqB0 z&Fu>dv|QIsvA*8W?rsC3Hk7IXOc7&)7(JW|h%w&-hXYUpC;>zeMN%phMDavj<5)`h z!@%-GB9miPHT-ktfAn%n|7rsKLjb?@w__H379E}I!#?=iRi=*H+^*?DFX>D#a>hMX zsKOM6hzXLUNk}_jY_sOKknk3+;v7Y~us4Xe0P?N1f>u}09|PP|%<>)c^ZfXI_Z4?N z@PM8_e%xEFJ>Gbul*wd*;cyJC0TBo1BAQ0veLx5e00I$1DF^0VFb_clC}m+xMky&Y zjZ#{#tZ8jKB6wNy z8z~uh4}=f^Fo-mm1Ar3DyU=$$crGHJ#p&9%MhG@>#?`Wlc!GN+@t4iCF$RMkgOjD znokmy&uBe;D$AzF=H{q){PAV}$VU#K-DaFWU*Ys=hcjmq`uzdwx|WnQF)s*FPRvOF zCao=q^j^+Ufw>Q*hG2FeDgZ3P`xdGyKtw>qqLhJiyS}b3Y?kGPKMP^|*G1~z1OD~+ z+hP3X{>dDM|6+*FPjq^!tsW;$Pidncx5?g@rEJy0cEpPIx#yq*z<}MmX=tz^NC8A0 zv6wHS)9xU360Ym(7}*g>XiAPQP@q?d=v2zm*Cdx$A-D{}w=GD%4Lr!tV|n>gPk4X* z8Lic)w5}e?veA+;m2R50T)ZflPHQ;F*w_fz*dPoBA|VVZgo}u=3QDa&sTFA5R$BMK zY(=R=K!OM(#s$P^05s6L4dywd1ZeFck|08ql87-&mRTPJ_+xdQH_lzIMSkKBfPdY* zpGR=<3yawK*&WRPiE4zPP?nZndBsCygcu3l3qq(7Byrhg-RK{e)%wQ%Ek%(AQsso}fM2rwQqCNk*_edfTW0p*-#RmZXII|jfe|;3f zPdrPcy~w|Oe-5NTFa5KnCt>hmV)`U$dWbX~hJubUN<$4YmBA=O39}msK?Ma$1PBmq zgcAoJJrX4x>m9>gD|cajJP+9voEe>g8#zr4EeJ~|nY2Vihhm6JNu+b|cUNAx{<+Qi z+b&;wza7w#BQIk#`XwAb{L(6b&k*qs5z%Lea61rN%n%Vv-skW>M~n$R1SA1cst`g6 z=QdM}mt0C$nv_O$2;(NDaY(6*F^*#hyV3h$im{ZGoXnDQh*F#YEh69;BSd5`3MGgD zL?96n=0Y>)9cDF0luw9gBZQxOU*;nVUszaFR((ua_1#9B@6}pA&WaBb6D3MSn&@cn zDDIxS8z-_8Xs0%kPpD%B>nv5pouimerr7RpVKf|r z9fOE8TIfnkR-(lDP`coD8|S~nZRLN*M*lnU7C`<}Z8Z8N969pxokaM4fc`!ae}YJ@ z5h(>20G49RAd&-MFh#JcV2uaCNeBTU?6{ORsu%~QhzbCbNSRU^#FVyu2-_iqe)N9R zi;RO(l>??Ogh2?wk%&=5YR`8hh~OrW5D|$e)l$sa9FfYDYV8nx$GH&x!}})GTKK62 z)%tkrkh1Di%Bb%#+I*K~d#{CUGnj;hgat=?NAcm+598?rPvf{c4(lu?Zi1?*_7yi@tR8$w_2TaNe)a z|JZ!0e!aRCV*Mw04-McE0N)4DXNlwi0Bw=IT$un7-kY!hk-!*%)(waPLS!Uq0#G(U zSrOSNk_d>iH~~RKd;%s>WYaTuiMgg2r{r9c7@4!|c4S#wGiRDekdmO)3OH~;U@fq{ zt+Bhydm!m$)~ZK{>}4W#xvKDc^Yg!k!Qj96mX71nPcN~EJivy(gPA{L$UK%IJ7kkJ zoEWvP;o*_#3=bcC7@xT96Sy@$$Hx>rM}l4-@g3`T1WzHyHfTx0Fs^_`-q~$P=9NCkXUuP5NOYX2~W?92t%s z961CISZ%H1*xWH3UpkHzvw~0t6nO!ojU+HFm z=gh{&hBnG@KlXWq5kw0d9A`0u?rI{#q&udkf_hkjG;mazEz>`joqPS32l;D*o ziAYL$KF>w5L_mS2@iE3odtsEsIB+qJY>cC5%!0n}KHzho(|Gt{3#}E79u+tT{LvpJ zgg_)BqE!2sNcxDia%Oq?cQ1&f)bD@K-}pFo|8ciNnm)uCKSP>6&BXU1p(8;M5D-;_ zR~|tH2xe~BYKz?Du*O1Zg-TVJVv5q0p&2)|+jSE^@Y6I+4S?jx1*$1XA!ZYsW_Np6 zD=1EsIO@pA0o$`$R>bD*+-j>?WeO5`4nsUjj>god-TVFh)hl@A@-2Y;mEd@#0OY#? z{2+i&0$9Z?9wGn`0hk5WIv7)ed5V-Oq!f{oLS45|*Cy3<*~GY05w=50W297(Qcy+F zwM8*!l*%Xs?}@Z;wH7%gLzBtGhY&$TH!4*rRnhxxul0giUhb;9?#k%F2Xh=c)CLhj z#N(xxrZ|1tVRLhqlK`ZZ${z#dMSx%0-2C_(-vSb_YZvX4obmUPrtc!AyCKLUA{;w- zcqC3pDnVF4AWWtcZ0&C0;?_l^R>GC(6`U*2r3;e_VK5k!%}z53!%(I=xjjTtC_~Cj z*2EB9N{MRJOfyo6p+I0DO;g5}+iFoMr4>^{L^Xj*T4cwMBS$~lxP8yB-qVjqV)@3? zZ`=aNH!kD8(h|XU63O2O@C-mJ*smAi?L0$k2dzsmPY|O=2pTcA5Tk{NPI(T0{5Xe& zg^a7J$liKOh0RSxMKPasI?Gv}&nczylu}B}hDD4Xk4N77;BKyk&g3T|A@rU12TYzX zn3a_^b>P4}I-LvvaNvMPuQx`Xmmta@qCg}g_QBG6R5{0;A@Q4*T zS|g38kmFiB7`H{sb0<%qlyeWAy9JPU8&P^vsqlkJx$gvIIYuop=HHOrj}ZtVLrNAQ zD5PY>7=t_S%+ixjYTSN%%VwFiXU|rtu1BG+3+i+Z7FpI~r3%MvDiM+xVXCS`Rh1zG zpNO!R!0*9Ch=3}D(Dzlf9GYg00dwOsO#?K|1R}f0^BzRHPzn^IAO!QU_wtA_hhEs+ z{P@{#_V^w9*<-l)g^Q3%p33sd%Qt=`PghdNRn`N`>br0 zTa@W649COz`sVd=*dI>a$W@4l`@q;YW@f8wt}`WdV&{WTq6BPs&*O_&W#zCsEGudS znaXIR*}&M30Y#z}TNvCLHA@ORG>X}7WQsc+gCUi`vE9RBIUC)n_Zj56P)lRjyp zDU!^13n77!%zhpN6bYOd0)em~+JGuVx;PxUdfHTORN}66D?BfIzGs~_fiwviAVoObI*iBXA5TTEz^nW!UJtKhQ0)>Y5*F13;eG;LLd4aR zFP{8;5SsU+7x|U|QG1jr& zuKlBrT0HRt+mwds*=Ns(Klzha-JkyHTg~=16HyjgtxU2k_e7M2!=VfYyD@~|QW8li z$t-_JH-STD%tsQ6u?nNnw*T^%H*~u_&lfJtp{_yCK0Cx~ucbXHN)4?Ym<^N?iqR|Q z;)BfefcNsXt*uXeQ_uK`|M^5qwbX|q#g8jecSw|0BaL|NDX4HmDncM|!%&TaBtf!C zLKY~bn0)0MKk{W5h0>3FCAGNOKzw7J9y2SYl+KLJvOFW(vOKM(Qq`5Od{wdLBua#t z)3Nq3x#!?LSne#NNe!mHginr44RFQ>(cobOoQK85a}S++`IZOSv$`1_%ChxGHLJS- zHcgYmxdJiTcYx!aCVSwR`ntYY4~N&9S6-P@W!Y`Ew+HgtYuCd0^OICn^X&aW)9vb} z-7Z{Fw4~o3U@+K4(=2H_$i62f+K{`{8t_y2y*JpX*7oD;0CI{+``m{Bf)I9m zRlQzS)vMKTc+QzDUk_+T7ft>2$is zf$w`I`8xRRhjc_U0ExH+7*$nP4F+vB7$i!G5TgaNhElWpjAeK5K9F-lF`@u)NyJ~= z-29&5H)9MJ|M_A^cl5_$@oBMguTm;sw2O4CbqoiyRj8!U#0H3ftqoMk@GeN5YN>qX z+|-qR=*NE7Pt!Ejh=}j-8{Y^Z0!flYDW#YIof%hjijcQ+OGGxfAkoK=B*mI)6>YS0 z?KyL>dr-OPus&MHdbN%iBH%#*A&Vg*xwM4_yBj~avGIZTAZ&lqMxPxUkNmMpHP%`$ z%#Mi0H<5q2`a`j7D8One=o~%u$w& zCq)qhpk+85(Re(*p{tsCh;LLd5X?NwJKhuTHyh@8qxGD&c1i7f9p_rmI>OojV2ThT zLLj811W;>4>3-(c2>=(r8RM9mbRzcR9aPZmTIp#5y z!39W>-PTo{9d?ad@}3ouhqVouBbXzU@&FQ?Gl9RpC6Q_He$y${ z)kK!HZbM{7UOGo0ieUB#f%cA>i6|Hm^AJ&dV0rofd1-t5d*5>*qb~Fj0^N})9q45} zJhc1}Ju~+V*8Cc_u5Y0p)>yCB<=W($G`DWrPd%=<%ghiK*CN^4q8)8*aE zZhf@gB&5Ga=@Ars@Z;emD5H5Tt;t+>PPEZ9+#NC!keUQy@{@AnU*3G#58}YKs71TY zF2oB+5yT4ML5P@#;9*JfDhPM2|M2! zUIVb$uZGQ3z#2rROO)J5G zLo0Y~bZ%f^lbzv<1;KA|^H`g+qj-o8fl!!)E&G-#w zL5vLNESM9RHH@*+>8x;;jZ;yK>KMyuS*C0}ws{CTbIxdyC?b&n1raA9RLT2Fs!CH` z*Ee#Hndf+CtRRx!m5tJki7p~&wKQd!a9u|!%bh01MV-=uV(yw*=^6VPu6KDN!t8kL z(HPyaR_p1N;qZIkvjmh2&SB7lLW`I%s0P?7x3D$cLdSP-WpV|VMi>3{@%742{1_3A z3PP*X;s=gDU?02VvHbYzaXs7}@^CmzbFDd*>5Q3}qD0wW8;Y#pkKOyR_7k@~(Qb3w zUcP=gp1N{s^3wH}CSx}a0LU7PZnuj=hYwMI($`y~Ej^x$RsUMQ4wK-*G&HdjUCd(^ z5Xiv5ikPL&O{Ps)uo6SX8?&&!8w0Z>GtbO zGDLJEF`to!M9i9q1b5ugHIF>9XqT3(x^!viUwUcVUAnZ{c)y^mU0`E!O+<)M?HxPz z!mETBXR>@i9c0c9<@tPXIK+DfkXXmIA!DJCQAW5tzKmzDJ&S5uqMh1!t$$Wdk6sG9 ze%D2bfiot~7&fys*O}v1-lAToM@`v)HN%UKb*Mv1Np6lhpE&tM>oX63rt`$nCwj4p zdNp57(|Ve&kFWc&8wVnSQVMyNlO}B!*A}zYldG-%uHRDqdrCRUyw6#$%1m zO@j9c-e&+bjM-N&ELi4|XPy|5VUuMNR#yC^D5CH8S;~@ajI2`f2*IIgYB1})u;uEXc;$p$)&h0vDU#G3Dx2mSO+GyQTfMy_L z=i*+Nmq8>Vr5PZZ6|_#REaPR7=@9_$oxD3CQA5OFfdG@~7+Xy>?GMeC*-u(UXtn zCst1A{&pXu;fNR8i@I&viik)l1y&3IP7!5v5c&CzqBq`CYfmp@nlan6jG(}XBZ zvds0?)-g+y;>#sAWQ($Gqkr%E6Oqrt(!)v zQnt2iXF63`O2RX~q!FSB5%qNytDAF-z3P=1lc{d^Kt4BjAkXtcJ@QCKAN$x6Km70k zw$@^8Z6({-sKc2v+wP^8t~Sht5>X7y*%*NsK}s2}Ve8knGhHS@-{4z|#)+cND>Ct)1w&Q>wlU!l^8l^Z4i**)6vZN9?BI8N|S05 z<9w7P34?mjY)m%XPQBwHkgUikq=4PsT^fXe8JK|?xehyT-1K2QKTb?WZ% zV~@SI4iuL~aNo6SrOvWlgs_EHYlK6G4r4l9g!dkk$#pC()i{298QveH>9l8+Drse9 ztWKUxc5SU|t*xgiRSnT}O5~7|X6BWabCoO0#>E)lLH~)+y9h!ett}g4^{gpFgtZE- zRts9|nZ!FmM2wVW6e5L`Mxkjg)z&Ij>YxI&nsrl&(7J$91(cfG&qcKNBhxgF-?JQ~ zj3b}>?OgI54c+9N=gvBaPJjip*2EcQF_*mQG(I(HN<51*>$*;--aJ)<&?qQG7v=4$ z#oKGgXgZ27o`119ynML4zH>e8?(X6%=f6_Dbp54Czv_F|Ov)(KbuC+4TWnymksaA# zIi%@y3J0gCLmjoKI3iAh4+wRL%B!f1QUI{sY~%U<^H^>zIw2x! z`EuSZex(>~{P@NP2OxV%#n}+(N{sF4_3PAAs-_r6SY5q_R*TW;dg*WPi5#dJD{sv1_#)s^?{+?XX>*CnSkkm+>NyfeId z_l^@_whcEy#KSp}t*x52w*!tJpZ#@r*QYn%9QaF@CUI8A6~s93M3Z2`=8JUz03ZNK zL_t*TN+N2js+zrT%p8oF2hfK1Gj@K~Q|rWgHh$B8H63UFOSbN<-_S-6GtTlB6(B=M zHX;j|XlU&VUr-?5P~*i*y}uyHUPUjac!Se;M`fF474$Ei{ZdthN{%ldud2Gj+4Zx{ zo7dlTDJ8LmB_hJKoKk<-H?2-9tE4jH;TV(21a(s*#K0)f;T|h-;zA6pofb9>%oGa!UlT1t7x|~N=ftjx=C7(;>yZM&(ANJg9okM-d^w<8>!Y> zIL3Bc>nyA5#+T*Py_@{Inez}y;(ZmHW)O@a&20F^7q7(w2PArbL^>TqfBL8A>p%E| zH=DtrPB)7jl_C^{f-wq27S0(c)rC^|+a+0+hDaLkFNF7U92?hMwq(~yXv>H>NQ$A2 zh8Tt+OGPXYvzR9@KBnkha6x7@@po3Wd2cA*?r^ks;6UZ8^wl@MTAh09R4pQK!HI|n z2&9xkOi{+;G4TRtoVewtj^iYXDp?AjC*@S4h9E)MCvSY^!I~2Y(76VI5GCSk{jXuO z+=Pav?Pi-I;wouc24U_4mxG)-br0^n_r*!8rCt$8X{8j!7;c&u z@AM=$RHPhDCV%*zHG{JMtpy^^hZN2^<*r1EcSw{hRf!}BqKZfq zk?D-BHAUl;7ZwMg!R+!4bORvjCV=23knDXT#DI{(%_|JC;+dw(Ih0LlZL)1MF_|B_ zgiUdAkQ!h65MxY~NH{Q%z^O4tp|*o3&U(2`M$?eHBNeY27r# zs8m7TQ@nD;`xjpnNl8R0O*aK*0synFCv8>NQPp)V&VfW`vKb z7!Wm3s@^4Pu7)ta{+dH4xNnE3KfR20}uj1gcQkG9PHo@f^JN zsz2z5e%XJgtmGTZ+rRGpJzNPVGL~$+h{c@RR$1+vINhDp!|mZ@ygQykX39s(NUKa` zx~&V7o6NA$xy#8m7E%e^)FBoTF^>=QU_XhlegI7F?T6CMmuDYXwOqP<7aI@GO}(OG6#YpuKw>1M)k zCU4*0=#=);*ZtQwn$*pb@);S=+*QV`WX2q@M9W#zKzZ+I#-uZpA`lq>EVJJduZirQ zH>TS9%f{mB+8PdDduIsot3}bP>-ykoQS^=$Mek^<)n%eK0enEaXr~hxi^ZlQ1 z-mG(VHYeQ4M9ce%nkW$sH6TTDc z%S@*z6i6Fw3mZ(!R@R1zcXid&)6sNNO{yA#1Ojo3O}3o1?V|1Io^El*Mh8vCD`?S3 zNHEDD`Giy)0-%#V5C?yKYR!EsT{MXhtI6fqG>5me0BQ3?fs#gy>SuC8AG z-__{V6$yWQB4vMmyU5vPp-CptAP5AR&ghZVNAUE*({?Sbntpqy&_S!+>2BPucD)xb ze)kWSFve;}0G{0N|;oE+8eos+2q@ zg8PZ+_E~|E>BiRR8y;kqHz>vEwA}{pBOtfsX>`2yX&1da4nWFHd)U3-2QJbudUr+|APpL76)h;EgqUWd@K=ObnaXUYv%-+cI5GRiyGp96shiqG z*WCQCxx>~j+O}P?ZPPU^E;u6)bks1(KtsbQ12Qx379;?BRLrcmj6iEW)S@pU;nFY; zr_IkaA50Gd0M9;q9026QAHMiiW_k#~y#U?+ZeZ*`h9K}hARKN>e1+^&2!ROHYOm0 z_j7P=9zYJQOK4r~?PCFqvE;p}>flZ-yBA*kXZ%a|FZX)?5wk03PDJ2{&@d2c$i2VvyubXX!=3QUClBcP1FDufjnXLgLq9aJk-s!C7f7eo zZWX3zXDV-5GC6_OgeF7py>r@;M7hDGsIJQGl5N`s+c8~JkR?q*!ih;I4I2#QmeCc%%fgOn_Y2+RpYHMEY1Vu4D>yWA_yf1du|hn~z% ze}_fcu8MgKL%?PTP$3{o33JAvb^bgCKlzgoYjJIJ6aDpd)VsS_7>$tEH4=c1G1ztv zm)F;EsMSJ?2r4DOd&E44+;tbm$B$#T)xx0PNB-=ypt3|vGp&;X=xhq(i+}Rxqq7e` zG5P2(|MRss5BuWf@@3hQEs7GqzWdc)3TBlxxh?W`tJBHIw!{nSx~W14E~F47NdnJW zjp{jF*d^Pwi?*#hx?s(`zYlT$%M%F_dn5=#3<#KAT7mYZKMa7dE09+JywIvz?~4Ww z?+buD|NH~^$VVp^xIA`~yLX5g`ND!n{5YPj&W~GFgg=Saz z@_T2-V$YjUr_)XC_5gzciT6Tp=O24Zr9h4z?U_%0@_7E4&)ku(taLd>Kq-UWU5%Gs z%8*hEBDALvp5;WuEhKcXlCI&i?vLfW<;&^>F3&S31YxN`2odOMjpNpW0hB4B0x8I)FKllfjd*&IGS%$E+ zg=%XH8|Thp;mjFyrc)4r${0*ytS|NZ+Zy2Hz5L04{oh^P`NtnQ_{x!OHP&OMjFdF; zb~lr~wxs)QL?sA9?Oj4lu5!LdVw&Y0B=j~}2{c6XB>;aekT+lZxz}(DAUD}x{Kaj%Pd|P2SrNJyz!4xF$}$IL zhEfX7DL`^WSwM^$5;KSxFf%bXtW<-PN{CcQ$?qlj8HhBjwV0ppVLYBvzdzaIDfXo% zA|i@To;+ypyYDu8;>01!vJ61N-FG+m>Q^hg{(7?~Wmgcf2q{M<0Ux3-;|Ju|@S*fP zI#N*tLx_-s5FnHRs6xQD_t;>@L1VC_HCg}=BO-uvMDPG~N;oqdq7lJub94CW_ICN_ zB3BY18K9m5)*kx)Mpk{lPgY&*=oR1O% z84@tq&f9i(vD;mqU+#2T9ix?^Do!zsV}vy83!Eq+((L(uy?kGXwdXZt51gkU_!AJm zy7^O^o9~x-`98Zwp?U#OeIV{>y6Ri!|j!x~S_70-4b zS}=Qvc!)TpRLhLd$N*T(%`IXu7-Bpw(KP8sb2#RVjX9EayLaRZ3y1XFT#xqSjG_pz zb_{EGkwhU$js>@k?{t5J&*S%Tgsvcxf`IlOXZ2wLVE5|8N3BK9j6n#vT9!yhkK*X3 zKaKeC!>EoPMJohcU0;X(#a{%!_@bO#SfHOd!g57e`UD+ ztN*CIu-i5UQxM`!C0q|e03ib9pse;9H3%5OIfD%oX=2;9?UlKe-jTT@?UiE1_Dq+c z60W6dkN`}4IlEk&@sOLgI}>gI17HXU34*Ty_^=15%cOR9DF6z_ zD9SQXB2k)Vl7I}xWYq0uXtxdOx)LHwO0`v%9m}%pWD(j(E@$unr;qK~rtSOI!c^h#*+`>EM!Mq0!*^3?yX^q1xD`@@v&%=DzcR`fGWHNyt z3{YLVgx;6GjP28>v5;l-XPcXYuZFNS-TSUMG=$RO%y$#K@Y4FI{ri~rOY79o$2pI%uLuf%I zsYyzAM%?|bLRIX5$_B-|5iU5jV0jBk!%7_k7QJ_xG`CrQb)I=fTU3 zIe34Xo*hq#-SS7H&HwsSQ_@alIv-iKnI&(%W6y4Dm%A%0EC7f|kgQ3NA=Z(u@9XSq zTswVjT0lRjs;i{`PG_wzDHNhuN z=(OAQe(&DM?B7oc5V&{|erX9lO*J(dh8qpGz21Uju2U3U6^7yAS`h3uXU|6T*kgnP z2SB@b1Lx1DxaZz=1g9Uy&n$loS0%>)&zO`F2WEEzyLMqTGlNlPSB#ZOR zLk&>9Y=jvvd>n@eLm;~!SPZRQdw~!w7ey9RQ{CKqnBh>>lcXhUwP<-_Le4mcD~3bl zS%%Pi^OEW5ga7fug)@SgW;WQr_<M~0$=>OmqBkafwT zE(jX6uo2ex%$aFlZ@Hf8oZxG zlH?c;S7>S~5BBeGQkpi^{QNZ6>qE0^*HBGNNVHltCq&IJE!AL*#^j{Qdc8D><46X< zfiMjB8zGEXUG@0<=W}$s9+OiR?(AcD(S5&-*PZ-46a?Cn9qj$#A4c>0zaQy=1K3Pc ztgNo$+_`hmAO0}Z@#7e1jgj{lWf=|%f#c04Qf6e{o}FEw zFzi6Wn~!GMY796d zgvrR&03S*qVgU^XdB8h|+-TE1v}fO7-_*2S+StJS{5-NOBO-!lhA4u4M?$aw$TA~i z#%dH{cfSu1Aq8NJX}ogp-hB@)EG%edzW(!l`=#%z2N6Zgf;EL?Y-~*$r=vX0686YQ zktadKl0%kUW5Z_IF4Lp^M-jylhWW5qacW~Yc3{EV^^Hr*kQTs`0PZQtaW8=R<@YQ< zZ*`&7^Yx8=;S03*`q%Rv){4exG!+VQ;1+K`e27!2m1)Kw572Jq^qmQfB*LZA>iicfrlSP^XyqPlLP}}&|$`;_n2UY27n~Nm8DxDy$8}1 z97S-GlgN$1$+KrSAMW6&ckU5i%lJX6FE3FLTkEbLc6BT|3%7nHjR#tna(-x+^XmKYsSeJ%jE; zH`O|>A!HDSN*g6(9V<4hIQ7a|pK!*hCuf}Skx(ME(#mySM{n4J&;8a$e4$-;gA`T7cms z2`SG5^!rCZ6vDX+q*McO+=8{!==TFCMPPmklaq@Gf*CZMZ6d0p+3cuVttB=$FXTeh zQ}63iDdrX>;$8H=P$=crh(tn!e10D4w|)x-fDlD0mza?Yfj!n1TfB;@Kk?Z>{p4_5``|04e}MaiF$49m@k6ltgi5tB2eXjJ7}cL8!O9rKo_VDR?k| z@AYuuukXOc|MUTx2y2+s0TY8(YcEJ z@iR{Z!;A#LkU3S>2D`Hi=e0&|EojHudIr#N4y-l2ld7p4S8cfIIIjF6v-FPX$4eNlAS`t`O0U03DVRA`BB~-9sUlP-u)4Dp3NX z(H?l;fVC@7NE-4fz7ffVrxep0A9dfjjpnf$h+5o^*F&RIvsS30WrguL@0+u zz|2@I3xKKjg~AyTt_(wTq=Y+s*!FL@p3L%+?4F;;nfvd>i7(uRC;#eG@NtIeD1^}= zSgP1Y(O|0G?l+rFYmA|XPM)Nv7ZyY$B_@=*bY{u>ONoIU6S73m%;+(vo*A>!+}Q0RhSh+G((1c;yooyiATBg2(+J+za4w5SH-F?cfzb{=RtN z0m7gDDWCnF-|2lusqi8*%@g5OLg1*Bwykv@8dEgtO4;Voh{*e5t!SFI;e7*2Cu1qK_=;gbssXa)g}Ty+(8rztwlK>%2D4yTf2D=-%0 zSOdVw+TmCGoA%_F=XHMg${H~sC6LQv7~Hc+O%M(dG)ALFb0lgtw3;cX4VbJos~^cSF{8DgFeVLvNX9YX9F^gMgtY|c1g!1zU=YhZuLVj?!?~q&f7lZ* zk1{hC?cF+%nK8Ifuj5Ija3TzmKJf&ac@C)*LZx7of+T_y!k$i((fK@~0q3;{B=^;8 ztfDA8GZ+p$Q_4;xQmQNr45BckFp8*At5LJrM61=p*B^fz^Q)_95+NXh+!4!w8GLzs zv-5)?!q9t!03srafqe6tYkcF@TgBcoD7V%Y3l{$QKZn2XK9IH8-|r)toJ0zc2I!`R zAiQfawOLImZ4I>3kSyV~M{aUtJ}Y$A*~9CieS|>p-m_EAF}TZu&v3xUyzmc!@i2jo z6VvkY|6F9LzSYR_Ek%$W=fU1_2c5X(7Cvt+KaeEmsB>nYQoN6OI2(p;#uzu9Wn#Z` z)N&587{Kx}&r`9sww5m~#aWh3^p)DPkXm=@EsZB%zDtMjJMPjd%OGnt5P*;wyRW(m z$;FFU@Aa@+q-*hpBS*L$hVrFA>(tT`PAx4#fDxoI-A$O!nVk?sMhQqEgi;DxYlK07 zs8&M|1i1J9`;q548s%UVm+=ja|NRY!u|rD{uCyW%5xlilz4M)RZeqg7@-?lsNRk9$ zmcd9KhE#o0EI*@6DfmZF|yKQw#IZNH1a8f&)e_a%NXFdgeNZ z*B*jJN{*Jj@#nnpPcic`HvBjQo)k)4T>OQ_c-Q~A3*XB4mLtd=chLCj2*pC^6K{Sq zx2>faDdn_t*{o7|TZnLm8J$uuP-j`Dk|g2P)q(5xT_0!Yxrb8{Fb347=4o<>9aGHC8430(Qylk7J}Ag75)l<7|)C8U(lNA$@h;;YT-Q6JF-3?1g ziG*}_EzOVbgZm%2pUtzGYtA)i-gD0DoG}2!6V)BS#=w@J=3Rf}J@)EiP2)KlSq6uP2nyh1Ys1B)p+ zTSXnBK#{SDhbY<|cF+60?pmXMqJI25l2VaVd66f2!0yhiR3JCDLPZ3_brr}0svA@_ z?U(QqGNJl@8^PwQ($;)wqT)PHH9w#vwh@chg6^tDzpK`95Q$bUYwodsNh1_1c2^hZ zd?-G$LdyX9*LPLzehb+A!Z(q??`3W&=|KIvQfAKCsj<-Y>Ytvb5arvAm$^HrERiE1 z;1GMXM}jjb6PcOoH$j!fQy55B6TAK0+M1N!vF)LnFz4>k>G9RSKTeCc|Jvn_kZiyC zWuh6~R!4=gJ#UxLx~adD`MqvBeRmgCL~ILdh-6%=?3_+FQ=-z}*WROb)NM!rhkFi> zvl+V=9$2JxVlm&fTh{KbIo=JFGIp4(0|0cKLTXYVpcGP6OAa{R$o*7rDf9u*jFI~_ zdLZKHVX52oWq+t-`IiR%4MZH&fV_W6dss|KG(mJz`|Qok>M`0)C5MlvGbSeH&vjyA zVrCK+Hi@ucym05=oyoZ^y^CL++u_0k>0)7>2lZ=z*z_8e!g+WcwEiOrgY!uqw~}%^ zL^W!7(oT7&Kg%3$Fe;b|2c)a^zNW1R1qJ$KR>m_j^s=|<7V9(^awigPNZ=%Rw3%_f z?oC&-VYQSuv0R;;Qfb{$BIf(e)=k)eqB%NOH21?jQmFU?Q& zqDGkJ>s3noP6W=fs@ertzJ*j@1xOl{R~OVdraN%Ck;7?nj@8#vm@O+4S*ck2JbOvq zCOmsLE&kw*FbB3(43-aaS1NI@?M!(7F9kh73PxXQ8x-=Hh|!TCr|Pq@+w9CiUCW8i zQF3}(au*7PKQcOM=;D%`|JSN*m)XN`$Rx=Ozz%fZz@q&_-On(u@I0s&`!z+{)tNXg zf1!r6VE(abx>+Tfz_Xqkms5cybDLS1M5esFP?gX)6az_y``LFja~(C%$NIN2L#)g+ z!I%)x6i9HAPJ2J0^ZoHSupF7JBngdFts!*{RakA68*TYK$r98p_wOY9a;gWIpPxUz z^OIXhNaz9Ps&}{Aq1ha#pwOiAn3ZDvKEcY`dPJG}Hl%&q{YvS3Q)X9W_HaoW_Cj(k zD~8P2NVwD55BPYvQ$L@P)ZVOme|E4W08oz_TMNIxjo`ESxscdUy`^vnT5vRN01^@z znLnIcq}nNeJsEqLTQX|DpWpJEVe|o{=5GYVRLwa6Wv+U6SGTI6zg@o*nGpS0;Z-4R|nxOcel?6dC-Y4XDV};2sx;(yE3m@jd zNo-`@2qP7Ei&r)I=&>BFc4*S7VuY|!2=k-tGzXF(g3L*P2KNI|?*Zz0q;o@tabu+i zprvv#8-4Pb*$MM^toYJURX^Dr9uJ$xL1sBA*1wcIPDcjW^5+Q&t<_`+F-8R@k$^On z=s$R!U#+#~t{b4}1n0dY1}`d@QhUhuG8fTjV9_>)(=yw`DZP%f{wa5lKH54mcHY}< z$Fw#ffeWW${)yZ4W}}KX23wj{BuTOH zg-|FhL>!+{MU7v-=WTsGGnOJojClLSOo(EHX#5XK@$v90jE0|?T}PpB9A*S@4Ns(! z`+lJeU&Q%5KBp`pBo%goUQ-ckwf}0eSLXpOxgAmiEZtllA3mjT7aHfAyJ-w{$GAo? z;uFU4?Nap9!&jGmU#?EL-%9kB!GUSvqs=;a^q{=uG`59bRzFmex89w-js`h;t}{3t zmo?k0$7?VDj%~Zc_8f0MzFNC?(ZuSkCgrR&Vp>0Kz6+11l=LgOx$nFfF%@ngTP(QSY9z`A;4EcKTy*lS)@85~PJ> zQ#@?=zGbJ{3wd*MaH;2NR97XjCT&(Cvnfh8Nir<8-=G>%AC33*WZ74w>8LGiVl4t) z74||{Y+;DvxH^>^)5gK$q01$DT}}Co7UJN}A8%_?WNf*o(Kl|2-l=>k7gDMiwG6)-bZz>B?;2yrKz`M6Kc{%v}@m`DQdP84-9WzI9L z_Tx?uK`Rv% zm?-%!u+!YI1kCCn?-bxb`Dv}H$hHNFff_f^$aNdeUZJok!sq`G%^$u-vgDgoq^ov} zH{YTER*IaHxJSw>4?GV22C9&d2n(XTwx!~r|%V56T^_``w=UIqW|O#kTJ zPb*@s3FS%ETS4l6SN-}qUu8>^hd;Ae7oyg41Pu4f)S{azX0*+GHXD2Xg2R0n#E&&t zDv?DA;t$Kl0a?QaIq2LJVb-{v_8=&r_ymFF_2x%}r6v9)GtMsDx|FqxAS9O4e^q(nb^o5mMkL%LU3KFjzx2LVYBHJAgirE4YGDiHc4iO&(_nFeWgX8{==MAN>)yCe<0*Z8r zAn`JKsAHDjFg)ncK5E=**+WMV5>ABg*6Ifs2QYT^tmY|#$jTZ`i#NIH{5Ijg^ihq< z1(S32o{tLyT3|_pw+m#P04S&(to5RIM8f71&Q#uVGI%LcU%Ceu(wWe+1RR@Rsn7Ni z$Mk|kG6pcp%X}PVsO>RMavw$YgicEbx)8UcUH{zo2^!AY&q})YJ1z%#o_**3RvQ^1 zTUcJAUydG!XCF|*Hw|PWaT7csGY=Qac-*pKAVNZ>cY><*+p+eyyz61X3> z0ai4IQqMrSK17&3Mkfd_QM2$U1^G19gI|7wPKc8#bnEwTV-NQtf`WmKjY6m=#p2*V zw)LsIkNvxPOq=QMmunNA zrz#SobfvSMCSz*au#r*kU|mTSU@*)oeABpK^LIMVn`!(gmgvqNYsKpF25k$~U}2s} z*N*5wIl}YVSSdv+{y0ejsbxy(1mCX&a=matfILm9^FReD|D`2U5x>-owp_&TCwhk8 zdnOO)P)Wd|Ks1ohMiMeZuT0dy@4tthc!6n_H1>HbtIH$<=@g3`74@YShPU(K;We!O z;c;TcYxLzU(!vg9G4iogP|d2w>q1_@=CorS#Fnd%gI#HMA{eKYiI8EGa|MsU&ctH zFJf1a-B+)`GhJE83I_Tje=noa+Kv*YhR%vDW?{a>Jxwn)}`3jgI5W zgi+1DOjeUH)enTBAwuXGVBML(3co2r443mwq283W(YxT|dIW;`u|eZR>*+k_L6##V z&qveL{Ysy)KBMA_Bg1SSO=V4{R7~;I^U`J_Y9XGMbieZc&d^{Ji}+}o{)4U4H?YHF>G0@)BSd*1aM%+7F= z0{@$`^Z~e7#^$o#KEl)dhI~ZWti_yv{2W{9evI?GdbTAxdbAW~*G=cpdQsYNnnU}n zv{aNqY~=@?FQhBq&K%F;lgi>pxU0QUT&~)m$(^Y&j&l5$vJ=ov8p{b?%$Kr#UK=MU z7uKO}{EQ7q9!3fSpI<5sH0e;O8eeYdSoUXrJ|vGlHtm$!BAI@~E^!d&){x;w5ZhD> zeJgTzUa&Lxr3Ldw>ARE|wc#0Y20)g9IyFs38kP$k*LSms6?q6ur!7>LdXksOL;d4N zW#~lvf=+pHI`}8OlC7yNVNOCjwcvtne_gQ*@D0#18e*~;0N1#D&6C(dI-Iqh4~7=+ z4aaJer%@2Z3(G3wyN9E+|Kq0U-40}{{`kRbj6+MX9j8=#3IEr0RH|^uNW|iE#}la& z>gQ5#xaW2<7pp{#p2JXu@JVo zbI>VseZX>CkKy9H=a)3Eq23!|+u`1jm(xkK6!?K8oa~mQSP2FB9j@qXrZ@P6@8O0` z=Z|uu*Eo3^vB6azdUO==qJcQ{)_(6bhEAO(nJ60Yg>Db%3bVT_3lrw4Zy$O~8x9j5 znD@nhym%6TzV2M^lx25ek677DEO?v03pC9Gx5)oce6kFmr81z%)-Ctl+;WBuaeuFm z(okGv?{4e_Y()dzSu2M^?Kw$2E~oYi@j8=n^j`PrHF2njYo>VxLmri&u=~K|*gw^c zL4Eoa9H;KvU z8})R>5zBKY=PTWi?1G@}+dMR%GVJTZXJn^_>AtWnrmsjpoEmFM8WHx|&XEyn=$EN< zv=ThUp7*+2UN!gG4!fg;pz@jm2f_qj_a};6r!~FxjO%JnFH>5uEjoFG>07N<)`0^rTX9Goqkd??FD^Ex+mJGydtno@o`)XMpQL2Dt}8rkg+Z%*x9< zY~|4UX(_GpwR04H*}j9S$|sF2NK5}mWRww;q@TN%(V);est`vqgjMg)D?>dt-rBRh zhc53(;Tj!tR##|Zt6gIArq5k39{ z2__97?7skoPg9|tA)%cEuBp`c6+G02UyA)D(;1E&8cPKpax?zOMPEtN!sH&uN+rEs z9#9n?+=0f`Kk^PCuN2|)?bG+#UX_6Ym;ioS3?p`5DP?YoL}=Gh z`?v?634T<91PO zi{CIL+HG;CYdZo0oWt{L8-CwPb-o+M4O9XdOX*L#;wSN#;NOg{7`8`9CQIRYb5+4; z71kc_r3a5^J(-ZlS^PzucLZuFoe!SN=My>Q7aeJUTnK%!Jr9S*P(fIU3>C1U>VE|0 znApUT-q)&kV@Xjwb_5mk$*-8%M>80tpOP#wz&7i{iuqSFO49awd`w!pFkJ#b%xs-+sjqwGI(UIz?ob*qBKzKhetM;i6*;7Il9Drw2n<;le!vgFhEa0AcXKS{}aFRbrJyRiMuGzkNA8 zTNPEbJ?eiP*feANp+>fTU;WHK=oYC%9yfAGXUXu z(B)PhXjENoKDB4g@+>Z&Lga$P4}CS9mp6GYQs0A`eP>$c(rK)%Yd|uF4y>VI?oI#2 z-i@bsme#N-P!6@SAUx4~c*6opzqq%0AGjeBh|OI@@)vH+(LoFdF+>u+43`b@6y5h+ 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 OfP#!Nv`k9h=l=lo#qM+f literal 0 HcmV?d00001 diff --git a/Images/transparent.webp b/Images/transparent.webp new file mode 100644 index 0000000000000000000000000000000000000000..c1e38022efc05d5bd3f5ba54f883bcc0dbf1e1da GIT binary patch literal 8094 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 s{?#1sU size) { + Py_INCREF(Py_None); + return Py_None; + } + + ret_size = WebPEncodeRGBA(rgba, width, height, stride, quality_factor, &output); + if (ret_size > 0) { + PyObject *ret = PyBytes_FromStringAndSize((char*)output, ret_size); + free(output); + return ret; + } + Py_INCREF(Py_None); + return Py_None; + +} + + PyObject* WebPDecodeRGB_wrapper(PyObject* self, PyObject* args) { PyBytesObject *webp_string; @@ -62,13 +99,42 @@ PyObject* WebPDecodeRGB_wrapper(PyObject* self, PyObject* args) return Py_BuildValue("Sii", ret, width, height); } + +PyObject* WebPDecodeRGBA_wrapper(PyObject* self, PyObject* args) +{ + PyBytesObject *webp_string; + int width; + int height; + uint8_t *webp; + uint8_t *output; + Py_ssize_t size; + PyObject *ret; + + if (!PyArg_ParseTuple(args, "S", &webp_string)) { + Py_INCREF(Py_None); + return Py_None; + } + + PyBytes_AsStringAndSize((PyObject *) webp_string, (char**)&webp, &size); + + output = WebPDecodeRGBA(webp, size, &width, &height); + + ret = PyBytes_FromStringAndSize((char*)output, width * height * 4); + free(output); + return Py_BuildValue("Sii", ret, width, height); +} + + static PyMethodDef webpMethods[] = { {"WebPEncodeRGB", WebPEncodeRGB_wrapper, METH_VARARGS, "WebPEncodeRGB"}, - {"WebPDecodeRGB", WebPDecodeRGB_wrapper, METH_VARARGS, "WebPEncodeRGB"}, + {"WebPEncodeRGBA", WebPEncodeRGBA_wrapper, METH_VARARGS, "WebPEncodeRGBA"}, + {"WebPDecodeRGB", WebPDecodeRGB_wrapper, METH_VARARGS, "WebPDecodeRGB"}, + {"WebPDecodeRGBA", WebPDecodeRGBA_wrapper, METH_VARARGS, "WebPDecodeRGBA"}, {NULL, NULL} }; + #if PY_VERSION_HEX >= 0x03000000 PyMODINIT_FUNC PyInit__webp(void) {