Skip to content

Commit fc56e08

Browse files
RyeMuttclaude
andcommitted
Add AVIF image support via libavif
Add an AVIF codec (LLImageAVIF) to llimage backed by libavif with dav1d (decode) and aom (encode), and wire it into the image upload and save/snapshot paths, mirroring the existing WebP integration. - llimage: IMG_CODEC_AVIF and LLImageAVIF (lossy quality-based encode, 8-bit RGB/RGBA decode with vertical flip); extension, MIME, and dimensions-info registration - build: libavif[aom,dav1d] vcpkg dependency and AVIF.cmake module - upload: file picker load filters, IMAGE_EXTENSIONS, local bitmaps - save: FFSAVE_AVIF, snapshot format (combo box, encode switches, quality slider) and texture save-as Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 477fb7a commit fc56e08

24 files changed

Lines changed: 519 additions & 14 deletions

‎.github/workflows/build.yaml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ jobs:
215215
libthai-dev libtool libudev-dev libunwind-dev liburing-dev libvlc-dev libwayland-dev \
216216
libx11-dev libxcursor-dev libxext-dev libxfixes-dev libxft-dev libxi-dev libxinerama-dev \
217217
libxkbcommon-dev libxrandr-dev libxss-dev libxtst-dev linux-libc-dev mono-complete \
218-
ninja-build pkgconf tar tex-common texinfo unzip zip
218+
nasm ninja-build pkgconf tar tex-common texinfo unzip zip
219219
220220
sudo locale-gen en_US.UTF-8
221221
sudo locale-gen en_GB.UTF-8
@@ -232,7 +232,7 @@ jobs:
232232
- name: macOS Homebrew Dependency Install
233233
if: runner.os == 'macOS'
234234
run: |
235-
brew install autoconf autoconf-archive automake libtool mono unzip zip
235+
brew install autoconf autoconf-archive automake libtool mono nasm unzip zip
236236
237237
- name: Checkout code
238238
uses: actions/checkout@v6

‎indra/CMakeLists.txt‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ endif ()
243243

244244
# Declare All Dependency Includes
245245
include(APR)
246+
include(AVIF)
246247
include(Boost)
247248
include(bugsplat)
248249
include(CEFPlugin)

‎indra/cmake/AVIF.cmake‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# -*- cmake -*-
2+
include_guard()
3+
add_library(ll::libavif INTERFACE IMPORTED)
4+
5+
find_package(libavif CONFIG REQUIRED)
6+
target_link_libraries(ll::libavif INTERFACE avif)

‎indra/cmake/CMakeLists.txt‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
set(cmake_SOURCE_FILES
44
00-Common.cmake
55
APR.cmake
6+
AVIF.cmake
67
Boost.cmake
78
BootstrapVcpkg.cmake
89
bugsplat.cmake

‎indra/llimage/CMakeLists.txt‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ target_sources(llimage
1414
llimagepng.cpp
1515
llimagetga.cpp
1616
llimagewebp.cpp
17+
llimageavif.cpp
1718
llimageworker.cpp
1819
llpngwrapper.cpp
1920
)
@@ -32,6 +33,7 @@ target_sources(llimage
3233
llimagepng.h
3334
llimagetga.h
3435
llimagewebp.h
36+
llimageavif.h
3537
llimageworker.h
3638
llmapimagetype.h
3739
llpngwrapper.h
@@ -52,6 +54,7 @@ target_link_libraries(llimage
5254
llmath
5355
llcommon
5456
ll::libwebp
57+
ll::libavif
5558
ll::libpng
5659
ll::libjpeg
5760
)

‎indra/llimage/llimage.cpp‎

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#include "llimagejpeg.h"
4040
#include "llimagepng.h"
4141
#include "llimagewebp.h"
42+
#include "llimageavif.h"
4243
#include "llimagedxt.h"
4344
#include "llmemory.h"
4445

@@ -2049,7 +2050,8 @@ file_extensions[] =
20492050
{ "mip", IMG_CODEC_DXT },
20502051
{ "dxt", IMG_CODEC_DXT },
20512052
{ "png", IMG_CODEC_PNG },
2052-
{ "webp", IMG_CODEC_WEBP }
2053+
{ "webp", IMG_CODEC_WEBP },
2054+
{ "avif", IMG_CODEC_AVIF }
20532055
};
20542056

20552057
static struct
@@ -2069,7 +2071,8 @@ wide_file_extensions[] =
20692071
{ L"mip", IMG_CODEC_DXT },
20702072
{ L"dxt", IMG_CODEC_DXT },
20712073
{ L"png", IMG_CODEC_PNG },
2072-
{ L"webp", IMG_CODEC_WEBP }
2074+
{ L"webp", IMG_CODEC_WEBP },
2075+
{ L"avif", IMG_CODEC_AVIF }
20732076
};
20742077
#define NUM_FILE_EXTENSIONS LL_ARRAY_SIZE(file_extensions)
20752078
#if 0
@@ -2270,6 +2273,9 @@ LLImageFormatted* LLImageFormatted::createFromType(S8 codec)
22702273
case IMG_CODEC_WEBP:
22712274
image = new LLImageWebP();
22722275
break;
2276+
case IMG_CODEC_AVIF:
2277+
image = new LLImageAVIF();
2278+
break;
22732279
case IMG_CODEC_J2C:
22742280
image = new LLImageJ2C();
22752281
break;
@@ -2314,6 +2320,10 @@ S8 LLImageFormatted::getCodecFromMimeType(std::string_view mimetype)
23142320
{
23152321
return IMG_CODEC_WEBP;
23162322
}
2323+
else if (mimetype == "image/avif")
2324+
{
2325+
return IMG_CODEC_AVIF;
2326+
}
23172327
return IMG_CODEC_INVALID;
23182328
}
23192329

‎indra/llimage/llimage.h‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,8 @@ typedef enum e_image_codec
8585
IMG_CODEC_DXT = 6,
8686
IMG_CODEC_PNG = 7,
8787
IMG_CODEC_WEBP = 8,
88-
IMG_CODEC_EOF = 9
88+
IMG_CODEC_AVIF = 9,
89+
IMG_CODEC_EOF = 10
8990
} EImageCodec;
9091

9192
//============================================================================

0 commit comments

Comments
 (0)