74 lines
1.1 KiB
C
Raw Normal View History

#include <stddef.h>
#include <stdint.h>
#include "lodepng.h"
#include "png.h"
#ifndef MONITOR_HEAP
2018-03-29 23:45:58 -03:00
static inline void _rgb_swap(u8 *img, size_t sz)
{
// maybe process in batches of 3 pixels / 12 bytes at a time?
for (size_t i = 0; i < sz; i+=3) {
u8 c = img[i];
img[i] = img[i + 2];
img[i + 2] = c;
}
}
2018-03-29 22:12:53 -03:00
u8 *PNG_Decompress(const u8 *png, size_t png_len, u32 *w, u32 *h)
{
u8 *img;
u32 res;
size_t w_, h_;
2019-05-25 10:34:29 -03:00
img = NULL;
res = lodepng_decode24(&img, &w_, &h_, png, png_len);
2018-03-29 23:45:58 -03:00
if (res) {
2019-05-25 10:34:29 -03:00
free(img);
return NULL;
}
2018-03-29 23:45:58 -03:00
_rgb_swap(img, w_ * h_ * 3);
if (w) *w = w_;
if (h) *h = h_;
return img;
}
2018-03-29 23:45:58 -03:00
2019-05-25 10:34:29 -03:00
u8 *PNG_Compress(const u8 *fb, u32 w, u32 h, size_t *png_sz)
2018-03-29 23:45:58 -03:00
{
2019-05-25 10:34:29 -03:00
u8 *img;
2018-03-29 23:45:58 -03:00
u32 res;
size_t png_size;
2019-05-25 10:34:29 -03:00
img = NULL;
2018-03-29 23:45:58 -03:00
res = lodepng_encode24(&img, &png_size, fb, w, h);
if (res) {
2019-05-25 10:34:29 -03:00
free(img);
2018-03-29 23:45:58 -03:00
return NULL;
}
2019-05-25 10:34:29 -03:00
if (png_sz)
*png_sz = png_size;
2018-03-29 23:45:58 -03:00
return img;
}
#else
u8 *PNG_Decompress(const u8 *png, size_t png_len, u32 *w, u32 *h)
{
(void) png;
(void) w;
(void) h;
(void) png_len;
return NULL;
}
u8 *PNG_Compress(u8 *fb, u32 w, u32 h, size_t *png_sz)
{
(void) fb;
(void) png_sz;
(void) w;
(void) h;
return NULL;
}
#endif