2022-03-26 23:32:26 +01:00
|
|
|
#include "../include/utils.h"
|
2022-05-23 22:02:45 +02:00
|
|
|
#include <gint/image.h>
|
2022-03-26 23:32:26 +01:00
|
|
|
|
|
|
|
|
2022-05-23 22:02:45 +02:00
|
|
|
/*
|
2022-03-26 23:32:26 +01:00
|
|
|
size_t image_size_profile(int profile, int width, int height)
|
|
|
|
{
|
|
|
|
size_t size = sizeof(bopti_image_t);
|
|
|
|
|
|
|
|
if(profile == 0 || profile == 1) // PX_RGB565, PX_RGB565A
|
|
|
|
size += width * height * 2;
|
|
|
|
else if(profile == 2) // PX_P8
|
|
|
|
size += 512 + width * height;
|
|
|
|
else if(profile == 3) // PX_P4
|
|
|
|
size += 32 + ((width + 1) / 2) * height;
|
|
|
|
|
|
|
|
return size;
|
|
|
|
}
|
|
|
|
|
|
|
|
size_t image_size(bopti_image_t const *img)
|
|
|
|
{
|
|
|
|
return image_size_profile(img->profile, img->width, img->height);
|
|
|
|
}
|
|
|
|
|
2022-05-23 22:02:45 +02:00
|
|
|
|
2022-03-26 23:32:26 +01:00
|
|
|
int get_pixel(bopti_image_t const *img, int x, int y)
|
|
|
|
{
|
|
|
|
if((unsigned)x >= img->width || (unsigned)y >= img->height)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
uint8_t *bytes = (void *)img->data;
|
|
|
|
|
|
|
|
if(img->profile <= 1)
|
|
|
|
return img->data[y * img->width + x];
|
|
|
|
if(img->profile == 2)
|
|
|
|
return bytes[y * img->width + x + 512];
|
|
|
|
if(img->profile == 3)
|
|
|
|
{
|
|
|
|
int s = (img->width + 1) >> 1;
|
|
|
|
int i = y * s + (x >> 1) + 32;
|
|
|
|
if(x & 1)
|
|
|
|
return bytes[i] & 0x0f;
|
|
|
|
else
|
|
|
|
return bytes[i] >> 4;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void set_pixel(bopti_image_t *img, int x, int y, int color)
|
|
|
|
{
|
|
|
|
if((unsigned)x >= img->width || (unsigned)y >= img->height)
|
|
|
|
return;
|
|
|
|
|
|
|
|
uint8_t *bytes = (void *)img->data;
|
|
|
|
|
|
|
|
if(img->profile <= 1)
|
|
|
|
img->data[y * img->width + x] = color;
|
|
|
|
else if(img->profile == 2)
|
|
|
|
bytes[y * img->width + x + 512] = color;
|
|
|
|
else if(img->profile == 3)
|
|
|
|
{
|
|
|
|
int s = (img->width + 1) >> 1;
|
|
|
|
int i = y * s + (x >> 1) + 32;
|
|
|
|
if(x & 1)
|
|
|
|
bytes[i] = (bytes[i] & 0xf0) | (color & 0x0f);
|
|
|
|
else
|
|
|
|
bytes[i] = (bytes[i] & 0x0f) | ((color & 0x0f) << 4);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bopti_image_t *resize(bopti_image_t const *src, int w, int h)
|
|
|
|
{
|
|
|
|
size_t size = image_size_profile(src->profile, w, h);
|
|
|
|
bopti_image_t *img = malloc(size);
|
|
|
|
if(!img) return NULL;
|
|
|
|
|
|
|
|
size_t palette_size = 0;
|
|
|
|
if(src->profile == 2) // PX_P8
|
|
|
|
palette_size = 512;
|
|
|
|
else if(src->profile == 3) // PX_P4
|
|
|
|
palette_size = 32;
|
|
|
|
|
|
|
|
img->profile = src->profile;
|
|
|
|
img->alpha = src->alpha;
|
|
|
|
img->width = w;
|
|
|
|
img->height = h;
|
|
|
|
memcpy(img->data, src->data, palette_size);
|
|
|
|
|
|
|
|
for(int y = 0; y < h; y++)
|
|
|
|
for(int x = 0; x < w; x++)
|
|
|
|
{
|
|
|
|
int color = get_pixel(src, x * src->width / w, y * src->height / h);
|
|
|
|
set_pixel(img, x, y, color);
|
|
|
|
}
|
|
|
|
|
|
|
|
return img;
|
|
|
|
}
|
2022-05-23 22:02:45 +02:00
|
|
|
*/
|
2022-03-26 23:32:26 +01:00
|
|
|
|
2022-05-23 22:02:45 +02:00
|
|
|
bopti_image_t *resize(bopti_image_t const *src, int w, int h)
|
|
|
|
{
|
|
|
|
image_linear_map scale;
|
|
|
|
image_scale( src, 65536*w/src->width, 65536*h/src->height, &scale );
|
|
|
|
return image_linear_alloc(src, &scale );
|
|
|
|
}
|