diff --git a/.gitignore b/.gitignore index 910376d..2a41c8a 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,7 @@ *.su *.idb *.pdb +testfiles/ # Kernel Module Compile Results *.mod* diff --git a/src/HMT_Parser.c b/src/HMT_Parser.c index 1d69e23..20ad2c8 100644 --- a/src/HMT_Parser.c +++ b/src/HMT_Parser.c @@ -52,7 +52,7 @@ int readMaterial(HMT_MATERIAL *mat, FILE *hmt_src) { } int readTexture(HMT_TEXTURE *tex, FILE *hmt_src) { - char u0,u1,bpp; + unsigned char u0,u1,bpp; long pos; RS_IMAGE_DESC desc; @@ -78,7 +78,7 @@ int readTexture(HMT_TEXTURE *tex, FILE *hmt_src) { fseek(hmt_src, pos, SEEK_SET); desc = getImageDescFromType(tex->image.type_); - tex->image.paletteEntries = desc.palette_enties; + tex->image.paletteEntries = desc.palette_entries; tex->image.sampleBits = desc.sample_bits; tex->image.width = tex->width; tex->image.height = tex->height; @@ -106,6 +106,37 @@ int readTexture(HMT_TEXTURE *tex, FILE *hmt_src) { return EXIT_SUCCESS; } +int getPaletteFromFile(RS_IMAGE *img, FILE *f) { + int entries = img->paletteEntries; + + switch (entries) { + case 16: + case 256: + fread(img->palette, sizeof(PIXEL), entries, f); + break; + default: + break; + } + + return EXIT_SUCCESS; +} + +int getSamplesFromFile(RS_IMAGE *img, FILE *f) { + int sample_bits = img->sampleBits; + int size = div(img->width*img->height*sample_bits, 8).quot; + + if (f->_bufsiz >= ftell(f)+size) { + printf("WARNING! Please fix size/sample."); + return EXIT_FAILURE; + } + + img->samples = calloc(1, size); + fread(img->samples, size, 1, f); + if (img->type_ == 2) fread(img->samples, div(size, 4).quot, 1, f); + + return EXIT_SUCCESS; +} + void purgeHMTFromMemory(HMT_FILE *_f) { if (_f == NULL) return; diff --git a/src/HMT_Parser.h b/src/HMT_Parser.h index ceae4aa..5f2e4fe 100644 --- a/src/HMT_Parser.h +++ b/src/HMT_Parser.h @@ -100,6 +100,8 @@ HMT_MATERIAL *getMaterialFromIndex(int i); HMT_MATERIAL *getMaterialFromName(char *matName); HMT_TEXTURE *getTextureFromIndex(int i); HMT_TEXTURE *getTextureFromMaterial(HMT_MATERIAL *mat); +int getPaletteFromFile(RS_IMAGE *img, FILE *f); +int getSamplesFromFile(RS_IMAGE *img, FILE *f); void purgeHMTFromMemory(HMT_FILE *_f); #endif diff --git a/src/Image_Exporter.c b/src/Image_Exporter.c index 6e818db..4264511 100644 --- a/src/Image_Exporter.c +++ b/src/Image_Exporter.c @@ -52,13 +52,6 @@ int saveToPNG(RS_IMAGE *img, char *tex_path, char *hmt_fileName) { *row++ = pixel->_alpha; } } - /* - if (img->paletteEntries == 0 || img->sampleBits == 32 || img->sampleBits == 16) { - memcpy(row_ptrs, img->pixels, sizeof(*img->pixels)*img->height*img->width); - } else { - memcpy(row_ptrs, img->pixels, sizeof(*img->pixels)*3*img->height*img->width); - } - */ png_init_io(png_ptr, _png_f); png_set_rows(png_ptr, info_ptr, row_ptrs); diff --git a/src/RS_images.c b/src/RS_images.c index e58ee2e..998d3af 100644 --- a/src/RS_images.c +++ b/src/RS_images.c @@ -1,38 +1,5 @@ #include "RS_images.h" -#define PIXEL_MEMBERS_NBR 4 - - -int getPaletteFromFile(RS_IMAGE *img, FILE *f) { - int entries = img->paletteEntries; - - switch (entries) { - case 16: - case 256: - fread(img->palette, sizeof(unsigned char), entries*3, f); - break; - default: - break; - } - - return EXIT_SUCCESS; -} - -int getSamplesFromFile(RS_IMAGE *img, FILE *f) { - int sample_bits = img->sampleBits; - int size = div(img->width*img->height*sample_bits, 8).quot; - - if (f->_bufsiz >= ftell(f)+size) { - printf("WARNING! Please fix size/sample."); - return EXIT_FAILURE; - } - - img->samples = calloc(1, size); - fread(img->samples, size, 1, f); - if (img->type_ == 2) fread(img->samples, div(size, 4).quot, 1, f); - - return EXIT_SUCCESS; -} void decodePixels(RS_IMAGE *img) { int size; @@ -45,36 +12,30 @@ void decodePixels(RS_IMAGE *img) { img->type_ == 4 || img->type_ == 5)) return; + size = img->height * img->width; switch (img->sampleBits) { case 32: - size = img->width * img->height * 4; - img->pixels = calloc(1, size); - memcpy(img->pixels, img->samples, size); + img->pixels = calloc(1, size * sizeof(PIXEL_A)); + memcpy(img->pixels, img->samples, size * sizeof(PIXEL_A)); break; case 4: + img->pixels = calloc(1, size * sizeof(PIXEL_A)); if (img->paletteEntries == 0) { - size = sizeof(PIXEL_A) * img->height * img->width; - img->pixels = calloc(1, size); - convert4bitsGreyto8bitsRGB(img->samples, img->pixels, div(size, PIXEL_MEMBERS_NBR).quot, &(img->alpha_color)); + convert4bitsGreyTo32bitsRGBA(img->samples, img->pixels, size, &(img->alpha_color)); } else if (img->paletteEntries == 16) { - size = img->width * img->height; - img->pixels = calloc(1, size*3); - unpack4To24bitsRGB(img->samples, img->pixels, size, img->palette); + convert4bitsTo32bitsRGBA(img->samples, img->pixels, size, img->palette, &(img->alpha_color)); } break; case 8: if (img->paletteEntries == 0) { - size = img->width * img->height; img->pixels = calloc(1, size); memcpy(img->pixels, img->samples, size); } else if (img->paletteEntries == 256) { - size = img->width * img->height; - img->pixels = calloc(1, size*3); - unpack8To24bitsRGB(img->samples, img->pixels, size, img->palette); + img->pixels = calloc(1, size * sizeof(PIXEL_A)); + convert8bitsTo32bitsRGBA(img->samples, img->pixels, size, img->palette, &(img->alpha_color)); } break; case 16: - size = img->width * img->height; img->pixels = calloc(1, size); useOddBytes(img->samples, img->pixels, size); break; @@ -93,7 +54,7 @@ int isTransparentColor(PIXEL_A *testColor, PIXEL_A *transp_color) { return 0; } -void convert4bitsGreyto8bitsRGB(unsigned char *samples_tab, PIXEL_A *pixels_tab, int sampling, PIXEL_A *transp_color) { +void convert4bitsGreyTo32bitsRGBA(unsigned char *samples_tab, PIXEL_A *pixels_tab, int sampling, PIXEL_A *transp_color) { int i; unsigned char v; @@ -110,30 +71,39 @@ void convert4bitsGreyto8bitsRGB(unsigned char *samples_tab, PIXEL_A *pixels_tab, } } -void unpack4To24bitsRGB(unsigned char *samples_tab, unsigned char *pixels_tab, int size, unsigned char pal[256][3]) { +void convert4bitsTo32bitsRGBA(unsigned char *samples_tab, PIXEL_A *pixels_tab, int size, PIXEL *pal, PIXEL_A *transp_color) { int i,index; for(i=0; i