From 6208711292926ef53632c3adefd03fe58c4f5e12 Mon Sep 17 00:00:00 2001 From: Alessandro Mauri Date: Mon, 9 Jun 2025 16:06:49 +0200 Subject: [PATCH] use the language's qoi decoder --- .gitmodules | 4 - lib/mini-qoi.c3l/Makefile | 7 -- lib/mini-qoi.c3l/libmqoi.c3i | 122 --------------------------- lib/mini-qoi.c3l/manifest.json | 9 -- lib/mini-qoi.c3l/project.json | 14 --- lib/mini-qoi.c3l/thirdparty/mini-qoi | 1 - lib/ugui.c3l/src/ugui_sprite.c3 | 33 +------- 7 files changed, 4 insertions(+), 186 deletions(-) delete mode 100644 lib/mini-qoi.c3l/Makefile delete mode 100644 lib/mini-qoi.c3l/libmqoi.c3i delete mode 100644 lib/mini-qoi.c3l/manifest.json delete mode 100644 lib/mini-qoi.c3l/project.json delete mode 160000 lib/mini-qoi.c3l/thirdparty/mini-qoi diff --git a/.gitmodules b/.gitmodules index 921026c..74cac9a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -2,10 +2,6 @@ path = lib/grapheme.c3l/thirdparty/libgrapheme url = git://git.suckless.org/libgrapheme ignore = dirty -[submodule "lib/mini-qoi.c3l/thirdparty/mini-qoi"] - path = lib/mini-qoi.c3l/thirdparty/mini-qoi - url = https://github.com/shraiwi/mini-qoi - ignore = dirty [submodule "lib/schrift.c3l/thirdparty/libschrift"] path = lib/schrift.c3l/thirdparty/libschrift url = https://github.com/tomolt/libschrift diff --git a/lib/mini-qoi.c3l/Makefile b/lib/mini-qoi.c3l/Makefile deleted file mode 100644 index 323ee89..0000000 --- a/lib/mini-qoi.c3l/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -all: thirdparty/mini-qoi/mqoi.a - mkdir -p linux-x64 - cp thirdparty/mini-qoi/mqoi.a linux-x64/libmqoi.a - -thirdparty/mini-qoi/mqoi.a: - gcc -O2 -c -o thirdparty/mini-qoi/mqoi.o thirdparty/mini-qoi/src/mini_qoi.c - ar -rc thirdparty/mini-qoi/mqoi.a thirdparty/mini-qoi/mqoi.o diff --git a/lib/mini-qoi.c3l/libmqoi.c3i b/lib/mini-qoi.c3l/libmqoi.c3i deleted file mode 100644 index 330145d..0000000 --- a/lib/mini-qoi.c3l/libmqoi.c3i +++ /dev/null @@ -1,122 +0,0 @@ -module mqoi; - -macro rgb_hash(Rgb px) => ((px.r * 3 + px.g * 5 + px.b * 7) & 0b00111111); -macro mqoi_rgba_hash(Rgba px) => ((px.r * 3 + px.g * 5 + px.b * 7 + px.a * 11) & 0b00111111); - -const uint MQOI_HEADER_SIZE = 14; - -const char MQOI_MASK_OP_2B = 0b11000000; -const char MQOI_MASK_OP_8B = 0b11111111; - -const char MQOI_MASK_OP_LUMA_DG = 0b00111111; -const char MQOI_MASK_OP_RUN = 0b00111111; - -// basic types - -enum DescErr : uint (uint value) { - MQOI_DESC_OK = 0, // The descriptor is valid - MQOI_DESC_INVALID_MAGIC = 1, // The magic value isn't correct - MQOI_DESC_INVALID_CHANNELS = 2, // The channel number isn't valid - MQOI_DESC_INVALID_COLORSPACE = 3, // The colorspace isn't valid -} - -enum Op : char (char value) { - MQOI_OP2_INDEX = (0b00 << 6), - MQOI_OP2_DIFF = (0b01 << 6), - MQOI_OP2_LUMA = (0b10 << 6), - MQOI_OP2_RUN = (0b11 << 6), - MQOI_OP8_RUN_RGB = (0b11111110), - MQOI_OP8_RUN_RGBA = (0b11111111), -} - -enum Channels : char (char value) { - MQOI_CHANNELS_RGB = 3, - MQOI_CHANNELS_RGBA = 4, -} - -enum Colorspace : char (char value) { - MQOI_COLORSPACE_SRGB = 0, - MQOI_COLORSPACE_LINEAR = 1, -} - -union Rgb { - struct { char r, g, b; } - char[3] value; -} - -union Rgba{ - struct { char r, g, b, a; } - char[4] value; -} - -struct Desc { - char head; - - char[4] magic; - char[4] width; // big-endian width - char[4] height; // big-endian height - char channels; - char colorspace; -} - -// ==== chunks ==== - -union Chunk { - struct { - char head; - union { - Rgb rgb; - Rgba rgba; - char drdb; - } - } - char[5] value; -} - -// ==== codecs ==== - -struct Encoding { - Rgba[64] hashtable; - Rgba prev_px; - Chunk working_chunk; - char working_chunk_size; -} - -struct Dec { - Rgba[64] hashtable; - Rgba prev_px; - Chunk curr_chunk; - bitstruct : char { - char curr_chunk_head : 0..3; - char curr_chunk_size : 4..7; - } - uint pix_left; -} - -// ==== utilities ==== - -fn void u32_write(uint * n, char * dest) @extern("mqoi_u32_write"); -fn void u32_read(char * src, uint * n) @extern("mqoi_u32_read"); - -// ==== Desc ==== - -fn void desc_init(Desc* desc) @extern("mqoi_desc_init"); -fn void desc_push(Desc* desc, char byte) @extern("mqoi_desc_push"); -fn char* desc_pop(Desc* desc) @extern("mqoi_desc_pop"); -fn char desc_verify(Desc* desc, uint* w, uint* h) @extern("mqoi_desc_verify"); -fn bool desc_done(Desc* desc) @extern("mqoi_desc_done"); - -/* the encoder is still WIP -void mqoi_enc_init(mqoi_enc_t * enc); -void mqoi_enc_push(mqoi_enc_t * enc, Rgba * pix) -Chunk * mqoi_enc_pop(mqoi_enc_t * enc, char * size); -*/ - -// ==== Dec ==== - -fn void dec_init(Dec* dec, uint n_pix) @extern("mqoi_dec_init"); -fn void dec_push(Dec* dec, char byte) @extern("mqoi_dec_push"); -fn char dec_take(Dec* dec, char* bytes) @extern("mqoi_dec_take"); -fn Rgba* dec_pop(Dec* dec) @extern("mqoi_dec_pop"); -fn bool dec_done(Dec* dec) @extern("mqoi_dec_done"); - diff --git a/lib/mini-qoi.c3l/manifest.json b/lib/mini-qoi.c3l/manifest.json deleted file mode 100644 index 4043957..0000000 --- a/lib/mini-qoi.c3l/manifest.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "provides" : "mqoi", - "targets" : { - "linux-x64" : { - "dependencies" : [], - "linked-libraries" : ["mqoi", "c"] - } - } -} diff --git a/lib/mini-qoi.c3l/project.json b/lib/mini-qoi.c3l/project.json deleted file mode 100644 index cda4a4d..0000000 --- a/lib/mini-qoi.c3l/project.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "langrev": "1", - "warnings": [ "no-unused" ], - "dependency-search-paths": [ ".." ], - "dependencies": [ "mqoi" ], - "authors": [ "Alessandro Mauri ", "Shranav Palakurthi"], - "version": "0.1.0", - "sources": [ ], - "output": "build", - "target": "linux-x64", - "features": [], - "cpu": "generic", - "opt": "O0", -} diff --git a/lib/mini-qoi.c3l/thirdparty/mini-qoi b/lib/mini-qoi.c3l/thirdparty/mini-qoi deleted file mode 160000 index f8b5a8a..0000000 --- a/lib/mini-qoi.c3l/thirdparty/mini-qoi +++ /dev/null @@ -1 +0,0 @@ -Subproject commit f8b5a8a4d2eeee68b52e143060b7412ba78b5077 diff --git a/lib/ugui.c3l/src/ugui_sprite.c3 b/lib/ugui.c3l/src/ugui_sprite.c3 index 0aa913f..7dca870 100644 --- a/lib/ugui.c3l/src/ugui_sprite.c3 +++ b/lib/ugui.c3l/src/ugui_sprite.c3 @@ -3,7 +3,7 @@ module ugui; import std::core::mem::allocator; import std::collections::map; import std::io; -import mqoi; +import std::compression::qoi; const usz SRITES_PER_ATLAS = 64; @@ -102,37 +102,12 @@ fn void? Ctx.import_sprite_memory(&ctx, String name, char[] pixels, ushort w, us fn void? Ctx.import_sprite_file_qoi(&ctx, String name, String path, SpriteType type = SPRITE_NORMAL) { - mqoi::Desc image_desc; - uint w, h; + QOIDesc desc; - File file = file::open(path, "rb")!; - defer (void) file.close(); - - while (!mqoi::desc_done(&image_desc)) { - mqoi::desc_push(&image_desc, file.read_byte()!); - } - if (mqoi::desc_verify(&image_desc, &w, &h) != 0) { - return io::FILE_NOT_VALID?; - } - - mqoi::Dec dec; - mqoi::Rgba* px; - - usz idx; - char[] pixels = mem::new_array(char, (usz)w*h*4); + char[] pixels = qoi::read(allocator::heap(), path, &desc, QOIChannels.RGBA)!; defer mem::free(pixels); - mqoi::dec_init(&dec, w*h); - while (!mqoi::dec_done(&dec)) { - mqoi::dec_push(&dec, file.read_byte()!); - - while ((px = mqoi::dec_pop(&dec)) != null) { - pixels[idx..idx+3] = px.value[..]; - idx += 4; - } - } - - ctx.sprite_atlas.insert(name, type, pixels, (ushort)w, (ushort)h, (ushort)w)!; + ctx.sprite_atlas.insert(name, type, pixels, (ushort)desc.width, (ushort)desc.height, (ushort)desc.width)!; } fn void? Ctx.draw_sprite(&ctx, String label, String name, Point off = {0,0})