add a readme

This commit is contained in:
2025-09-07 22:40:06 -05:00
parent ba8acc79f3
commit 32179abb48
8 changed files with 27 additions and 6 deletions

9
README.md Normal file
View File

@@ -0,0 +1,9 @@
# QOI for Allegro
This is a simple liballeg plugin that gives Allegro the ability to decode QOI images, in both 24-bit and 32-bit formats.
Some example images and a test program are provided. All of the code is in allegro_qoi.c. The header file declares only a single function `al_init_qoi()` which takes no parameters (same thing as `al_init_image_addon()`). Call it once when your program starts.
If you want you can also just drop the `allegro_qoi.c` into your project and forward-declare it's init function once where it's used.
This plugin does not handle saving QOI images yet.

View File

@@ -14,6 +14,7 @@ extern "C" {
ALLEGRO_BITMAP* _al_load_qoi_f(ALLEGRO_FILE* file, int flags) { ALLEGRO_BITMAP* _al_load_qoi_f(ALLEGRO_FILE* file, int flags) {
qoi_desc meta; qoi_desc meta;
ALLEGRO_PIXEL_FORMAT fmt;
uint8_t* file_bytes = malloc(al_fsize(file)); uint8_t* file_bytes = malloc(al_fsize(file));
memset(file_bytes, 0, al_fsize(file)); memset(file_bytes, 0, al_fsize(file));
void* file_pos = file_bytes; void* file_pos = file_bytes;
@@ -27,10 +28,15 @@ ALLEGRO_BITMAP* _al_load_qoi_f(ALLEGRO_FILE* file, int flags) {
int oldflags = al_get_new_bitmap_flags(); int oldflags = al_get_new_bitmap_flags();
al_set_new_bitmap_flags(flags); al_set_new_bitmap_flags(flags);
switch (meta.channels) {
case 3: fmt = ALLEGRO_PIXEL_FORMAT_BGR_888; break;
case 4: fmt = ALLEGRO_PIXEL_FORMAT_ABGR_8888; break;
default: free(data); return NULL; break;
}
ALLEGRO_BITMAP* bmp = al_create_bitmap(meta.width, meta.height); ALLEGRO_BITMAP* bmp = al_create_bitmap(meta.width, meta.height);
ALLEGRO_LOCKED_REGION* lock = al_lock_bitmap( ALLEGRO_LOCKED_REGION* lock = al_lock_bitmap(
bmp, bmp,
ALLEGRO_PIXEL_FORMAT_ABGR_8888, fmt,
ALLEGRO_LOCK_WRITEONLY ALLEGRO_LOCK_WRITEONLY
); );
al_set_new_bitmap_flags(oldflags); al_set_new_bitmap_flags(oldflags);

View File

@@ -1,24 +1,30 @@
// This program simply loads a QOI file into Allegro // This program simply loads a QOI file into Allegro
// as a texture and then dumps the texture data as a PNG. // as a texture and then dumps the texture data as a PNG.
// Take notice of lines 20 and 21. You only need to initialize // Take notice of lines 26 and 27. You only need to initialize
// the QOI plugin (this registers the function hooks that Allegro // the QOI plugin (this registers the function hooks that Allegro
// will use whenever you want to I/O on a filename ending in .qoi) // will use whenever you want to I/O on a filename ending in .qoi)
// //
// Compile the test program with: // Compile the sample program with:
// gcc -o test allegro_qoi.c test.c -lallegro -lallegro_image -I./ // gcc -o sample allegro_qoi.c sample.c -lallegro -lallegro_image -I./
// Then run it with a QOI image as the first argument.
// //
// qoi.h should be inside of your include path. // qoi.h should be inside of your include path.
// Either place it here, or in your system's global includes. // Either place it here, or in your system's global includes.
#include <stdio.h>
#include <allegro5/allegro.h> #include <allegro5/allegro.h>
#include <allegro5/allegro_image.h> #include <allegro5/allegro_image.h>
#include "allegro_qoi.h" #include "allegro_qoi.h"
int main() { int main(int argc, char **argv) {
if (argc < 2) {
printf("Usage: sample <filename>\n");
return 0;
}
al_init(); al_init();
al_init_image_addon(); al_init_image_addon();
al_init_qoi(); al_init_qoi();
ALLEGRO_BITMAP* bmp = al_load_bitmap("sample.qoi"); ALLEGRO_BITMAP* bmp = al_load_bitmap(argv[1]);
al_save_bitmap("out.png", bmp); al_save_bitmap("out.png", bmp);
return 0; return 0;
} }

BIN
sample_KDE.qoi Normal file

Binary file not shown.

BIN
sample_VanGoghAlive.qoi Normal file

Binary file not shown.

BIN
sample_WipeoutPepsi.qoi Normal file

Binary file not shown.

BIN
sample_caniwall.qoi Normal file

Binary file not shown.