From b7e31ba19499f7be8f89fb0d2a4b5adb7b30d8a1 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Mon, 29 May 2023 19:19:29 -0400 Subject: [PATCH] WebP/Lossy: Add test for lossy webp with uncompressed alpha The alpha channel of a lossy webp is always stored separately from the (lossy) RGB data. Alpha is either compressed in a lossless webp that stores just the alpha data, or it's stored completely uncompressed. (But again, even if it's compressed, it's losslessly compressed.) This adds a test for uncompressed alpha, which I hadn't tested before. It seems to work correctly, though :^) I generated the test image by running: ~/Downloads/libwebp-1.3.0-mac-arm64/bin/cwebp \ -alpha_method 0 \ Tests/LibGfx/test-inputs/extended-lossless.webp \ -o Tests/LibGfx/test-inputs/extended-lossy-uncompressed-alpha.webp --- Tests/LibGfx/TestImageDecoder.cpp | 25 ++++++++++++++++++ .../extended-lossy-uncompressed-alpha.webp | Bin 0 -> 95004 bytes 2 files changed, 25 insertions(+) create mode 100644 Tests/LibGfx/test-inputs/extended-lossy-uncompressed-alpha.webp diff --git a/Tests/LibGfx/TestImageDecoder.cpp b/Tests/LibGfx/TestImageDecoder.cpp index 5ab61de362..6900920b34 100644 --- a/Tests/LibGfx/TestImageDecoder.cpp +++ b/Tests/LibGfx/TestImageDecoder.cpp @@ -379,6 +379,31 @@ TEST_CASE(test_webp_extended_lossy) EXPECT_EQ(frame.image->get_pixel(341, 75), Gfx::Color(0, 0, 0, 128)); } +TEST_CASE(test_webp_extended_lossy_uncompressed_alpha) +{ + auto file = MUST(Core::MappedFile::map(TEST_INPUT("extended-lossy-uncompressed-alpha.webp"sv))); + EXPECT(Gfx::WebPImageDecoderPlugin::sniff(file->bytes())); + auto plugin_decoder = MUST(Gfx::WebPImageDecoderPlugin::create(file->bytes())); + MUST(plugin_decoder->initialize()); + + EXPECT_EQ(plugin_decoder->frame_count(), 1u); + EXPECT(!plugin_decoder->is_animated()); + EXPECT(!plugin_decoder->loop_count()); + + EXPECT_EQ(plugin_decoder->size(), Gfx::IntSize(417, 223)); + + auto frame = MUST(plugin_decoder->frame(0)); + EXPECT_EQ(frame.image->size(), Gfx::IntSize(417, 223)); + + // While VP8 YUV contents are defined bit-exact, the YUV->RGB conversion isn't. + // So pixels changing by 1 or so below is fine if you change code. + EXPECT_EQ(frame.image->get_pixel(89, 72), Gfx::Color(255, 0, 4, 255)); + EXPECT_EQ(frame.image->get_pixel(174, 69), Gfx::Color(4, 255, 0, 255)); + EXPECT_EQ(frame.image->get_pixel(245, 84), Gfx::Color(0, 0, 255, 255)); + EXPECT_EQ(frame.image->get_pixel(352, 125), Gfx::Color(0, 0, 0, 128)); + EXPECT_EQ(frame.image->get_pixel(355, 106), Gfx::Color(0, 0, 0, 0)); +} + TEST_CASE(test_webp_lossy_5) { // This is https://commons.wikimedia.org/wiki/File:Fr%C3%BChling_bl%C3%BChender_Kirschenbaum.jpg, diff --git a/Tests/LibGfx/test-inputs/extended-lossy-uncompressed-alpha.webp b/Tests/LibGfx/test-inputs/extended-lossy-uncompressed-alpha.webp new file mode 100644 index 0000000000000000000000000000000000000000..27800164f4bd702acdbd406c7ef5f77750b49db6 GIT binary patch literal 95004 zcmWIYbaN9aW@HF=bqWXzu!!JdU|}v~ZM^V`}@tUFYw=|MLI;|L-5(+&-~&eshw8 z998V%8b0Yu+O=Tz(bwPz!A(3`mZ?LPfP)yq@6)mS4KCY09Gny(3sFZr$*tj@Qrow1 z(~+wW-hcQCG5YhnJ14g-sE@V)-GD{BQFv6^G@yWbZaiwKCI#^f5#*g_U20g$Xwq=% zFG1@b%<$tR&Nf-k(uL>V;y3X6f;6gR%yg9aX=pGZ&WV(%!tXUy*;5frlv&20*?tez zNZhZ#_CJ?cn!cJc~yf5L$NAx!i=B>eyl2~Du~4o z1ciD?bb;t9f<|If@PU;Gd$4K5EB48o2ve~s$-xpq6xM3ktU(vU^vu_X7Y-iSy0$3Nu$KE#7{#yX=ae48rg5p7Ug=V zA{WxE8i5^0pyLY23jc=?Zx!1F6rHG?XD2o+nlqto!h{)1x1W0O2URkb7)wyK{Qv*! z<;@cZ4s6-5`M}BBpV1|ue6oVo1zQ9)2ovK*iqt^e45k{enj{o|5G;#Kd{)J(6pNtv zF=TxR_NTq=fvRW&GOS8&rAzL>)ch5}VjPALOf`r;oNOtH(o++$%wF&mB!i0ox?&hZ zSRfy31lbeTNTCX3r(=&G1_lPbjmXMC>^($UtMd?~8XaG*H$e$V6vHH=mc9pRIEo^Q zivv;#!`R(#)Qd5!^g;}maX7`L5b+b2jbLZt)Ico>nCCz=b`OGWaz^jOM1X|}5#|_S z^Z);=9!)~pSiP42_+Ldx6<8kRZWzYpex9O_FeOl$sOk-DK8$cjM2eLsg55xRRKrXp zl7_k%OyTk%$SD3DU?p(k8tyCrQVzl9&~Zz+uK)kd}N2?_8 zHj-2zI|`5c8S9Z1{{O#=Buf|=WDs#u&d5=Z;N_BN5Xs7s-HpeC3=9lxsCkI67nRYQ z*Z(H+k?cM~8i;m(9kR;*|5XSXj4F>*s)aK!q#+`xK?+qN)p^Ly#vefpq9~&^f5i#7 zMd%i?+5i9lzfX&99kLyG-OsoVS?T{a0-F;pX~{ZFU>0QmuqeGoBH%)r3FT8rQ} zP(05Bw*@N$+0g_%$iNVbtoj*N^I(FOXu|@us!WkxM8N%`KamxaG9<@Tiii+!<0t{a zZ*YfsnKm@Cn+bT3fq@HU@I(}ki@0th8~mS8d5Fg(0#eA<5OV)^WW_}U3`UklF4FWs z63D9)ifL0cfUE&wWH%G?AOph|WaZW%{Wx$NvcmuWD{&~JTo~CNLhdg{Ry>0QyZsOu zrk)F=4`t+39wb6DjO=DY9%NuBLslMz+fkaRBdl|AtE5y0*+GQd?}V&)Iq^0#mm?ww zI!9N85NRN529s#pk=;zlgA5Gb$jb9^TY{3){+~e}A;+zWEE!}65pur_vf|CeTc?5) z8_>~Fq&(G7O3a`N@wTCB;QBP+*UZaE+;`~Q{bp>H&|5yM5ciIDsGkQMJI z#&n390Hg?#ga{#z_B1F##ArhzyP1#&85l%}Q+@zh*?(F!;J^WbY!gBEBP-qj)=mt; zQi+J55@?HnwF)8D;7^PxOtS$P32SFA@?_1_AYGOCCpTSdtIa>$D7iMBo%DK4~Ny7Z6) z8`NN;G@y~)Ovr-_4C2Vjakb*)P?jRNWzuW zo6vL@0tzASpgiv|~b%V!{ZaOCL$N0bcSU zs`7#`4cOj|y|B9H!hd2x(N*LKP0`6akr1lTd^K3eZ z_-R0?b&<=sDmJ1VOO7HWM-$FL8px_~EnB;ZtY|7ZZX!hwvSs)q$nYPM+66@05rGsz zC~NOg+Hus}--hZmBu5jDpdKXEzl2Z?g7FlP)cpTHc-B;KTtjl$Pi2^M3DL+USuM(t z6>{0v5KhP(vgMInO)!E)K-)=S8dl@5G6|*tM1Q1p2}g7zhj|UiJuuvg!||BH$ZY|X z5{`iZxvz>EcbLYIF9LHih{j(;FfhykDS~0>s3C^U^I-}=GzlY;7zPn10I~&!@wlHA zxdQrs3ErI{XbEyngHpmVFd)}X4QO%%%_Uj^%yS?bj|V~Kxr5Ze@G+1GHhdMP0z{W! zQ$bZRkS#Eb+x=p@VQN71C*oVhoOOsQs0J-sQOdYzs`?7aFpz^`7`F#O8kAAC>f*{k zJjhk?e>;#ynqrvSK{PJ+Ge*1wNyG3jPvTuvJR;QPQ39%sD!y1MC0-x z*ce&(s&2EgegcChX2ui6DQ0n5RKjajNYj0_y3|*C0IOx5Q;&H1B{j$@)$z{ zQXdwfoeC_F$6y${2O*XiK7pwM(NA%1yNClx!!WMCEW}8vkT9!2G#2+W>NcP)&->;} zg1y{GYe;J_`Z~y?bPe$&7)y#$kjG#ciwB`bF=c*-DFV@d9HHWvR5M5(hIeDiQ(FXP z6^KT5KbL@{Tylv-8AQdo-b4rg` z*AZ3+vx*4%dIG7l0_I2=2(lfHMC8bx%n*0LPdzuuVHvY4W%uS zfLAG1Bq5F>g52Ro`qX<8Qh;FXJ0Z`8H;}sLh&cZf;WZQ`m$dPl`vF;XB!0CF3=F6v zcgT97Y(geLl@X@iEDI&ItHO_5!eJe>LS9coqhl=y`wUsd&w8}pG)DNLOm`EWR;FJB z{r~^}<0RsC?ZG@{g_MD?mT(LV$YopuX$=sVEd*%f;3vfXw^)IIX$&Zhj{k)B&d@c2 z{{R2CoakX}1_p){qzJ-V!Z9$YAt`B~#r`MM0L2?apQaMCD-FenL6(C+Zu{9vbU}xF z{8%N{5{`iZc~vlNj;^2Au15{E@Q|Q71b< z3@4g|yPF_mw+AtXB2O9pC)|poY7vLj3hkIMebs@xXnT~PUi?YqL43#uEaI%Zkk@TD z;2J?DCg5^8`@k~z3FHG7ah7ll49NQ&8c5n# ziQjsdEX2V?lZ`NaxM<|HXa5)BQUw>MLj*A}Fu0?x=KufyKfci_sN;|iSj1Vvp>8Oq z#jzI1QG;AWa7yV1RIJ53$%Rl1twlEQ0MxIzDf&bZ1B2gvWOx1l|DRw3Qw*v0ufQ`# zguH*XArH4t$(2ENH*y3)%wx7&fHKeU|Nnmi^B$9s4ZIIAg+vl%cM&1I$kt)HAEBFP z39`!n|KAbXoQ-_IBHsNaNISqAXmG3rva_*zP;N1@lK=m|<3BzdWgqAtlyypo(8AB6 zNdz%4l%o1$6Mjc9U^`$DDO2HKl5@}*eup5t8fyeGF!-XJ0P+6RaGY!s*c_kvo7osz&20|bN%p&Pug8%mBSvZHZC5QFwJWL5w1ZeUkIQHp0~ z54U4!6+sOBC~m{Qd>;9<7Xp!jB2B2|#O-YyGRSVm6+sNTC}Y$g@C^zwq0CS$#$hX7 zVVXq{%QOU)1@;3LQQ`tChlCYFcmn}0iR@&Y5yTLPtPKAO)I-QhAHnS*fkCqf zVlYKn6SfAAo20RZJ`sXcKh^>{IB`c11Iki^clfUT=tVa1KbDDnJi!8yqFn?rpd9V_ z6VIvFNCzwu5i7__sC}#ja&Y2_ATg9eE)^1zSjhln6N%{%Vwgh12(m|U9F9321_lP? z0~V1(p9nU!kF`K{F`fuwK-t%L5F=0#0zxRo$XSF0(JUH95EIIgcT;dWNtTG1z@dcN z$662@L4x0qRQ|(v9nUEwh5!HK?=@i!AsR*y!)#>7ox^H9NYD#M=o2GM%9J3;E&>?Y z!T53z!#re_Wq3@jMOOHKA|91Eq-YsIX~>TIjKcv8$OkMoR3#7uNGDx1Q2SU5WC!Do zAe61A_y*bZkd6HR8Ba}&BYbEXLDnda!!`JD2Rvh6X%C-yp+D#K;cD8$k>c zk(J`> zkKxj&GtDh{lwy^lWdyM!d*VNi3yP2rSS0Q=IA`QC5!V6}tezz(i0oke5ybfmN$qib z25&%8`2YV8BFYF9(`Xq%D93gEH%GA-&OuoSLX_)KPGF?&u@=Z-i9doEkoQ6T!dD5Q zb_f6OCvk+AmJy_c>|Y$?94N~Sh$`V2P$wsFcYxt(fOrP7g9$`XC$d@`r31ublzH#} z|4E!@q-6x5oQnA$`-O=p3w4NS!-4#aynvwrbE_9f37Hr<&WTD3Js$BWM}2!!BZV5XyphB1AIZSL z5Q?l8#J)xJ!Jf2>Ak_B%6|6ypvN4$G5{`kv5;+S|@mLE`*ugNN2x34!u;Vp>-VMs( zI3OE75!*eWSp=~oSEB!MEPg>gK7{xZj)4Jr!*N3c{t5tV%D^EA3OX1j7(pm^BoR11 zi2Dl6SU5eOxQd8o5i|?#5)k7T*82fb4&Wi7gkxYxM9xA4mUrTa3~a(6r@}D72tw&a z;ID)j7*sIV4Zn=V-t$0p7_B0x9Oh35Jq^`XC=cZbD-udL1_tCqFB+(KtOdle5Rza7 z89>xQNP_1r+aOQELiGGU??a$uWME*RQ3N$YodBi2V?Xvc5;-4WZACz15`#iMHm0G$ z3`3qw0jP7q6u}5$dIweqA>QNd34xsBi9Eat(e(fSrBr-tf+10k9`*a z@&Sva-kK4M9Jf?E)&dr8AevwVF`yhn?70+OQ%c2pS{bdZ&A2f2y>mPfgl5Lx&C|F2H1>?kithzLkX$SiN0v+Xka zP8X1J0_LOaQpXxW%+?c8)>?rK{r?|&PZPT7$OkNvTEa0fARnJewPP(H?uC$8J&585 zM&zE*cRU3ZTo)(GL8lOVNFm_{;b0(}HD3jF;{}_lPu(Wetr<||6L6S@Qc983h65Rh za!_*vj#H6A3Q56G7lSFn5yXJf{UmOoco1fD8*CeK1R=kmnez7bg|i0^?Afqk@1d*D zQI=35E1Zw3DH(@c&y&=K1Gy8W4@IqGEs)(!LHa$bg7ZN`hSsC5VV1KIE43BU}j)-BGrup*E0Cp&NzHC*8y^ zxQ|Id>1&c)!l51T2fDHt-L+)!kv&L61Tml-*hln;6JsbwI||ui+-!pTS8!{^A#(uF zpe^$KwWPM;Kw*zE5>BOKEs(uIOa$d4Yrwbo3gloU%;Ppu*x9#xEC}XN>^gCZ zK8VI+BFcCt86_M81M+2E4LL~OC!dMz6=EVt61ku93|C=})jg`s=zHOjEk|R2+gXg` zfGJe7(X`>`-b%$dxfj_qSS&Hm_JnZN5LkKQG=0^@(vPw7x29!0AgpVqM`C`z~ zqV@@OGuI!xaQ(rH4xOd^`+8Iq*UaELYAgsRlfhSfVQtyvXO(f=|JFLc!3Q`;b zqQ(K~)f1O(J9y#lix05F(0+aR@Z|jN6;o@Y%`u1kD7JFc0E$9@jktMRitHHGJQ@O{ zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiTTLm(``LSY>{14Don!(2wKg^c$Z>?XR+_f}oJXyFpW z$O#*SIFs`p7RrhJWBkEzl<^1S>TMg#YX5Woxcm6yx~lnK{BP->JU^#u|JVFi^0R-& zpI^T|Ua+qD_xva3=k9;_|7vgVzeWGe-?9Jl|F`?MedK?G`>XD6`1kJr1N#WuyY+Qn z8UAhj`}+U-#QX*2Z{`30k9mJPzxn$|NqA($VU8S_{aGE_x%TtBrG*`d=roS znfRe7C}P&(&Y#K;o-EmD+AjRb{oqN@q-;L*C;iQnCLOtI-{pIdbB)FPNp^f*-ohc( zVtIdKgr859xa541S@KrS0ZrMJU8=Wo%PT)cdM0IUmOT4r;(6clDuvbuk@q;b1tsGQ zt|v?>xinQ~%G4__uBgQ2&EECg>{4`f$cxx@&$J%dyL_C|-@DIhsk^FbsilD~=lhg7 z&$k{)>fF;a)j7{}=Z(r`GXA^gJmb-K4PRNQ6(~6`smA}+D$cdP_Z{%&azA*|W$A`c z*V83`K87@$ev)MU>H7T~zpH#98CL6$GwtA+wk>~+UJHhV;`z;;C%%Qg z`1P|YTzU4UQ!!EZo14~h`)r(JR&B5;!hey-QPvMn*WBFrr_{*P*k2*7FuLa1yJYLq z{N2gDr>`$P%>RAftUDhj&QY=b^+vVo^Q=d*2CeU2z0M80bY0Ht?HTi?wj`;Wf)C1pHC{J3ua{_6o68Y#(rc6|q*uWVU;;~-aZ z?phzCy;r{d(|7x#Tlm?aN>KJ|;rVq}4<9R)+_R?pjF8votE<%0SKW|lesE^Sg39Gb z_MT05Oi$P{zd<1BwcMYlvh(65xOz#?oNi{oboENVp{n$qA~#**BNGeyZtAk>eOqYs zEH0;P@>U%iSw{1ntP`|K<<==A{nix?oOk)K*J}GbuHOr|pYm;adsRSFM}{RgH_0TG zXVU_;xi{ZPwyQlm{4Dq($IsRoyEs2x-Iv3^IqR*Ham9n@4-Ol>)=xgabY@}L*4+no zetG)1WLd$7ElN#!nfBI;7vDQ}uIgIF$=4~KlhRXmBy%2KnAXj7#$oq;>058rmnSo7 zt<0*Q&k*v^NBg^4Y+t=x;xv=}U#;K9>b+x%15?AIe|5O>qtf|y(!fPMF{`K=;?n?KIS6YNG-Z07P=#x5L zwDb32Bir9I|4mQ(C_U$K8jFea2fG-Z?p1;7L}Z&1cRNSiOmH)v?`kvQ*9+ARJ5zLlB6ivzMSTMEa^JRu(^^Yr6 zueMv=OKRQx{;?VF??Hx3?{}Pe<$ZzJ9aisyL3?ZeuF86H^Yvc)$sB7kFU+e9xBv6w(bVX@8dY2GxJCYY zKH+f?^%?gF4&zr_mD|-;phJw4E{e6YHKiEf8GVx4}1&mm*dyFf6Tc<*7oJ!61(t_`W;hi z)*ra_`1I$pP37yR&kV5lo%E#m`6Y{l2ckD+#8w*k&yLtq|EKzk;8(U)cK81830>e; z{KfjDPJl=A6K0)%DhJx;m2I}&IG<(1MZOE?WHw#BdCM<`Bky$3%JYgniUMc2q)Wt) z=O_R9TbSXacW*L-?v#>HO?KzFWATsfAB^Yy<*|50v(I!ERq-rlfts1lUh!7iZY|02 zqVsCjNxZuqYIjtkx|n(I{O_~>JP7<_SL?Uqln0OYtuB|UMS>d*=i3~ex|#Q;{9akt zU6C49Ry_Nro!|F-u`kopqo2i7=jq$%=)6eq7rOtvbXH9Nh8$+|K}n3d#uub{~ABoBHYJjTsvRH{#-3~fjdRcVvJX9ds)LL-#B>O_sFys*{XT-J4CCs~wsAJIf=N3#cmR9y$E>LY$H1mG}jaLL5W_0D*U+ssI20 literal 0 HcmV?d00001