1
0
mirror of https://github.com/elima/gpu-playground.git synced 2025-06-06 15:36:35 +00:00

102 lines
2.5 KiB
C

#include <assert.h>
#include <errno.h>
#include "image.h"
bool
o_image_init_from_filename (struct o_image *self,
const char *filename)
{
assert (self != NULL);
assert (filename != NULL);
/* Try PNG. */
bool ok = png_decoder_init_from_filename (&self->png, filename);
if (ok) {
self->type = O_IMAGE_TYPE_PNG;
self->width = self->png.width;
self->height = self->png.height;
switch (self->png.format) {
case PNG_COLOR_TYPE_RGB:
self->format = O_IMAGE_FORMAT_RGB;
break;
case PNG_COLOR_TYPE_RGB_ALPHA:
self->format = O_IMAGE_FORMAT_RGBA;
break;
default:
assert (!"PNG image format not handled\n");
}
} else {
png_clear (&self->png);
/* Try JPEG. */
bool ok = jpeg_decoder_init_from_filename (&self->jpeg, filename);
if (ok) {
assert (self->jpeg.status == JPEG_STATUS_DECODE_READY);
self->type = O_IMAGE_TYPE_JPEG;
self->width = self->jpeg.width;
self->height = self->jpeg.height;
switch (self->jpeg.format) {
case JPEG_FORMAT_RGB:
case JPEG_FORMAT_EXT_RGB:
self->format = O_IMAGE_FORMAT_RGB;
break;
case JPEG_FORMAT_EXT_RGBA:
self->format = O_IMAGE_FORMAT_RGBA;
break;
default:
printf ("JPEG format: %d\n", self->jpeg.format);
assert (!"JPEG image format not handled\n");
}
} else {
printf ("Unknown or unhandled image format.\n");
return false;
}
}
return true;
}
void
o_image_clear (struct o_image *self)
{
assert (self != NULL);
if (self->type == O_IMAGE_TYPE_PNG)
png_clear (&self->png);
else if (self->type == O_IMAGE_TYPE_JPEG)
jpeg_clear (&self->jpeg);
}
ssize_t
o_image_read (struct o_image *self,
void *buffer,
size_t size,
size_t *first_row,
size_t *num_rows)
{
assert (self != NULL);
switch (self->type) {
case O_IMAGE_TYPE_PNG:
return png_read (&self->png,
buffer,
size,
first_row,
num_rows);
case O_IMAGE_TYPE_JPEG:
return jpeg_read (&self->jpeg,
buffer,
size,
first_row,
num_rows);
default:
errno = ENXIO;
return -1;
}
}