c++ fixes, load from alleg i/o interfaces

This commit is contained in:
2025-09-05 23:20:05 -05:00
parent 434c16bf1b
commit 28e639c87d
2 changed files with 38 additions and 8 deletions

View File

@@ -7,13 +7,31 @@
#include <allegro5/bitmap_lock.h> #include <allegro5/bitmap_lock.h>
#include <allegro5/color.h> #include <allegro5/color.h>
#include <allegro5/file.h> #include <allegro5/file.h>
#include <allegro5/bitmap_lock.h>
ALLEGRO_BITMAP* _al_load_qoi_f(ALLEGRO_FILE* filename, int flags) { #ifdef __cplusplus
extern "C" {
#endif
ALLEGRO_BITMAP* _al_load_qoi_f(ALLEGRO_FILE* file, int flags) {
qoi_desc meta; qoi_desc meta;
void* data = qoi_read("sample.qoi", &meta, 4); uint8_t* file_bytes = malloc(al_fsize(file));
if (!data) return NULL; memset(file_bytes, 0, al_fsize(file));
void* file_pos = file_bytes;
int bytes_read = 0;
#define chunk_size 1024
al_fseek(file, 0, SEEK_SET);
while (!al_feof(file)) {
bytes_read = al_fread(file, file_pos, chunk_size);
file_pos += bytes_read;
}
void* data = qoi_decode(file_bytes, al_fsize(file), &meta, 0);
free(file_bytes); if (!data) return NULL;
int oldflags = al_get_new_bitmap_flags();
al_set_new_bitmap_flags(flags);
//ALLEGRO_PIXEL_FORMAT oldfmt = al_get_new_bitmap_format();
//al_set_new_bitmap_format(ALLEGRO_PIXEL_FORMAT_ABGR_8888);
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,
@@ -21,6 +39,8 @@ ALLEGRO_BITMAP* _al_load_qoi_f(ALLEGRO_FILE* filename, int flags) {
ALLEGRO_LOCK_WRITEONLY ALLEGRO_LOCK_WRITEONLY
); );
if (!lock) return NULL; if (!lock) return NULL;
al_set_new_bitmap_flags(oldflags);
//al_set_new_bitmap_format(oldfmt);
lock->data = data; lock->data = data;
@@ -47,9 +67,8 @@ ALLEGRO_BITMAP* _al_load_qoi(const char* filename, int flags) {
} }
bool _al_identify_qoi(ALLEGRO_FILE* f) { bool _al_identify_qoi(ALLEGRO_FILE* f) {
uint32_t magic_found;
uint32_t magic_expected = 1718185841; uint32_t magic_expected = 1718185841;
magic_found = al_fread32le(f); uint32_t magic_found = al_fread32le(f);
if (magic_found != magic_expected) if (magic_found != magic_expected)
return false; return false;
if (!al_fseek(f, 14 - 4, ALLEGRO_SEEK_CUR)) // check for min size 14-byte header minus 32-bit magic if (!al_fseek(f, 14 - 4, ALLEGRO_SEEK_CUR)) // check for min size 14-byte header minus 32-bit magic
@@ -64,3 +83,7 @@ bool al_init_qoi() {
insane |= al_register_bitmap_identifier(".qoi", _al_identify_qoi); insane |= al_register_bitmap_identifier(".qoi", _al_identify_qoi);
return insane; return insane;
} }
#ifdef __cplusplus
}
#endif

View File

@@ -1,11 +1,18 @@
#ifndef ALLEGRO_QOI_H #ifndef ALLEGRO_QOI_H
#define ALLEGRO_QOI_H #define ALLEGRO_QOI_H
#include <allegro5/allegro5.h> #ifdef __cplusplus
extern "C" {
#endif
ALLEGRO_BITMAP* _al_load_qoi_f(ALLEGRO_FILE* filename, int flags); ALLEGRO_BITMAP* _al_load_qoi_f(ALLEGRO_FILE* filename, int flags);
ALLEGRO_BITMAP* _al_load_qoi(const char* filename, int flags); ALLEGRO_BITMAP* _al_load_qoi(const char* filename, int flags);
bool _al_identify_qoi(ALLEGRO_FILE* f); bool _al_identify_qoi(ALLEGRO_FILE* f);
bool al_init_qoi(); bool al_init_qoi();
#ifdef __cplusplus
}
#endif
#endif //ALLEGRO_QOI_H #endif //ALLEGRO_QOI_H