• Stars
    star
    109
  • Rank 319,077 (Top 7 %)
  • Language
    Zig
  • License
    MIT License
  • Created almost 3 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Quite OK Image format encoder/decoder written in Zig

zig-qoi

A implementation of the Quite OK Image Format for Zig. This implementation conforms to the Qoi specification.

API

Add src/qoi.zig to your Zig project as a package.

pub const DecodeError = error{ OutOfMemory, InvalidData, EndOfStream };
pub const EncodeError = error{ OutOfMemory };

// Simple API:

pub fn isQOI(bytes: []const u8) bool;
pub fn decodeBuffer(allocator: std.mem.Allocator, buffer: []const u8) DecodeError!Image;
pub fn decodeStream(allocator: std.mem.Allocator, reader: anytype) !Image;

pub fn encodeBuffer(allocator: std.mem.Allocator, image: ConstImage) EncodeError![]u8;
pub fn encodeStream(image: ConstImage, writer: anytype) !void;

// Streaming API:
pub fn encoder(writer: anytype) Encoder(@TypeOf(writer));
pub fn Encoder(comptime Writer: type) type {
   return struct {
      writer: Writer,
      pub fn reset(self: *Self) void;
      pub fn flush(self: *Self) (EncodeError || Writer.Error)!void;
      pub fn push(self: *Self, pixel: Color) (EncodeError || Writer.Error)!void;
   };
}

pub const ColorRun = struct {
   color: Color,
   length: usize,
};

pub fn decoder(reader: anytype) Decoder(@TypeOf(reader));
pub fn Decoder(comptime Reader: type) type {
   return struct {
      reader: Reader,
      pub fn fetch(self: *Self) Reader.Error!ColorRun;
   };
}

Implementation Status

Everything specified in phoboslab/qoi#37 is implemented and accessible via the API.

Performance

On my machine (AMD Ryzen 7 3700U), i did a small benchmark with decoding bench.zig, which will decode zero.qoi:

Build Mode QOI Bytes Raw Bytes Encoding Time Decoding Time
Debug 75.024 byte 1.048.576 byte 14.439ms 7.061ms
ReleaseSmall 75.024 byte 1.048.576 byte 1.888ms 1.499ms
ReleaseSafe 75.024 byte 1.048.576 byte 1.392ms 512.706us
ReleaseFast 75.024 byte 1.048.576 byte 1.186ms 456.762us

This means that this implementation is roughly able to decode ~2.1 GB/s raw texture data and is considered "fast enough" for now. If you find some performance improvements, feel free to PR it!

Running perf on the benchmark compiled with ReleaseFast showed that the implementation is quite optimal for the CPU, utilizing it to 100% and executing up to 3 instructions per cycle on my machine.

[felix@denkplatte-v2 zig-qoi]$ perf stat ./zig-out/bin/qoi-bench
Benchmark [4067/4096] Encoding time for 1048576 => 75024 bytes: 1.019ms
Benchmark [4067/4096] Decoding time for 75024 => 1048576 bytes: 419.223us

 Performance counter stats for './zig-out/bin/qoi-bench':

          9.665,11 msec task-clock:u              #    0,997 CPUs utilized
                 0      context-switches:u        #    0,000 K/sec
                 0      cpu-migrations:u          #    0,000 K/sec
            21.066      page-faults:u             #    0,002 M/sec
    29.757.225.002      cycles:u                  #    3,079 GHz                      (83,33%)
       317.453.390      stalled-cycles-frontend:u #    1,07% frontend cycles idle     (83,33%)
       515.819.113      stalled-cycles-backend:u  #    1,73% backend cycles idle      (83,32%)
    83.377.885.642      instructions:u            #    2,80  insn per cycle
                                                  #    0,01  stalled cycles per insn  (83,36%)
    18.947.655.057      branches:u                # 1960,417 M/sec                    (83,31%)
       193.594.708      branch-misses:u           #    1,02% of all branches          (83,35%)

       9,693303129 seconds time elapsed

       9,553127000 seconds user
       0,112001000 seconds sys

Also, running the benchmark dataset of the original author, it yielded the following data:

Number of total images:             1351
Average PNG Compression:              18.57%
Average QOI Compression:              22.70%
Average Compression Rate (MB/s):     438.31 MB/s
Minimal Compression Rate (MB/s):      27.06 MB/s
Maximum Compression Rate (MB/s):    1390.15 MB/s
Average Decompression Rate (MB/s):  1128.46 MB/s
Maximum Decompression Rate (MB/s):    39.77 MB/s
Maximum Deompression Rate (MB/s):  13307.20 MB/s

See also the original analysis on Google Docs

Contribution

Run the test suite like this:

[user@host zig-qoi]$ zig build test
All 5 tests passed.

Run the benchmark like this:

[user@host zig-qoi]$ zig build benchmark
Benchmark [4096/4096] Encoding time for 1048576 => 67076 bytes: 16.649ms
Benchmark [4095/4096] Decoding time for 67076 => 1048576 bytes: 5.681ms

To run the benchmark for batch files, run this:

[user@host zig-qoi]$ zig build install && ./zig-out/bin/qoi-bench-files $(folder_a) $(folder_b) ...
File Name       Width   Height  Total Raw Bytes  Total PNG Bytes PNG Compression  Total QOI Bytes  QOI Compression  QOI to PNG          Decode Time (ns)  Encode Time (ns)
data/zero.png   512     512     1048576          80591           0.08             67076            0.06             0.8323013782501221  5628360           14499346
total sum       0       0       1048576          80591           0.08             67076            0.06             0.8323013782501221  5628360           14499346

Pass as many folders you like to the benchmarking tool. It will render a CSV file on the stderr.

More Repositories

1

kristall

Graphical small-internet client for windows, linux, MacOS X and BSDs. Supports gemini, http, https, gopher, finger.
C++
653
star
2

zig-network

A smallest-common-subset of socket functions for crossplatform networking, TCP & UDP
Zig
271
star
3

ZigAndroidTemplate

This repository contains a example on how to create a minimal Android app in Zig.
Zig
202
star
4

SDL.zig

A shallow wrapper around SDL that provides object API and error handling
C
188
star
5

VersaTile

A simple 3D model editor based on simple quads and a sprite set.
C
160
star
6

LoLa

LoLa is a small programming language meant to be embedded into games.
Zig
150
star
7

zero-graphics

Application framework based on OpenGL ES 2.0. Runs on desktop machines, Android phones and the web
Zig
124
star
8

zig-args

Simple-to-use argument parser with struct-based config
Zig
119
star
9

zig-opengl

OpenGL binding generator based on the opengl registry
C#
62
star
10

Ziguana-Game-System

A retro-style gaming console running on bare x86 metal written in Zig
Zig
47
star
11

parser-toolkit

A toolkit that makes it easier to write recursive-descent parsers in Zig.
Zig
45
star
12

TinyVG

A new format for vector graphics: Tiny vector graphics
Zig
36
star
13

TextEditor

A backbone for text editors. No rendering, no input, but everything else.
Zig
32
star
14

zig-serve

Server implementations for several protocols in Zig. Includes http(s), gemini and gopher
Zig
30
star
15

zig-bearssl

A BearSSL binding for Zig
Zig
27
star
16

livedecode

A super hacky tool to decode unknown binary formats
Zig
26
star
17

any-pointer

A type erasure library for Zig that is meant to be eventually upstreamed to std
Zig
25
star
18

ZTT

Precompiled Zig text template engine
Zig
20
star
19

spu-mark-ii

CPU and home computer project
VHDL
17
star
20

zig-gamedev-lib

xq's Zig Game Development Library
Zig
16
star
21

SoftRenderLib

A collection of software rendering routines
Zig
16
star
22

BrokenRemote

A remote debugging tool for The Binding of Isaac: Afterbirth+
C++
14
star
23

zig-mqtt

A build package for mqtt-c.
Zig
14
star
24

gurl

A curl-like cli application to interact with Gemini sites.
Zig
14
star
25

ftz

A simple cross-platform file transfer utility
Zig
14
star
26

zig-uri

A small URI parser that parses URIs after RFC3986
Zig
12
star
27

makeshift

A dead-simple programming language
Zig
11
star
28

zig-gemtext

A zig library to manipulate gemini text files
Zig
10
star
29

SDL.zig-Example

A small usage example on how to build and use SDL.zig
Zig
10
star
30

waveform

Generates nice Unicode rendered waveforms.
Zig
9
star
31

OpenWorld.Engine

A C# game engine based on OpenGL and OpenTK.
C#
9
star
32

zig-tracer

A small raytracer written in zig.
Zig
9
star
33

WaveFunctionCollapse

A just-for-fun implementation of 2D wave function collapse
Zig
9
star
34

SLF

The Simple Linking Format
Zig
8
star
35

zig-assimp

Open Asset Importer Library built with Zig
C
8
star
36

OpenCL

An open source OpenCL wrapper written in C#. Usable with all .NET versions since 2.0.
C#
7
star
37

ZigPaint

A simple paint application written in Zig. Used to create an OpenGL loader/wrapper and a minimal UI system.
Zig
7
star
38

zyclone

A game engine modelled after the Acknex A8 engine which is used for Gamestudio A8.
Zig
7
star
39

lua

Fork of Lua with support for build.zig
C
6
star
40

zig-build-chapter-2

Files for the zig build explained series
C
6
star
41

TIS-100

A real word implementation of the fantastic TIS-100 CPU by Zachtronics.
VHDL
5
star
42

Crayos

Global Game Jam 2024 Game
Go
5
star
43

acknext

A game engine prototype loosely inspired on the Acknex A8 engine.
Logos
4
star
44

SQEditor

ShadeQ Level Editor for Lite-C
C
4
star
45

turtlefont

A small vector graphics font file format with an example font.
Zig
4
star
46

cg-workbench

Live shader and graphics coding tool
C
4
star
47

zig-sg4f-playground

A playground to try out different stuff with a propietary LPC1786 hardware
Zig
4
star
48

zig-ihex

An intel hex loader written in Zig
Zig
3
star
49

ESOPUNKS

Implementation of the EXA programming language by Zachtronics
Zig
3
star
50

SmallscaleCI

A very tiny CI implementation for self-hosted runners
Shell
3
star
51

TUST

Scripting Library and Game Templates for Gamestudio A8
C
3
star
52

PandorOS

Another attempt to create a small operating system. This time, more features, less fancy code.
C
3
star
53

asciitable

A very basic tool that just prints the ascii table
Zig
3
star
54

AckNET

A .NET wrapper for the Acknex Engine.
C#
3
star
55

LoLa-csharp

Logic Language, a small embeddable scripting language meant for user-based script input in games
C#
3
star
56

ashet.computer

A self-made computer platform
Lua
2
star
57

zig-kms-dri

Experiments with KMS and DRI. Who needs X11/Wayland anyways?!
Zig
2
star
58

Retro-FPS

Oldschoolish first person shooter.
C
2
star
59

zig-ode

Zig ODE sdk
Zig
2
star
60

cbm-tools

A small collection of CBM computer related tools
Zig
2
star
61

pkg

Project and library package manager. Similar to linux package managers but for libraries and project templates.
C#
2
star
62

maps

Multiple Audio Playback Streams - A basic audio mixing library
Zig
2
star
63

psi

A work-in-progress programming language, focused on a kind of crazy, but "well" considered concept...
C#
2
star
64

trainOS

An operating system with everything built custom.
Makefile
2
star
65

WMB

Gamestudio WMB level loader in C++17
C++
2
star
66

zig-mbedtls

A mbedtls build wrapper for Zig build
C
2
star
67

I2P.Sam

C# Interface to the I2P SAM protocol.
C#
2
star
68

Uml2Cpp

Write your own classes with an easy to use modeling language and convert your code to C++. The generated source is prepared for the use with Qt and an example file explains how to use the script.
Lua
2
star
69

ShaderCore

ShaderCore is a shader library for OpenTK and OpenGL 4.0 or larger. It provides single shader files that have conditional compilation, include files, default shader and a shader class system. This provides flexible shader code with much lesser redundtant code to be written.
C#
2
star
70

weekend-raytracer

Just a tiny raytracer in several languages
C++
1
star
71

hyperdoc

A hyperlinked rich text format
Zig
1
star
72

depmake

Simple build system made for trainOS
C#
1
star
73

lola-vscode

LoLa extension for VSCode
1
star
74

SDL3-Api-Generator-Example

C
1
star
75

PeopleDoOpenGL

Made at Nordlicht 2018, teaching people OpenGL
C
1
star
76

ker

A really small C++ library that provides some basic collections and value types.
C++
1
star
77

ecp5-quickstart

A blinky template for a full ECP5 verilog workflow including simulation, synthesis and programming
Verilog
1
star
78

MidiV

A midi visualization tool
C++
1
star
79

fraxinus

Small simple terminal emulation library
Zig
1
star
80

TerraForm

A feature based terrain editor
C++
1
star
81

VoxelizedRenderer

Simple uniform grid voxel renderer with OpenCL, written in C#.
C#
1
star
82

minitest

A minimal C++ testing framework in 101 LOC
C++
1
star
83

ggj-2021

Untitled Game for Global Game Jam
Lua
1
star
84

gemini-web-bridge

Serving simple web files with support for gemini translation
Lua
1
star
85

zfx-logbot

IRC LogBot made for #zfx, #lost on irc.euirc.net
Lua
1
star
86

DasOS

DasOS is a research project which contains prototypes for different parts regarding OS development like kernels, virtual machines, file formats and systems.
C
1
star
87

bullshit-bingo

BULLSHIT!
Lua
1
star
88

avr-tutorial

Contains some basic examples on how to set up an AVR project
TeX
1
star
89

navmesh

A navmesh implementation in zig
Zig
1
star
90

CodersNotepad

Spiritual clone of ProgrammersNotepad 2 made with Qt.
C++
1
star
91

KernelTemplate

A pretty primitive kernel base with physical and virtual memory management and a console.
C
1
star
92

NextMMO

An RPGMaker styled multiplayer game focused on, well, nothing special.
JavaScript
1
star
93

BlocksWorld

BlocksWorld is an attempt to create a small game that provides a creativity environment where players can build their own (small) worlds.
C#
1
star
94

DbusAvrLink

A dbus (TI calculator protocol) implementiation for AVRs.
Assembly
1
star
95

Sharpsole

C# goes scripting! A C# console compile-and-execute tool. Compiles one or more files into a in-memory assembly and runs it immediately.
C#
1
star
96

libgamestudio

A library that decodes file formats used by the Gamestudio/Acknex engine
Zig
1
star
97

tools.mq32.de

A collection of small, web-based tools
HTML
1
star
98

Lylios

A small pathtracer, nothing special really
C++
1
star
99

link.zig-concept-art

A concept for a replacement for linker scripts
Zig
1
star
100

LOST

LOST Programming Language
1
star