# Build

wgpupixel needs CMake 3.25+ and a C++23 compiler; native builds also need pkg-config and LittleCMS 2.16+. CMake downloads the pinned WebGPU backend (wgpu-native, built with Rust 1.93.0 through rustup, and patched with Git) and an image-only FFmpeg, whose build also needs a C compiler, Make, a POSIX shell, NASM on x86, and the zlib and liblzma development files.

# In your application

Add the library to your CMake project and link its target:

cmake_minimum_required(VERSION 3.25)
project(my_image_app LANGUAGES CXX)
add_subdirectory(wgpupixel)
add_executable(my_image_app main.cpp)
target_link_libraries(my_image_app PRIVATE wgpupixel::wgpupixel)

With an installed SDK, use find_package(wgpupixel CONFIG REQUIRED) instead of add_subdirectory, adding COMPONENTS text to link wgpupixel::text.

# With FetchContent

CMake can also download the library for you:

include(FetchContent)
FetchContent_Declare(wgpupixel GIT_REPOSITORY https://github.com/offerrall/wgpupixel GIT_TAG v1.0.2)
FetchContent_MakeAvailable(wgpupixel)
target_link_libraries(my_image_app PRIVATE wgpupixel::wgpupixel)

The first configure downloads and builds wgpu-native and FFmpeg, which needs the tools above; pass -DWGPUPIXEL_WGPU_ROOT=... and -DWGPUPIXEL_FFMPEG_ROOT=... to reuse SDKs you already built. On Linux and macOS your executable finds their shared libraries through its build RPATH. On Windows, copy them next to it:

add_custom_command(TARGET my_image_app POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy
    $<TARGET_RUNTIME_DLLS:my_image_app> $<TARGET_FILE_DIR:my_image_app> COMMAND_EXPAND_LISTS)

# Installing the SDK

To install an SDK for find_package:

cmake -S . -B build/native -DCMAKE_BUILD_TYPE=Release
cmake --build build/native --parallel 4
cmake --install build/native --prefix "$PWD/build/install"

The SDK includes the backend and FFmpeg runtimes with their notices; the system libraries above are still needed. To reuse SDKs you already built, point WGPUPIXEL_WGPU_ROOT and WGPUPIXEL_FFMPEG_ROOT at them.

# Prebuilt SDK

Every release carries a Linux x86_64 SDK, wgpupixel-X.Y.Z-linux-x86_64.tar.gz, so neither Rust nor an FFmpeg build is needed: the shared Release build with typography, its bundled runtimes, the CMake package and the licenses. Extract it anywhere and point CMake at it:

sha256sum -c wgpupixel-1.0.2-linux-x86_64.tar.gz.sha256
tar -xzf wgpupixel-1.0.2-linux-x86_64.tar.gz
cmake -S . -B build -DCMAKE_PREFIX_PATH="$PWD/wgpupixel-1.0.2-linux-x86_64"

Then find_package(wgpupixel CONFIG REQUIRED), adding COMPONENTS text for typography. Executables in your build tree find its libraries without environment variables; an installed application needs an RPATH to the SDK's lib/. It is built on Ubuntu 26.04, so it needs a distribution at least as new, and configuring against it needs pkg-config and the LittleCMS development files (and Pango's, for text).

# Options

Option Default What it does
WGPUPIXEL_BUILD_TEXT OFF Native typography, linked as wgpupixel::text. Needs Pango/PangoFT2 1.56+, Cairo 1.18.2+, Fontconfig 2.15+, FreeType and HarfBuzz 2.6+.
WGPUPIXEL_FETCH_DEPENDENCIES ON Download the pinned backend and FFmpeg sources.
WGPUPIXEL_RUST_TOOLCHAIN 1.93.0 The rustup toolchain that builds wgpu-native; empty uses the system Cargo.
BUILD_SHARED_LIBS OFF Build a shared library.
WGPUPIXEL_BUILD_TESTS OFF The GPU correctness and lifetime tests.
WGPUPIXEL_BUILD_BENCHMARKS OFF The native benchmark.
WGPUPIXEL_ENABLE_UBSAN OFF Undefined-behavior and float-to-integer checks, with GCC or Clang.

# In the browser

The core and GPU presentation compile with Emscripten; native file I/O and typography do not. Your application owns the canvas, the input and the image decoding. Include wgpupixel.h rather than wgpupixel_io.h, serialize Asyncify calls, and return to the browser event loop between frames.

emcmake cmake -S . -B build/browser -DCMAKE_BUILD_TYPE=Release
cmake --build build/browser --parallel 4
# Serve over HTTPS or localhost: WebGPU is required.

The browser build compiles but has not been run in a browser yet. Linux is validated at runtime; Windows and macOS build but are not yet validated.

# Compatibility

Code written for a 1.x release keeps compiling with every later 1.x release. Binary compatibility holds only between patch releases of one minor version (1.0.x) built with a compatible toolchain, which is why the shared library is named libwgpupixel.so.1.0: rebuild consumers when moving to a new minor version. find_package(wgpupixel 1.0) accepts any later 1.x.

How it works inside

Verifying a change. Before every commit:

cmake -S . -B build/dev -G Ninja -DCMAKE_BUILD_TYPE=Release -DWGPUPIXEL_BUILD_TESTS=ON
cmake --build build/dev --parallel 4 && (cd build/dev && ctest --output-on-failure -j2)
node tools/examples.mjs --check

For the CPU checks, configure a separate build with -DWGPUPIXEL_ENABLE_UBSAN=ON -DWGPUPIXEL_BUILD_TESTS=ON. tests/install/check.cmake builds static and shared, core-only and text consumers against an installed SDK, including relocated and absolute installation directories:

cmake -DSOURCE="$PWD" -DWORK="$PWD/build/install-check" \
  -DWGPU_SDK="$PWD/build/native/wgpu-sdk" \
  -DFFMPEG_SDK="$PWD/build/native/ffmpeg-sdk" -P tests/install/check.cmake

Its absolute-path case installs into a temporary directory outside the source tree; -DABSOLUTE_ROOT=/path chooses another.

Examples. examples/examples.js is the only source of examples: each entry has a title, a description, its code and the operations it covers. The Operations and Programs pages are generated from it, and every preview is a real GPU result. With an installed SDK (and typography, for the text examples):

node tools/examples.mjs --emit build/examples
cmake -S build/examples -B build/examples/compiled -DCMAKE_PREFIX_PATH="$PWD/build/install"
cmake --build build/examples/compiled --parallel 4
node tools/examples.mjs --render build/examples/compiled/bin
node tools/examples.mjs --docs

--check fails when a GPU operation has no example, when a preview is stale (any change to the headers, sources, shaders or build inputs makes all of them stale; rebuild and reinstall the SDK before rendering), or when the generated pages are out of date. Node is only a development tool.

Repository map.

Path What it holds
include/ The public API and its contracts: ranges, units and approximations are documented there and nowhere else
src/operations/ One file per operation or area: validation and record creation
src/shaders/ WGSL kernels and shared helpers, listed in src/kernel_list.inc
src/context.cpp Device, submission, encoding, batches and the single allocation point
tests/ Contract, lifetime and memory tests; tests/algorithms/ holds one CPU-referenced suite per area
examples/, tools/ The examples and the tool that checks, renders and documents them
benchmarks/native/ The optional native benchmark