From 4ef76f3198dbbf4eb9d3f71a79ea4822ebf806b4 Mon Sep 17 00:00:00 2001 From: doctortheemh Date: Sat, 6 Jul 2024 00:33:38 -0700 Subject: [PATCH] LibGfx: Decode AVIF images Use libavif to decode AVIF images in LibGfx. --- .github/actions/setup/action.yml | 4 +- Tests/LibGfx/TestImageDecoder.cpp | 62 ++++++ .../LibGfx/test-inputs/avif/icc_profile.avif | Bin 0 -> 5965 bytes .../test-inputs/avif/simple-bitdepth10.avif | Bin 0 -> 1063 bytes .../test-inputs/avif/simple-lossless.avif | Bin 0 -> 64011 bytes .../LibGfx/test-inputs/avif/simple-lossy.avif | Bin 0 -> 1134 bytes Userland/Libraries/LibGfx/CMakeLists.txt | 4 +- .../LibGfx/ImageFormats/AVIFLoader.cpp | 196 ++++++++++++++++++ .../LibGfx/ImageFormats/AVIFLoader.h | 38 ++++ .../LibGfx/ImageFormats/ImageDecoder.cpp | 2 + vcpkg.json | 10 + 11 files changed, 313 insertions(+), 3 deletions(-) create mode 100755 Tests/LibGfx/test-inputs/avif/icc_profile.avif create mode 100644 Tests/LibGfx/test-inputs/avif/simple-bitdepth10.avif create mode 100644 Tests/LibGfx/test-inputs/avif/simple-lossless.avif create mode 100644 Tests/LibGfx/test-inputs/avif/simple-lossy.avif create mode 100644 Userland/Libraries/LibGfx/ImageFormats/AVIFLoader.cpp create mode 100644 Userland/Libraries/LibGfx/ImageFormats/AVIFLoader.h diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index fd0d2ee3723..4b6ad27c6f1 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -26,7 +26,7 @@ runs: sudo apt-get update sudo apt-get install autoconf autoconf-archive automake build-essential cmake libavcodec-dev fonts-liberation2 zip curl tar ccache clang-18 clang++-18 lld-18 gcc-13 g++-13 libstdc++-13-dev \ - ninja-build unzip qt6-base-dev qt6-tools-dev-tools libqt6svg6-dev qt6-multimedia-dev libgl1-mesa-dev libpulse-dev libssl-dev libegl1-mesa-dev + ninja-build unzip qt6-base-dev qt6-tools-dev-tools libqt6svg6-dev qt6-multimedia-dev libgl1-mesa-dev libpulse-dev libssl-dev libegl1-mesa-dev nasm sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-18 100 sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-18 100 @@ -52,7 +52,7 @@ runs: set -e sudo xcode-select --switch /Applications/Xcode_15.4.app brew update - brew install autoconf autoconf-archive automake coreutils bash ffmpeg ninja wabt ccache unzip qt llvm@18 + brew install autoconf autoconf-archive automake coreutils bash ffmpeg ninja wabt ccache unzip qt llvm@18 nasm - name: 'Install vcpkg' shell: bash diff --git a/Tests/LibGfx/TestImageDecoder.cpp b/Tests/LibGfx/TestImageDecoder.cpp index 6d2bcb44332..d5c68c4a669 100644 --- a/Tests/LibGfx/TestImageDecoder.cpp +++ b/Tests/LibGfx/TestImageDecoder.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include #include @@ -1007,3 +1008,64 @@ TEST_CASE(test_jxl_modular_property_8) } } } + +TEST_CASE(test_avif_simple_lossy) +{ + auto file = TRY_OR_FAIL(Core::MappedFile::map(TEST_INPUT("avif/simple-lossy.avif"sv))); + EXPECT(Gfx::AVIFImageDecoderPlugin::sniff(file->bytes())); + auto plugin_decoder = TRY_OR_FAIL(Gfx::AVIFImageDecoderPlugin::create(file->bytes())); + + auto frame = TRY_OR_FAIL(expect_single_frame_of_size(*plugin_decoder, { 240, 240 })); + + // While AVIF 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(120, 232), Gfx::Color(0xf1, 0xef, 0xf0, 255)); + EXPECT_EQ(frame.image->get_pixel(198, 202), Gfx::Color(0x7b, 0xaa, 0xd6, 255)); +} + +TEST_CASE(test_avif_simple_lossless) +{ + auto file = TRY_OR_FAIL(Core::MappedFile::map(TEST_INPUT("avif/simple-lossless.avif"sv))); + EXPECT(Gfx::AVIFImageDecoderPlugin::sniff(file->bytes())); + auto plugin_decoder = TRY_OR_FAIL(Gfx::AVIFImageDecoderPlugin::create(file->bytes())); + + auto frame = TRY_OR_FAIL(expect_single_frame_of_size(*plugin_decoder, { 386, 395 })); + EXPECT_EQ(frame.image->get_pixel(0, 0), Gfx::Color(0, 0, 0, 0)); + EXPECT_EQ(frame.image->get_pixel(289, 332), Gfx::Color(0xf2, 0xee, 0xd3, 255)); +} + +TEST_CASE(test_avif_simple_lossy_bitdepth10) +{ + auto file = TRY_OR_FAIL(Core::MappedFile::map(TEST_INPUT("avif/simple-bitdepth10.avif"sv))); + EXPECT(!Gfx::AVIFImageDecoderPlugin::sniff(file->bytes())); +} + +TEST_CASE(test_avif_icc_profile) +{ + auto file = TRY_OR_FAIL(Core::MappedFile::map(TEST_INPUT("avif/icc_profile.avif"sv))); + EXPECT(Gfx::AVIFImageDecoderPlugin::sniff(file->bytes())); + auto plugin_decoder = TRY_OR_FAIL(Gfx::AVIFImageDecoderPlugin::create(file->bytes())); + + auto frame = TRY_OR_FAIL(expect_single_frame_of_size(*plugin_decoder, { 240, 240 })); + EXPECT(TRY_OR_FAIL(plugin_decoder->icc_data()).has_value()); +} + +TEST_CASE(test_avif_no_icc_profile) +{ + auto file = TRY_OR_FAIL(Core::MappedFile::map(TEST_INPUT("avif/simple-lossy.avif"sv))); + EXPECT(Gfx::AVIFImageDecoderPlugin::sniff(file->bytes())); + auto plugin_decoder = TRY_OR_FAIL(Gfx::AVIFImageDecoderPlugin::create(file->bytes())); + + auto frame = TRY_OR_FAIL(expect_single_frame_of_size(*plugin_decoder, { 240, 240 })); + EXPECT(!TRY_OR_FAIL(plugin_decoder->icc_data()).has_value()); +} + +TEST_CASE(test_avif_frame_out_of_bounds) +{ + auto file = TRY_OR_FAIL(Core::MappedFile::map(TEST_INPUT("avif/simple-lossy.avif"sv))); + EXPECT(Gfx::AVIFImageDecoderPlugin::sniff(file->bytes())); + auto plugin_decoder = TRY_OR_FAIL(Gfx::AVIFImageDecoderPlugin::create(file->bytes())); + + auto frame1 = TRY_OR_FAIL(plugin_decoder->frame(0)); + EXPECT(plugin_decoder->frame(1).is_error()); +} diff --git a/Tests/LibGfx/test-inputs/avif/icc_profile.avif b/Tests/LibGfx/test-inputs/avif/icc_profile.avif new file mode 100755 index 0000000000000000000000000000000000000000..d79c6a2f1dcbdd3d660a3bb9d9b3c49b10ac2f94 GIT binary patch literal 5965 zcmZQzV30{GsVqn=%S>ZnU|;~zxtVE(xtWP+3=AxWxv3?IAaMo;2E~k&oFXWjp&&E4 z1jdHZd0|SFeW=?)Gi09(Kz{J1=VzGoWfMh^SO$dvn4ni|92%TqOV6e!{ z%mX_EtX?!TFD(_UkrCuD14EETgdh`KkhvhUps0X>f!QmwAUU6bfoV;0eoj$AQGOZ& z1Ji<>YB@7IV2@DJjX5}RXAodIf1_qJjjKmZM2F5iE z3=BF&5s^_042(BG;zU&3jlg1zJWdP@toQ!^|E$Wuz&@FQ;qQe1|9>z1|NrkI1_tIk3=9YI5c=~M zFfdqrWnf^QfDlue&%nUn!oaZY2tq7rIs?P@b_NECn+1tQkR;8_z`($imd3#FX*mM} zZzKbQ@C612u4qWOF)%QI`>J=-kL41M<2^W^q9(h{3?X@BxbX3NkA)L1K&`(=8H9E1W^R(xN=8+=A3} zFyUmCoS9r;Ra{wIlA2p=l~`JlnUk4VRB4r%Q;-4nEYubrkXCHA2*7M%=HLL?BbQl_ z3)Tn_EEmuCcR%BDZiy< z`3{-BG}jQ+yrE(6(s*mpwhw21dTVA(S-|%8#9r+a=^4}Z?K7IW{Npd_mHX-$r|PhO z^_+jWk142qs$+zG$ql3R>sfoUxgwVN-%Hu(yv+3MvNrRC-}6rhJvsUz?Y-*KhnLq~ z$+v#@Wq0E2Vu_+Ic_FDCS8`_IX>5lZs9D&y`sqdw;5*5EB$e#d;=*?gjy<%6rq-_8BrTMj0g z+-!6`e=#D?Fm{WmM&?I>SN5F?v%GlI?u0cIPSI~qov^lZLZ?E7${xWBC;Tm@PmG_# zw|4LED?(o@rg}%PKMJm63FKR8aKJIswbK7|{$&8-b??hFf0509v3}vg4>@-QgUep8^Zco;Xp_IY zzDB|1y8M&(cUOD8TARXE9q2#dVeX#Cp>DdjqP%aK&zyfJYTHcpXSYA581hnK(TmeYW|{4ObMe>0D-_H;emlmO+=`2P-yikR)%eVP>-{}$J^Xh&D=scM^h!tU%S8_9$)67&ig!Bj=8?r6 zM)CPw*X8RBx%a&+{nRftt1D#lJ0;&D;q{f5&PsF?{QY=^D^@1UR^L!l_X?}m&Guc_ zwq9ryF=73b#yM%y(pR4{bJlF1|8seB;DZ{kEZ&U!DJ5H%%B3xz;1pr z%hQ#AoHe%VlD)vVRz9lji?CC{lRXo!O{kj4{}l( ziOQvfx9O9%o!mGvDtUf>om7kCzF^bO!Y=#V?LRCqepXifdy>pW;ZFx*v)|uzUwr!C zj)iQ7X0sN%dw6%JScte!-qM{oVKdXON$c}>N6u17lQn8$bMj3}zyEmS;_6B6wUc*D zn%ZCUjcx0_Ws`O+S51F&X_o61bEip6ZCC9t)}4~$5O^?w$M^oP>dCRF&p`n%*pCbIVTD^&$u z&QrhscC6!{D_dv$e7iJc)p-q{E5Y##)BoP@O4pyJn$oMYbMFs{?iXLryxM=wV6t>q zN75lfjwQ{jyF&MGzG%v@Wd1AvNeoH9IgWf(YjWY;dgIX{>HFdbz6EofRM{qYig%NW z<&$dVR z{W`sM&7Tl&_m%FC_vf4nc~zl3X{P@l*-s{uN~%{bKE6Bk(Bc4=O@7L&+KP&qn+r4V ztT}mU!ZX=BHysMUiIgTv+7xr0n5XmVhv|8xn>7WqUOw?WY2h>b`;q!&-EDuj-_L13 z7_>cT_wuJ{lX`Vj@*={rQqJlWJe=v^@wvVJw^Sgb{@lN3f0ql)(!6cIFu8SF#?L=t z=a%^z-F%kETalfc&sg=~>!y@W-NT1IEx$B*%k?c5a_h{tR8_CfHF)#cfBX6MEg}td zEq{w76Vm^@ztF}t{j|Wry(M3#o%J#Lyy4f1dHbBRRF1?uYnE#(uXmnTkyUz_;c(m0 zZT^80m%Ied1!tP2Mwqf%G+y2;Fva7>Gn<0n2^^7Y#r?OR{$00z;>lf;ZfrK$R2v)6 zv*7;0?B%ubj2&s~^nEhF{xlaBiPVm$-|9@Ni#LqcXmq&$F6+E@Lak;&4Veh%kUzqG$ zySXIAl;2g0uI@&3{oU?fTjI;0C+EU9b#C9$?t5>=~fy49=)3YrXxel1#`f$v})@k9=zk7pEtIc^S z!)K%DWk1(1>ces0;CYK`7EKQMrX{oQ@y?4H&mW4Uyl8zDoSf0rab$t^euLRB_O(Ym zC||a{{^0xnlY=@k+y%~;zb?P|kR!)g`nj&}0c+DOH-lEK=}&$o^gBn}$2{wSd#iJ! zY}fVMEniOYJ(Tu5;Bx=hPrD0KcsIPf6X<6AuIRx2IovP*pJ<4i5YI0hI^VPUo6xj3 z(F;9O*Up=M+2nrVX9md*RUc8afXT&fOzMw$O0&(*FKiMm_t|;;xAx~ra!#ysgHNxx zq0@NwbneoiJuDk9*j?h?a+aw29xLFZ%)a=sE ztm`HDf{h4W{i18Z%lS9O0>%e@yS-O{a&J z{`Jn>Urz2^sxaU4u8sE1J7>44)vVn*^MiKQznLGkMFhKs&bOk}y^{&-#R^P<(v_ja}Y=npa8R>uD#@L1%s|5q~OwDy0# zC?s%x&Z(_S#2E^&-H2GE`|P;X&&*RyAK5g%^~6u!8nV)bPddq1rCZD7T(Co_Tj^He zh5z>Iw(PrcQgZIqpa~u~XU&=Pcb)kvNppi*AxFP|0YxPz4;2_mKiqZbb=Zy79f^#l zLhoaDhTOb%(Jnr^vuSbT0*_b;-IUK<(I2--{a>-XerfNzMu(r#p2l9e^*?!;{^tDp zyWxAigvY@vyF0W@cCA>m{*Gsv_j;2xb~W}Ll}$?~sgxF`2R+;=?tWr%Wc0N@^Le>D z9ZIcU>THVee!TDYkvmMc_nu{+$1q(p*5}XFHS?F(UTB|G^7A-b-cg^HryJ+rna-5W zG3QKp_o^dCPEj^t4CjjPvl{B9yc51J*qgGmQ)bm`!#dS?QRkdlkNLV!YhS-1zE2|j z>ybWbiJABQn+O_|$G`ie6F%#O*;khvH{-UtoIT|4>aRFglly>Y-o#H+?8=i0x=jiU z<958h_I9?M)5HsprarXY^YTlcbN=iB-^+g~4$F|Tr;^?cr&fBGrMS>naTdl3_~m}>tmJ-T=un}q3(-r0JQFU=pNg|f3Rkf_r8m|kAG?Bh0> z3${-_<=j+~(236a&8Xt_qDt&m{1R59T)r19MvPh4P6Vk;`1hy!-T^zk8ez$*6P7El zKj0M9Isd3Wa=A-L;&!QxeP^uB{LLzL=1S4N&Q!=fJ^sV)#AlAPZ@kyt&Y%8at#@0h z|J%*J`A7A$FPo@N3-!F5Sh3CSt|WtHPUSM2@+;>uWztxb^tEr?b8S~tpRm}LvHf@3 zoC~Y;oZ>$pGj~Z@xT?IY=k`GO)w_rQ`^d?+2*^{-)@!I(pqeoYJOt=N#%nR zXK3UvxMUOHvG!cfr?T&7;+{@0)S11BUCG-)$#jME-uv}IjGK%49!vNKyngz0<@KDr zusWY6Clk-FOV7@HtT)eP_r81Uwr~bye)TgD|8&Xnx9eMusuoYSYwEf#xXYM#vcR&8rA zUwzmgC8^#Tp7duKyz4|}%vvPd%%`+vT8~4t3!nXB*|@3Yd-Jy{DylyCJB*>WQ)&uDo@zQ?xv9Xm=x)#Y|YIDcM48_T~15mhS!T-#jkq zvv;}LXijTCmi+AF-9}N?33pF@PBnc0B*`tT_vge44u6*tWcS zdGgnY`ntk?`mr zsu%xkY~T9iACGud(TD!o=3zGzy^EZ;^T*8P(fK}0!{peBGgB6Re>?HXxd~-aKjuD~ zA9P~z&*-@<6)jsPX+D;pvg_{0ACL2W#DkX}WBvHe(_u9uw`O+KBOm^#cHLracf);d zg==~)T&;^`5ZN8oQf23#aXlIrn*&I{zS91Tg1Do=>iI~_C|56gG5{X>E}DGcUiId zAN`enVfHmK?=QQRod4`u@zLGC-Tyr2;|S59eO*nAOYK;4yHuStHm}}wa^EzcwW60x zDwtKS=I*dsxAIHs>^Bo4Z@y)GzkT;1MO%KSU~UP>TlDXP}eS%_g!nQ@MO;;aJv@E-PMo1^=O?Ipb|Nr71eeK=% zRUW2huIcoga4X8HRAz;#<#wC3fxp$XT^il*e3>2W%EQmTTYh!%qHaF8oRu4Uc7Mu@FzdL9{d@l^R;Q>R-skvzap{(0Gp;>NX9|DL zvg*v!LivuA^f#=xg-%JIYj3^8G%2%j@9vpl(_eYBa~@gthqKsdqV30-K?~1tod|7+ zyEf_a#5M7!@89sOzj2*=-p2rrou~sXmdjD|P zDS4)EfpS#U-ALPRr-&5Gz*ETE=-e1Uf{LgfW_bmT@ zc8l_^F8FKk^>m29kM#LVnWI+K&2IW~Kh*O^kG{n*{s&QW*ZuD~aP>&$r7v=Q6D~9! d*GOz|*mkG4QsG<^!_P^5``%yN>BLsl002;gQg#3U literal 0 HcmV?d00001 diff --git a/Tests/LibGfx/test-inputs/avif/simple-bitdepth10.avif b/Tests/LibGfx/test-inputs/avif/simple-bitdepth10.avif new file mode 100644 index 0000000000000000000000000000000000000000..ebd56a8f83509b6ff0faf902c1d606c40a716722 GIT binary patch literal 1063 zcmZQzU{FXasVqn=%S>ZnU|;~zxtVE(xtWP+zK({D3=9mPa#KqZL2?WX3>q0JIYm%5 zLqTS835*S*b25`a+Cfadg3OX!5QBk{fq_9TGbcY8#B*U_U<8XWGB7YoF)%Rmg3Qd! z%mdpEmXXTLOG{+}DP{z@#=y`yKPMk-WmaZEQ2_%3gLh^@ay|nCgGgp^K`KZg0|Ubc zC>AKltjGk3F>`ToF)%RjB$gREH!3)QgoKmxbBgkkb1E1Z8F(4k8W40yNh}d!;NrB9{r&sK0cXc0Mt@mdQWz$AsswC_yMMDw_mrF9RSr*^ z#o~=~r!2Hqo>_Us>t4-@t+SqA`#QN?-00o=+d`?m{=N#=rU*M9kFuC6-?8AHX17^< z%sE{JmfThIW>32%l+PIQVs${nO#P%gDTX#>2U-;HkjY*y7N|378J zrvQtR^=x0=I#<-ZSo%RPRsTx!Bd#TnzHi?XDQ$i9q;-|L{Oe;Ac{&$8E$Y!dFL9^p z%lw0<#AcnEqPK7{^Tj(#sy#h>4~p-5qw&1Y{7UMq>Sd>DmoxAAr}V)2X3gK6=fyj( zJ^r@BP^e>v)WkRSTb`QEuI<}bTy;}%)}`|%+ii{oY~HZ`Vf#-5-&5)rE|uKhe1c<| zWbQmc_w{r1PS`Mry|g+#@tol4%J}Ol>qGC|YAVc<*OvQbRATd?JAPyR#K&*@UvdSi zJ2XGr7m(?-M)60)y6wq(E%q2py8IzMx4>h~^BWW1GO-*`@>qUBB6-T=)2&6SRu_*Z ziMuZ|EDPKqTH505Y$eV&)qi7ll-ahO=6%*PN}MuG^)%Yg-&67a6Z!bXy_3!Y(G^Tn zECr=!{nAW&STy6Qz^g|SeMD@I&suEs;@rk_Gj>Q`?7C%l$no$}@%+9?UMazDsjQQi z%b9dIFL#~QbIV}1n>D{Zr}hl7$k(DDra7Je|4HtNVzSyzwJ%=F1E)_7{d(z+gZjXTKqbs5tGZnpOA N+YC=uy7Y3^0RYEkvX%e< literal 0 HcmV?d00001 diff --git a/Tests/LibGfx/test-inputs/avif/simple-lossless.avif b/Tests/LibGfx/test-inputs/avif/simple-lossless.avif new file mode 100644 index 0000000000000000000000000000000000000000..66a3d864daa5d667a20270a15c6e2bd185a63dda GIT binary patch literal 64011 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 literal 0 HcmV?d00001 diff --git a/Tests/LibGfx/test-inputs/avif/simple-lossy.avif b/Tests/LibGfx/test-inputs/avif/simple-lossy.avif new file mode 100644 index 0000000000000000000000000000000000000000..1aaffad649e08082f3b333d9bb8b607b642c37ea GIT binary patch literal 1134 zcmZQzU{FXasVqn=%S>ZnU|;~zxtVE(xtWP+zK({D3=9mPa#KqZL2?WX3>q0JIYm%5 zLqTS835*S*b25`a+Cfadg3OX!5QBk{fq_9TGbcY8#B*U_U<8XWGB7YoF)%QPfXvLy z%mdpEmXXTLOG{+}DP{z@#=y`yKPMk-WmaZEQ2_%3gLh^@ay|nCgGgp^K`KZg0|Ubc zC>AKltjGk3F>`QmFfcIiB$gREH!6Tc7=)AabBgkkb1E1Z8F(4k8WJ{?%$MJdCE;tdHzn- z`_^Y0BU_)(KcQ})@su%h8Rs-*>xaJ>@8oZomL-_ORDO4B?nV*GnzEMI7?%&9xlFDF zs8E0-TZj(#zLzW$80&?MGKDn z_sjaX@Yk7tsVDx5MQCW}B)nz1Ao9E}m@~}xMuLw)_j?@@Et>#fOG z3*2zbqRBklZ*7BdRF2_<%dM(&tY=o3dnj`0UNS2Tic7X+b~^TXPQ7#Hp|9?XcUR97 zGgaYMWUD_pMSESy%gkEMV}6lq=0D`xP+NLqz1{oyn@ds;7TrrW*zTK_^moRrRa4ev z*1UY0Zl&Zb72~%+HQ@v21$hykuHVA3e1vz zaw4+dR+B~IgoaUdl=7tdpGiBu-P~~_WajMO=6-t(Di@t&+mdjMjrrP#_YAwg?^e3< zCZ&*UtTHteY^|Z-G zPZ&4;HD8s_yZ@8qS`91iPmcahFSh*J_h*7p{WZpW;chzH@=W4f{_Ifs79}w8@|#29 z&!w!)XLQZ^@cZ>UQGFA$(^_2m4s09zllp%qZK{tbQwX$8AcOne(UFp?gnX5I+0;^^SmJYkeL5I-HlAet5oJ-nG}~o!C$Fy0bno z7f)dQJ82rvF^Pv_J*_4mq83g}%)0SJ!*V0rNsT{}b~f(0%+5jC{7fzj)a++u=D21B z^Ubrb5n`Feb)#zWpCx`%bgxZfzIk@#ZzEX+UC$>~c^`5%ToXHboh|3*&%6)Q8O0*n fg`ey>_V2bznpD8a*FAsl^Jhy<&rr@Uj&A?}hmpkq literal 0 HcmV?d00001 diff --git a/Userland/Libraries/LibGfx/CMakeLists.txt b/Userland/Libraries/LibGfx/CMakeLists.txt index 77c920428d6..ee1d354bab5 100644 --- a/Userland/Libraries/LibGfx/CMakeLists.txt +++ b/Userland/Libraries/LibGfx/CMakeLists.txt @@ -52,6 +52,7 @@ set(SOURCES ImageFormats/WebPSharedLossless.cpp ImageFormats/WebPWriter.cpp ImageFormats/WebPWriterLossless.cpp + ImageFormats/AVIFLoader.cpp ImmutableBitmap.cpp MedianCut.cpp Painter.cpp @@ -96,5 +97,6 @@ find_package(PkgConfig) pkg_check_modules(WOFF2 REQUIRED IMPORTED_TARGET libwoff2dec) find_package(JPEG REQUIRED) find_package(PNG REQUIRED) +find_package(LIBAVIF REQUIRED) -target_link_libraries(LibGfx PRIVATE PkgConfig::WOFF2 JPEG::JPEG PNG::PNG) +target_link_libraries(LibGfx PRIVATE PkgConfig::WOFF2 JPEG::JPEG PNG::PNG avif) diff --git a/Userland/Libraries/LibGfx/ImageFormats/AVIFLoader.cpp b/Userland/Libraries/LibGfx/ImageFormats/AVIFLoader.cpp new file mode 100644 index 00000000000..f10030bbccc --- /dev/null +++ b/Userland/Libraries/LibGfx/ImageFormats/AVIFLoader.cpp @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2023, Nico Weber + * Copyright (c) 2024, doctortheemh + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +#include + +namespace Gfx { + +class AVIFLoadingContext { + AK_MAKE_NONMOVABLE(AVIFLoadingContext); + AK_MAKE_NONCOPYABLE(AVIFLoadingContext); + +public: + enum State { + NotDecoded = 0, + Error, + HeaderDecoded, + BitmapDecoded, + }; + + State state { State::NotDecoded }; + ReadonlyBytes data; + + avifDecoder* decoder { nullptr }; + + // image properties + Optional size; + bool has_alpha { false }; + size_t image_count { 0 }; + size_t repetition_count { 0 }; + ByteBuffer icc_data; + + Vector frame_descriptors; + + AVIFLoadingContext() = default; + ~AVIFLoadingContext() + { + avifDecoderDestroy(decoder); + decoder = nullptr; + } +}; + +AVIFImageDecoderPlugin::AVIFImageDecoderPlugin(ReadonlyBytes data, OwnPtr context) + : m_context(move(context)) +{ + m_context->data = data; +} + +AVIFImageDecoderPlugin::~AVIFImageDecoderPlugin() +{ +} + +static ErrorOr decode_avif_header(AVIFLoadingContext& context) +{ + if (context.state >= AVIFLoadingContext::HeaderDecoded) + return {}; + + if (context.decoder == nullptr) { + context.decoder = avifDecoderCreate(); + + if (context.decoder == nullptr) { + return Error::from_string_literal("failed to allocate AVIF decoder"); + } + } + + avifResult result = avifDecoderSetIOMemory(context.decoder, context.data.data(), context.data.size()); + if (result != AVIF_RESULT_OK) + return Error::from_string_literal("Cannot set IO on avifDecoder"); + + result = avifDecoderParse(context.decoder); + if (result != AVIF_RESULT_OK) + return Error::from_string_literal("Failed to decode AVIF"); + + if (context.decoder->image->depth != 8) + return Error::from_string_literal("Unsupported bitdepth"); + + // Image header now decoded, save some results for fast access in other parts of the plugin. + context.size = IntSize { context.decoder->image->width, context.decoder->image->height }; + context.has_alpha = context.decoder->alphaPresent == 1; + context.image_count = context.decoder->imageCount; + context.repetition_count = context.decoder->repetitionCount <= 0 ? 0 : context.decoder->repetitionCount; + context.state = AVIFLoadingContext::State::HeaderDecoded; + + if (context.decoder->image->icc.size > 0) { + context.icc_data.resize(context.decoder->image->icc.size); + memcpy(context.icc_data.data(), context.decoder->image->icc.data, context.decoder->image->icc.size); + } + + return {}; +} + +static ErrorOr decode_avif_image(AVIFLoadingContext& context) +{ + VERIFY(context.state >= AVIFLoadingContext::State::HeaderDecoded); + + avifRGBImage rgb; + while (avifDecoderNextImage(context.decoder) == AVIF_RESULT_OK) { + auto bitmap_format = context.has_alpha ? BitmapFormat::BGRA8888 : BitmapFormat::BGRx8888; + auto bitmap = TRY(Bitmap::create(bitmap_format, context.size.value())); + + avifRGBImageSetDefaults(&rgb, context.decoder->image); + rgb.pixels = bitmap->scanline_u8(0); + rgb.rowBytes = bitmap->pitch(); + rgb.format = avifRGBFormat::AVIF_RGB_FORMAT_BGRA; + + avifResult result = avifImageYUVToRGB(context.decoder->image, &rgb); + if (result != AVIF_RESULT_OK) + return Error::from_string_literal("Conversion from YUV to RGB failed"); + + auto duration = context.decoder->imageCount == 1 ? 0 : static_cast(context.decoder->imageTiming.duration * 1000); + context.frame_descriptors.append(ImageFrameDescriptor { bitmap, duration }); + + context.state = AVIFLoadingContext::BitmapDecoded; + } + + return {}; +} + +IntSize AVIFImageDecoderPlugin::size() +{ + return m_context->size.value(); +} + +bool AVIFImageDecoderPlugin::sniff(ReadonlyBytes data) +{ + AVIFLoadingContext context; + context.data = data; + return !decode_avif_header(context).is_error(); +} + +ErrorOr> AVIFImageDecoderPlugin::create(ReadonlyBytes data) +{ + auto context = TRY(try_make()); + auto plugin = TRY(adopt_nonnull_own_or_enomem(new (nothrow) AVIFImageDecoderPlugin(data, move(context)))); + TRY(decode_avif_header(*plugin->m_context)); + return plugin; +} + +bool AVIFImageDecoderPlugin::is_animated() +{ + return m_context->image_count > 1; +} + +size_t AVIFImageDecoderPlugin::loop_count() +{ + return is_animated() ? m_context->repetition_count : 0; +} + +size_t AVIFImageDecoderPlugin::frame_count() +{ + if (!is_animated()) + return 1; + return m_context->image_count; +} + +size_t AVIFImageDecoderPlugin::first_animated_frame_index() +{ + return 0; +} + +ErrorOr AVIFImageDecoderPlugin::frame(size_t index, Optional) +{ + if (index >= frame_count()) + return Error::from_string_literal("AVIFImageDecoderPlugin: Invalid frame index"); + + if (m_context->state == AVIFLoadingContext::State::Error) + return Error::from_string_literal("AVIFImageDecoderPlugin: Decoding failed"); + + if (m_context->state < AVIFLoadingContext::State::BitmapDecoded) { + TRY(decode_avif_image(*m_context)); + m_context->state = AVIFLoadingContext::State::BitmapDecoded; + } + + if (index >= m_context->frame_descriptors.size()) + return Error::from_string_literal("AVIFImageDecoderPlugin: Invalid frame index"); + return m_context->frame_descriptors[index]; +} + +ErrorOr> AVIFImageDecoderPlugin::icc_data() +{ + if (m_context->state < AVIFLoadingContext::State::HeaderDecoded) + (void)frame(0); + + if (!m_context->icc_data.is_empty()) + return m_context->icc_data; + return OptionalNone {}; +} + +} diff --git a/Userland/Libraries/LibGfx/ImageFormats/AVIFLoader.h b/Userland/Libraries/LibGfx/ImageFormats/AVIFLoader.h new file mode 100644 index 00000000000..5b03f449abb --- /dev/null +++ b/Userland/Libraries/LibGfx/ImageFormats/AVIFLoader.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2023, Nico Weber + * Copyright (c) 2024, doctortheemh + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Gfx { + +class AVIFLoadingContext; + +class AVIFImageDecoderPlugin final : public ImageDecoderPlugin { +public: + static bool sniff(ReadonlyBytes); + static ErrorOr> create(ReadonlyBytes); + + virtual ~AVIFImageDecoderPlugin() override; + + virtual IntSize size() override; + + virtual bool is_animated() override; + virtual size_t loop_count() override; + virtual size_t frame_count() override; + virtual size_t first_animated_frame_index() override; + virtual ErrorOr frame(size_t index, Optional ideal_size = {}) override; + virtual ErrorOr> icc_data() override; + +private: + AVIFImageDecoderPlugin(ReadonlyBytes, OwnPtr); + + OwnPtr m_context; +}; + +} diff --git a/Userland/Libraries/LibGfx/ImageFormats/ImageDecoder.cpp b/Userland/Libraries/LibGfx/ImageFormats/ImageDecoder.cpp index d5656872926..7e62da9e1a6 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/ImageDecoder.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/ImageDecoder.cpp @@ -5,6 +5,7 @@ */ #include +#include #include #include #include @@ -35,6 +36,7 @@ static ErrorOr> probe_and_sniff_for_appropriate_plugi { TIFFImageDecoderPlugin::sniff, TIFFImageDecoderPlugin::create }, { TinyVGImageDecoderPlugin::sniff, TinyVGImageDecoderPlugin::create }, { WebPImageDecoderPlugin::sniff, WebPImageDecoderPlugin::create }, + { AVIFImageDecoderPlugin::sniff, AVIFImageDecoderPlugin::create } }; for (auto& plugin : s_initializers) { diff --git a/vcpkg.json b/vcpkg.json index b6b76ea3f38..853a93410fe 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -13,6 +13,12 @@ "apng" ] }, + { + "name": "libavif", + "features": [ + "dav1d" + ] + }, { "name": "skia", "platform": "osx", @@ -59,6 +65,10 @@ "name": "libpng", "version": "1.6.43#1" }, + { + "name": "libavif", + "version": "1.0.4#1" + }, { "name": "skia", "version": "124#0"