Fix memory leak in samples builder
This commit is contained in:
parent
56b4394f3b
commit
7c0088f311
2
Jenkinsfile
vendored
2
Jenkinsfile
vendored
@ -5,7 +5,7 @@ pipeline {
|
|||||||
}
|
}
|
||||||
environment {
|
environment {
|
||||||
CI_OUTPUT_NAME = "RSETexture"
|
CI_OUTPUT_NAME = "RSETexture"
|
||||||
CI_VERSION = "2.0.0"
|
CI_VERSION = "2.0.1"
|
||||||
CI_BUILD_NUMBER = "$BUILD_NUMBER"
|
CI_BUILD_NUMBER = "$BUILD_NUMBER"
|
||||||
}
|
}
|
||||||
stages {
|
stages {
|
||||||
|
@ -157,12 +157,12 @@ static unsigned short ExtractMaterials(T_RSPTEXTURE_HMT* pHmt, const MEMFILE pMe
|
|||||||
pHmt->materials[i].type = ((T_HMTFILE_MATERIAL *)(pMemfile +
|
pHmt->materials[i].type = ((T_HMTFILE_MATERIAL *)(pMemfile +
|
||||||
sizeof(T_HMTFILE_HEADER1) + sizeof(T_HMTFILE_MATERIAL) * i))->type;
|
sizeof(T_HMTFILE_HEADER1) + sizeof(T_HMTFILE_MATERIAL) * i))->type;
|
||||||
pHmt->materials[i].texture_index = ((T_HMTFILE_MATERIAL *)(pMemfile +
|
pHmt->materials[i].texture_index = ((T_HMTFILE_MATERIAL *)(pMemfile +
|
||||||
sizeof(T_HMTFILE_HEADER1) + sizeof(T_HMTFILE_MATERIAL) * i))->texture_index;
|
sizeof(T_HMTFILE_HEADER1) + sizeof(T_HMTFILE_MATERIAL) * i))->texture_index; // Texture index is only for texture "type" (1)
|
||||||
|
|
||||||
if (pParams->verbose_mode) {
|
if (pParams->verbose_mode) {
|
||||||
printf("[INFO] > Material name: %s\n", pHmt->materials[i].name);
|
printf("[INFO] > Material name: %s\n", pHmt->materials[i].name);
|
||||||
printf("[INFO] > Material type: %d\n", pHmt->materials[i].type);
|
printf("[INFO] > Material type: %d\n", pHmt->materials[i].type);
|
||||||
printf("[INFO] > Material text. index: %d\n", pHmt->materials[i].texture_index);
|
printf("[INFO] > Material text. index: %d (valid if type == 1)\n", pHmt->materials[i].texture_index);
|
||||||
}
|
}
|
||||||
if (pParams->debug_mode) {
|
if (pParams->debug_mode) {
|
||||||
printf("[DBG] > Material reserved0: %.8f\n", ((T_HMTFILE_MATERIAL *)(pMemfile +
|
printf("[DBG] > Material reserved0: %.8f\n", ((T_HMTFILE_MATERIAL *)(pMemfile +
|
||||||
@ -202,6 +202,8 @@ static unsigned short ExtractTextures(T_RSPTEXTURE_HMT* pHmt, const MEMFILE pMem
|
|||||||
|
|
||||||
for ( i = 0; i < pHmt->textures_count; i++ ) {
|
for ( i = 0; i < pHmt->textures_count; i++ ) {
|
||||||
if (pParams->debug_mode) printf("\n-----------------------Begin of texture #%d-------------------------\n", i);
|
if (pParams->debug_mode) printf("\n-----------------------Begin of texture #%d-------------------------\n", i);
|
||||||
|
_palette = NULL;
|
||||||
|
_samples = NULL;
|
||||||
|
|
||||||
// Get texture size infos
|
// Get texture size infos
|
||||||
pHmt->textures[i].width = ((T_HMTFILE_TEXTURE_HEADER *)(pMemfile + pHmt->texture_offset +
|
pHmt->textures[i].width = ((T_HMTFILE_TEXTURE_HEADER *)(pMemfile + pHmt->texture_offset +
|
||||||
@ -274,7 +276,7 @@ static unsigned short ExtractTextures(T_RSPTEXTURE_HMT* pHmt, const MEMFILE pMem
|
|||||||
switch (pHmt->textures[i].palette_entries) {
|
switch (pHmt->textures[i].palette_entries) {
|
||||||
case 16:
|
case 16:
|
||||||
case 256:
|
case 256:
|
||||||
_palette = (T_R8G8B8 *)malloc(sizeof(T_R8G8B8) * pHmt->textures[i].palette_entries);
|
_palette = (T_R8G8B8 *)realloc(_palette, sizeof(T_R8G8B8) * pHmt->textures[i].palette_entries);
|
||||||
if (_palette)
|
if (_palette)
|
||||||
memcpy(_palette, pMemfile + pHmt->textures[i].palette_offset, sizeof(T_R8G8B8) * pHmt->textures[i].palette_entries);
|
memcpy(_palette, pMemfile + pHmt->textures[i].palette_offset, sizeof(T_R8G8B8) * pHmt->textures[i].palette_entries);
|
||||||
else return RSPLIB_ERROR_MEMORY;
|
else return RSPLIB_ERROR_MEMORY;
|
||||||
@ -285,18 +287,21 @@ static unsigned short ExtractTextures(T_RSPTEXTURE_HMT* pHmt, const MEMFILE pMem
|
|||||||
|
|
||||||
// Retrieve samples from HMT file
|
// Retrieve samples from HMT file
|
||||||
//TODO: better approach?
|
//TODO: better approach?
|
||||||
_samples = (T_SAMPLE *)malloc(pHmt->textures[i].width * pHmt->textures[i].height * pHmt->textures[i].sample_bits / 8);
|
_samples = (T_SAMPLE *)realloc(_samples, pHmt->textures[i].width * pHmt->textures[i].height * pHmt->textures[i].sample_bits / 8);
|
||||||
if (_samples) {
|
if (_samples) {
|
||||||
memcpy(_samples, pMemfile + pHmt->textures[i].pixels_offset, pHmt->textures[i].width * pHmt->textures[i].height * pHmt->textures[i].sample_bits / 8);
|
memcpy(_samples, pMemfile + pHmt->textures[i].pixels_offset, pHmt->textures[i].width * pHmt->textures[i].height * pHmt->textures[i].sample_bits / 8);
|
||||||
//if (pHmt->textures[i].type == 2) memcpy(pHmt->textures[i].samples, pMemfile + pHmt->textures[i].pixels_offset, pHmt->textures[i].width * pHmt->textures[i].height * pHmt->textures[i].sample_bits / (8 * 4)); //TODO: manage texture type 2
|
//if (pHmt->textures[i].type == 2) memcpy(pHmt->textures[i].samples, pMemfile + pHmt->textures[i].pixels_offset, pHmt->textures[i].width * pHmt->textures[i].height * pHmt->textures[i].sample_bits / (8 * 4)); //TODO: manage texture type 2
|
||||||
} else return RSPLIB_ERROR_MEMORY;
|
} else return RSPLIB_ERROR_MEMORY;
|
||||||
|
|
||||||
// Decode palette and samples to pixels datas
|
// Decode palette and samples to pixels datas
|
||||||
if (_palette && _samples) TranslatePixels(&(pHmt->textures[i]), _samples, _palette);
|
TranslatePixels(&(pHmt->textures[i]), _samples, _palette);
|
||||||
|
|
||||||
if (pParams->debug_mode) printf("\n-----------------------End of texture #%d---------------------------\n", i);
|
if (pParams->debug_mode) printf("\n-----------------------End of texture #%d---------------------------\n", i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_palette) free(_palette);
|
||||||
|
if (_samples) free(_samples);
|
||||||
|
|
||||||
return RSPLIB_SUCCESS;
|
return RSPLIB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -312,7 +317,7 @@ static unsigned short ExtractTextures(T_RSPTEXTURE_HMT* pHmt, const MEMFILE pMem
|
|||||||
static unsigned short TranslatePixels(T_RSPTEXTURE_TEXTURE* pTexture, const T_SAMPLE* pSamples, const T_R8G8B8* pPalette) {
|
static unsigned short TranslatePixels(T_RSPTEXTURE_TEXTURE* pTexture, const T_SAMPLE* pSamples, const T_R8G8B8* pPalette) {
|
||||||
unsigned int size;
|
unsigned int size;
|
||||||
|
|
||||||
if (pTexture == NULL || pSamples == NULL || pPalette == NULL) return RSPLIB_ERROR_ARGS_NULL;
|
if (pTexture == NULL) return RSPLIB_ERROR_ARGS_NULL;
|
||||||
if (!(pTexture->type == 0 ||
|
if (!(pTexture->type == 0 ||
|
||||||
pTexture->type == 1 ||
|
pTexture->type == 1 ||
|
||||||
pTexture->type == 2 ||
|
pTexture->type == 2 ||
|
||||||
@ -325,10 +330,12 @@ static unsigned short TranslatePixels(T_RSPTEXTURE_TEXTURE* pTexture, const T_SA
|
|||||||
switch (pTexture->sample_bits) {
|
switch (pTexture->sample_bits) {
|
||||||
case 32:
|
case 32:
|
||||||
pTexture->pixels = (T_R8G8B8A8 *)calloc(size, sizeof(T_R8G8B8A8));
|
pTexture->pixels = (T_R8G8B8A8 *)calloc(size, sizeof(T_R8G8B8A8));
|
||||||
|
if (pTexture->pixels == NULL) printf("[ERR] A texture failed to assert pixels buffer!");
|
||||||
memcpy(pTexture->pixels, pSamples, size * sizeof(T_R8G8B8A8));
|
memcpy(pTexture->pixels, pSamples, size * sizeof(T_R8G8B8A8));
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
pTexture->pixels = (T_R8G8B8A8 *)calloc(size, sizeof(T_R8G8B8A8));
|
pTexture->pixels = (T_R8G8B8A8 *)calloc(size, sizeof(T_R8G8B8A8));
|
||||||
|
if (pTexture->pixels == NULL) printf("[ERR] A texture failed to assert pixels buffer!");
|
||||||
if (pTexture->palette_entries == 0) {
|
if (pTexture->palette_entries == 0) {
|
||||||
convert4bitsGreyTo32bitsRGBA(pTexture->pixels, pSamples, size, pTexture->alpha_color);
|
convert4bitsGreyTo32bitsRGBA(pTexture->pixels, pSamples, size, pTexture->alpha_color);
|
||||||
} else if (pTexture->palette_entries == 16) {
|
} else if (pTexture->palette_entries == 16) {
|
||||||
@ -338,14 +345,17 @@ static unsigned short TranslatePixels(T_RSPTEXTURE_TEXTURE* pTexture, const T_SA
|
|||||||
case 8:
|
case 8:
|
||||||
if (pTexture->palette_entries == 0) {
|
if (pTexture->palette_entries == 0) {
|
||||||
pTexture->pixels = (T_R8G8B8A8 *)calloc(size, 1);
|
pTexture->pixels = (T_R8G8B8A8 *)calloc(size, 1);
|
||||||
|
if (pTexture->pixels == NULL) printf("[ERR] A texture failed to assert pixels buffer!");
|
||||||
memcpy(pTexture->pixels, pSamples, size);
|
memcpy(pTexture->pixels, pSamples, size);
|
||||||
} else if (pTexture->palette_entries == 256) {
|
} else if (pTexture->palette_entries == 256) {
|
||||||
pTexture->pixels = (T_R8G8B8A8 *)calloc(size, sizeof(T_R8G8B8A8));
|
pTexture->pixels = (T_R8G8B8A8 *)calloc(size, sizeof(T_R8G8B8A8));
|
||||||
|
if (pTexture->pixels == NULL) printf("[ERR] A texture failed to assert pixels buffer!");
|
||||||
convert8bitsTo32bitsRGBA(pTexture->pixels, pSamples, size, pPalette, pTexture->alpha_color);
|
convert8bitsTo32bitsRGBA(pTexture->pixels, pSamples, size, pPalette, pTexture->alpha_color);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 16:
|
case 16:
|
||||||
pTexture->pixels = (T_R8G8B8A8 *)calloc(size, 1);
|
pTexture->pixels = (T_R8G8B8A8 *)calloc(size, 1);
|
||||||
|
if (pTexture->pixels == NULL) printf("[ERR] A texture failed to assert pixels buffer!");
|
||||||
useOddBytes(pTexture->pixels, pSamples, size);
|
useOddBytes(pTexture->pixels, pSamples, size);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -356,11 +366,11 @@ static unsigned short TranslatePixels(T_RSPTEXTURE_TEXTURE* pTexture, const T_SA
|
|||||||
}
|
}
|
||||||
|
|
||||||
static unsigned short isTransparentColor(const T_R8G8B8A8 testColor, const T_R8G8B8A8 transp_color) {
|
static unsigned short isTransparentColor(const T_R8G8B8A8 testColor, const T_R8G8B8A8 transp_color) {
|
||||||
if (!(testColor.r == transp_color.r)) return RSPLIB_ERROR_PROCESS;
|
if (!(testColor.r == transp_color.r)) return 0;
|
||||||
if (!(testColor.g == transp_color.g)) return RSPLIB_ERROR_PROCESS;
|
if (!(testColor.g == transp_color.g)) return 0;
|
||||||
if (!(testColor.b == transp_color.b)) return RSPLIB_ERROR_PROCESS;
|
if (!(testColor.b == transp_color.b)) return 0;
|
||||||
|
|
||||||
return RSPLIB_SUCCESS;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void convert4bitsGreyTo32bitsRGBA(T_R8G8B8A8* pPixels, const T_SAMPLE* pSamples, const unsigned int sampling, const T_R8G8B8A8 transp_color) {
|
static void convert4bitsGreyTo32bitsRGBA(T_R8G8B8A8* pPixels, const T_SAMPLE* pSamples, const unsigned int sampling, const T_R8G8B8A8 transp_color) {
|
||||||
@ -373,11 +383,11 @@ static void convert4bitsGreyTo32bitsRGBA(T_R8G8B8A8* pPixels, const T_SAMPLE* pS
|
|||||||
pPixels[i * 2].r = div((p >> 4 & 0xF) * 256, 16).quot;
|
pPixels[i * 2].r = div((p >> 4 & 0xF) * 256, 16).quot;
|
||||||
pPixels[i * 2].g = div((p >> 4 & 0xF) * 256, 16).quot;
|
pPixels[i * 2].g = div((p >> 4 & 0xF) * 256, 16).quot;
|
||||||
pPixels[i * 2].b = div((p >> 4 & 0xF) * 256, 16).quot;
|
pPixels[i * 2].b = div((p >> 4 & 0xF) * 256, 16).quot;
|
||||||
pPixels[i * 2].a = isTransparentColor(pPixels[i * 2], transp_color) ? 255 : 255 - transp_color.a;
|
pPixels[i * 2].a = isTransparentColor(pPixels[i * 2], transp_color) ? 255 - transp_color.a : 255;
|
||||||
pPixels[i * 2 + 1].r = div((p & 0xF) * 256, 16).quot;
|
pPixels[i * 2 + 1].r = div((p & 0xF) * 256, 16).quot;
|
||||||
pPixels[i * 2 + 1].g = div((p & 0xF) * 256, 16).quot;
|
pPixels[i * 2 + 1].g = div((p & 0xF) * 256, 16).quot;
|
||||||
pPixels[i * 2 + 1].b = div((p & 0xF) * 256, 16).quot;
|
pPixels[i * 2 + 1].b = div((p & 0xF) * 256, 16).quot;
|
||||||
pPixels[i * 2 + 1].a = isTransparentColor(pPixels[i * 2 + 1], transp_color) ? 255 : 255 - transp_color.a;
|
pPixels[i * 2 + 1].a = isTransparentColor(pPixels[i * 2 + 1], transp_color) ? 255 - transp_color.a : 255;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -391,11 +401,11 @@ static void convert4bitsTo32bitsRGBA(T_R8G8B8A8* pPixels, const T_SAMPLE* pSampl
|
|||||||
pPixels[i * 2].r = pal[(p >> 4) & 0xF].r;
|
pPixels[i * 2].r = pal[(p >> 4) & 0xF].r;
|
||||||
pPixels[i * 2].g = pal[(p >> 4) & 0xF].g;
|
pPixels[i * 2].g = pal[(p >> 4) & 0xF].g;
|
||||||
pPixels[i * 2].b = pal[(p >> 4) & 0xF].b;
|
pPixels[i * 2].b = pal[(p >> 4) & 0xF].b;
|
||||||
pPixels[i * 2].a = isTransparentColor(pPixels[i * 2], transp_color) ? 255 : 255 - transp_color.a;
|
pPixels[i * 2].a = isTransparentColor(pPixels[i * 2], transp_color) ? 255 - transp_color.a : 255;
|
||||||
pPixels[i * 2 + 1].r = pal[p & 0xF].r;
|
pPixels[i * 2 + 1].r = pal[p & 0xF].r;
|
||||||
pPixels[i * 2 + 1].g = pal[p & 0xF].g;
|
pPixels[i * 2 + 1].g = pal[p & 0xF].g;
|
||||||
pPixels[i * 2 + 1].b = pal[p & 0xF].b;
|
pPixels[i * 2 + 1].b = pal[p & 0xF].b;
|
||||||
pPixels[i * 2 + 1].a = isTransparentColor(pPixels[i * 2 + 1], transp_color) ? 255 : 255 - transp_color.a;
|
pPixels[i * 2 + 1].a = isTransparentColor(pPixels[i * 2 + 1], transp_color) ? 255 - transp_color.a : 255;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -408,7 +418,7 @@ static void convert8bitsTo32bitsRGBA(T_R8G8B8A8* pPixels, const T_SAMPLE* pSampl
|
|||||||
pPixels[i].r = pal[p].r;
|
pPixels[i].r = pal[p].r;
|
||||||
pPixels[i].g = pal[p].g;
|
pPixels[i].g = pal[p].g;
|
||||||
pPixels[i].b = pal[p].b;
|
pPixels[i].b = pal[p].b;
|
||||||
pPixels[i].a = isTransparentColor(pPixels[i], transp_color) ? 255 : 255 - transp_color.a;
|
pPixels[i].a = isTransparentColor(pPixels[i], transp_color) ? 255 - transp_color.a : 255;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user