refactor image decoders

This commit is contained in:
Ishotihadus
2019-12-19 01:46:47 +09:00
parent e683b3c91a
commit 39ae15d9aa
16 changed files with 992 additions and 979 deletions
+74 -38
View File
@@ -1,66 +1,102 @@
#include "rgb.h"
#include "common.h"
#include <math.h>
#include <stdint.h>
#include "color.h"
#include "fp16.h"
void decode_a8(const uint8_t* data, const int size, uint8_t* image)
{
int decode_a8(const uint8_t *const data, const long size, uint8_t *image) {
const uint8_t *d = data, *d_end = data + size;
for (int i = 0; d < d_end; d++) {
image[i++] = *d;
image[i++] = *d;
image[i++] = *d;
}
return 1;
}
void decode_r8(const uint8_t* data, const int size, uint8_t* image)
{
int decode_r8(const uint8_t *const data, const long size, uint8_t *image) {
const uint8_t *d = data, *d_end = data + size;
for (int i = 0; d < d_end; d++) {
image[i++] = *d;
image[i++] = 0;
image[i++] = 0;
}
return 1;
}
void decode_r16(const uint16_t* data, const int size, const int endian_big, uint8_t* image)
{
const uint16_t *d = data, *d_end = data + size;
if (IS_LITTLE_ENDIAN == !endian_big) {
// Same endian
for (int i = 0; d < d_end; d++) {
uint8_t c = *d >> 8;
image[i++] = c;
image[i++] = 0;
image[i++] = 0;
}
} else {
// Different endian
for (int i = 0; d < d_end; d++) {
image[i++] = *d;
image[i++] = 0;
image[i++] = 0;
}
int decode_r16(const uint8_t *const data, const long size, const int endian_big, uint8_t *image) {
const uint8_t *d = endian_big ? data : data + 1;
const uint8_t *d_end = data + size * 2;
for (int i = 0; d < d_end; d += 2) {
image[i++] = *d;
image[i++] = 0;
image[i++] = 0;
}
return 1;
}
void decode_rgb565(const uint16_t* data, const int size, const int endian_big, uint8_t* image)
{
int decode_rgb565(const uint16_t *const data, const long size, const int endian_big, uint8_t *image) {
const uint16_t *d = data, *d_end = data + size;
if (IS_LITTLE_ENDIAN == !endian_big) {
// Same endian
// RRRRR GGG | GGG BBBBB
for (int i = 0; d < d_end; d++) {
image[i++] = (*d >> 8 & 0xf8) | (*d >> 13);
image[i++] = (*d >> 3 & 0xfc) | (*d >> 9 & 3);
image[i++] = (*d << 3) | (*d >> 2 & 7);
if (endian_big)
for (; d < d_end; d++, image += 3)
rgb565_bep(*d, image);
else
for (; d < d_end; d++, image += 3)
rgb565_lep(*d, image);
return 1;
}
static inline uint8_t u16_f16_u8(const uint16_t val) {
float f = fp16_ieee_to_fp32_value(val);
if (!isfinite(f) || f < 0)
return 0;
else if (f > 1)
return 255;
else
return roundf(f * 255);
}
int decode_rhalf(const uint16_t *data, const long size, const int endian_big, uint8_t *image) {
if (endian_big) {
for (long i = 0; i < size; i++, data++) {
*image++ = u16_f16_u8(bton16(*data));
*image++ = 0;
*image++ = 0;
}
} else {
// Different endian
// GGG BBBBB | RRRRR GGG
for (int i = 0; d < d_end; d++) {
image[i++] = (*d & 0xf8) | (*d >> 5 & 7);
image[i++] = (*d << 5 & 0xe0) | (*d >> 11 & 0x1c) | (*d >> 1 & 3);
image[i++] = (*d >> 5 & 0xf8) | (*d >> 10 & 0x7);
for (long i = 0; i < size; i++, data++) {
*image++ = u16_f16_u8(lton16(*data));
*image++ = 0;
*image++ = 0;
}
}
return 1;
}
int decode_rghalf(const uint16_t *data, const long size, const int endian_big, uint8_t *image) {
if (endian_big) {
for (long i = 0; i < size; i++, data++, image++) {
*image++ = u16_f16_u8(bton16(*data++));
*image++ = u16_f16_u8(bton16(*data++));
*image++ = 0;
}
} else {
for (long i = 0; i < size; i++, data++) {
*image++ = u16_f16_u8(lton16(*data++));
*image++ = u16_f16_u8(lton16(*data++));
*image++ = 0;
}
}
return 1;
}
int decode_rgbahalf(const uint16_t *data, const long size, const int endian_big, uint8_t *image) {
long lsize = size * 4;
if (endian_big)
for (long i = 0; i < lsize; i++, data++, image++)
*image = u16_f16_u8(bton16(*data));
else
for (long i = 0; i < lsize; i++, data++, image++)
*image = u16_f16_u8(lton16(*data));
return 1;
}