Finish grey picture re-encoding for PNG output
This commit is contained in:
parent
a34a5d5337
commit
6df772741b
@ -109,9 +109,6 @@ void purgeHMTFromMemory(HMT_FILE *_f) {
|
|||||||
if (_f->textures_list->image.pixels != NULL) free(_f->textures_list->image.pixels);
|
if (_f->textures_list->image.pixels != NULL) free(_f->textures_list->image.pixels);
|
||||||
if (_f->textures_list->image.samples != NULL) free(_f->textures_list->image.samples);
|
if (_f->textures_list->image.samples != NULL) free(_f->textures_list->image.samples);
|
||||||
}
|
}
|
||||||
if (_f->textures_list != NULL) {
|
|
||||||
if (_f->textures_list->image.pixels != NULL) free(_f->textures_list->image.pixels);
|
|
||||||
}
|
|
||||||
free(_f->textures_list);
|
free(_f->textures_list);
|
||||||
|
|
||||||
if (_f->materials_list != NULL) free(_f->materials_list);
|
if (_f->materials_list != NULL) free(_f->materials_list);
|
||||||
|
@ -6,10 +6,11 @@ int saveToPNG(RS_IMAGE *img, char *tex_name) {
|
|||||||
FILE *_png_f = NULL;
|
FILE *_png_f = NULL;
|
||||||
png_structp png_ptr = NULL;
|
png_structp png_ptr = NULL;
|
||||||
png_infop info_ptr = NULL;
|
png_infop info_ptr = NULL;
|
||||||
//size_t x,y;
|
size_t x,y;
|
||||||
png_byte **row_ptrs = NULL;
|
png_byte **row_ptrs = NULL;
|
||||||
|
PIXEL *pixel = NULL;
|
||||||
//int pixel_size = 3;
|
//int pixel_size = 3;
|
||||||
//int depth = 8;
|
//int depth = 8; //bit par color channel (RGB)
|
||||||
|
|
||||||
strcpy(tex_path,tex_name);
|
strcpy(tex_path,tex_name);
|
||||||
strcat(tex_path, ".png");
|
strcat(tex_path, ".png");
|
||||||
@ -31,23 +32,33 @@ int saveToPNG(RS_IMAGE *img, char *tex_name) {
|
|||||||
|
|
||||||
// Init PNG datas
|
// Init PNG datas
|
||||||
row_ptrs = png_malloc(png_ptr, img->height * sizeof(png_byte *));
|
row_ptrs = png_malloc(png_ptr, img->height * sizeof(png_byte *));
|
||||||
/*for (y=0; y<img->height; y++) {
|
for (y=0; y<img->height; y++) {
|
||||||
png_byte *row = png_malloc(png_ptr, img->width*sizeof(unsigned char)*3);
|
png_byte *row = png_malloc(png_ptr, img->width*sizeof(PIXEL));
|
||||||
row_ptrs[y] = row;
|
row_ptrs[y] = row;
|
||||||
for (x=0; x<img->width; x++) {
|
for (x=0; x<img->width; x++) {
|
||||||
unsigned char pixel[3] = pixelAt(img->pixels);
|
pixel = pixelAt(img, x , y);
|
||||||
|
if(pixel == NULL) return EXIT_FAILURE;
|
||||||
|
|
||||||
|
*row++ = pixel->_red;
|
||||||
|
*row++ = pixel->_green;
|
||||||
|
*row++ = pixel->_blue;
|
||||||
}
|
}
|
||||||
}*/
|
}
|
||||||
|
/*
|
||||||
if (img->paletteEntries == 0 || img->sampleBits == 32 || img->sampleBits == 16) {
|
if (img->paletteEntries == 0 || img->sampleBits == 32 || img->sampleBits == 16) {
|
||||||
memcpy(row_ptrs, img->pixels, sizeof(*img->pixels)*img->height*img->width);
|
memcpy(row_ptrs, img->pixels, sizeof(*img->pixels)*img->height*img->width);
|
||||||
} else {
|
} else {
|
||||||
memcpy(row_ptrs, img->pixels, sizeof(*img->pixels)*3*img->height*img->width);
|
memcpy(row_ptrs, img->pixels, sizeof(*img->pixels)*3*img->height*img->width);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
png_init_io(png_ptr, _png_f);
|
png_init_io(png_ptr, _png_f);
|
||||||
png_set_rows(png_ptr, info_ptr, row_ptrs);
|
png_set_rows(png_ptr, info_ptr, row_ptrs);
|
||||||
png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
|
png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
|
||||||
|
|
||||||
|
for (y=0; y<img->height; y++) {
|
||||||
|
png_free(png_ptr, row_ptrs[y]);
|
||||||
|
}
|
||||||
png_free(png_ptr, row_ptrs);
|
png_free(png_ptr, row_ptrs);
|
||||||
png_destroy_write_struct(&png_ptr, &info_ptr);
|
png_destroy_write_struct(&png_ptr, &info_ptr);
|
||||||
fclose(_png_f);
|
fclose(_png_f);
|
||||||
|
@ -35,7 +35,7 @@ int getSamplesFromFile(RS_IMAGE *img, FILE *f) {
|
|||||||
void decodePixels(RS_IMAGE *img) {
|
void decodePixels(RS_IMAGE *img) {
|
||||||
int size;
|
int size;
|
||||||
|
|
||||||
img->pixels = NULL;
|
//img->pixels = NULL;
|
||||||
if (!(img->type_ == 0 ||
|
if (!(img->type_ == 0 ||
|
||||||
img->type_ == 1 ||
|
img->type_ == 1 ||
|
||||||
img->type_ == 2 ||
|
img->type_ == 2 ||
|
||||||
@ -51,9 +51,9 @@ void decodePixels(RS_IMAGE *img) {
|
|||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
if (img->paletteEntries == 0) {
|
if (img->paletteEntries == 0) {
|
||||||
size = img->width * img->height;
|
size = sizeof(PIXEL) * img->height * img->width;
|
||||||
img->pixels = calloc(1, size);
|
img->pixels = calloc(1, size);
|
||||||
unpack4To8bits(img->samples, img->pixels, size);
|
convert4bitsGreyto8bitsRGB(img->samples, img->pixels, div(size,3).quot);
|
||||||
} else if (img->paletteEntries == 16) {
|
} else if (img->paletteEntries == 16) {
|
||||||
size = img->width * img->height;
|
size = img->width * img->height;
|
||||||
img->pixels = calloc(1, size*3);
|
img->pixels = calloc(1, size*3);
|
||||||
@ -81,14 +81,18 @@ void decodePixels(RS_IMAGE *img) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void unpack4To8bits(unsigned char *samples_tab, unsigned char *pixels_tab, int sampling) {
|
void convert4bitsGreyto8bitsRGB(unsigned char *samples_tab, PIXEL *pixels_tab, int sampling) {
|
||||||
int i;
|
int i;
|
||||||
char v;
|
unsigned char v;
|
||||||
|
|
||||||
for(i=0; i<div(sampling,2).quot; i++) {
|
for(i=0; i<div(sampling,2).quot; i++) {
|
||||||
v = samples_tab[i];
|
v = samples_tab[i];
|
||||||
pixels_tab[i*2] = ((v >> 4) & 0xF) << 4;
|
pixels_tab[i*2]._red = div((v >> 4 & 0xF) * 256, 16).quot;
|
||||||
pixels_tab[i*2+1] = (v & 0xF) << 4;
|
pixels_tab[i*2]._green = div((v >> 4 & 0xF) * 256, 16).quot;
|
||||||
|
pixels_tab[i*2]._blue = div((v >> 4 & 0xF) * 256, 16).quot;
|
||||||
|
pixels_tab[i*2+1]._red = div((v & 0xF) * 256, 16).quot;
|
||||||
|
pixels_tab[i*2+1]._green = div((v & 0xF) * 256, 16).quot;
|
||||||
|
pixels_tab[i*2+1]._blue = div((v & 0xF) * 256, 16).quot;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,6 +123,10 @@ void useOddBytes(unsigned char *src, unsigned char *dst, int size) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PIXEL *pixelAt(RS_IMAGE *img, int posX , int posY) {
|
||||||
|
return img->pixels + img->width * posY + posX;
|
||||||
|
}
|
||||||
|
|
||||||
RS_IMAGE_DESC getImageDescFromType(unsigned char type) {
|
RS_IMAGE_DESC getImageDescFromType(unsigned char type) {
|
||||||
RS_IMAGE_DESC desc;
|
RS_IMAGE_DESC desc;
|
||||||
|
|
||||||
|
@ -21,9 +21,9 @@
|
|||||||
* @brief RGB pixel structure, used to store datas for implementation inside PNG files
|
* @brief RGB pixel structure, used to store datas for implementation inside PNG files
|
||||||
*/
|
*/
|
||||||
typedef struct PixelRGB {
|
typedef struct PixelRGB {
|
||||||
char _red;
|
unsigned char _red;
|
||||||
char _green;
|
unsigned char _green;
|
||||||
char _blue;
|
unsigned char _blue;
|
||||||
}PIXEL;
|
}PIXEL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -51,11 +51,12 @@ typedef struct RSImage_desc {
|
|||||||
///// Declare functions /////
|
///// Declare functions /////
|
||||||
/////////////////////////////
|
/////////////////////////////
|
||||||
RS_IMAGE_DESC getImageDescFromType(unsigned char type); //TODO: Optimise function
|
RS_IMAGE_DESC getImageDescFromType(unsigned char type); //TODO: Optimise function
|
||||||
void unpack4To8bits(unsigned char *samples_tab, unsigned char *pixels_tab, int sampling);
|
void convert4bitsGreyto8bitsRGB(unsigned char *samples_tab, PIXEL *pixels_tab, int sampling);
|
||||||
void unpack4To24bitsRGB(unsigned char *samples_tab, unsigned char *pixels_tab, int size, unsigned char pal[256][3]);
|
void unpack4To24bitsRGB(unsigned char *samples_tab, unsigned char *pixels_tab, int size, unsigned char pal[256][3]);
|
||||||
void unpack8To24bitsRGB(unsigned char *samples_tab, unsigned char *pixels_tab, int size, unsigned char pal[256][3]);
|
void unpack8To24bitsRGB(unsigned char *samples_tab, unsigned char *pixels_tab, int size, unsigned char pal[256][3]);
|
||||||
void useOddBytes(unsigned char *src, unsigned char *dst, int size);
|
void useOddBytes(unsigned char *src, unsigned char *dst, int size);
|
||||||
void decodePixels(RS_IMAGE *img);
|
void decodePixels(RS_IMAGE *img);
|
||||||
|
PIXEL *pixelAt(RS_IMAGE *img, int posX , int posY);
|
||||||
int getPaletteFromFile(RS_IMAGE *img, FILE *f);
|
int getPaletteFromFile(RS_IMAGE *img, FILE *f);
|
||||||
int getSamplesFromFile(RS_IMAGE *img, FILE *f);
|
int getSamplesFromFile(RS_IMAGE *img, FILE *f);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user