Mercurial > hg > dmlib
diff lib64gfx.c @ 419:936bc27a79d6
Modularize some functions to lib64gfx, fix bitmap -> image conversion,
and implement various cleanups.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sat, 03 Nov 2012 07:53:38 +0200 |
parents | e4b2f689aff6 |
children | 8d15443ce209 |
line wrap: on
line diff
--- a/lib64gfx.c Sat Nov 03 07:52:26 2012 +0200 +++ b/lib64gfx.c Sat Nov 03 07:53:38 2012 +0200 @@ -245,6 +245,8 @@ static BOOL fmtDrazLaceSetLaceType(DMC64Image *img, const struct _DMDecodeOp *op, const Uint8 *buf, const size_t len) { + (void) len; + img->laceType = buf[op->offs] ? DM_C64ILACE_RES : DM_C64ILACE_COLOR; img->laceBank2 = 0; return TRUE; @@ -324,6 +326,9 @@ static BOOL fmtTruePaintSetLaceType(DMC64Image *img, const struct _DMDecodeOp *op, const Uint8 *buf, const size_t len) { + (void) op; + (void) buf; + (void) len; img->laceType = DM_C64ILACE_RES; img->laceBank2 = 1; return TRUE; @@ -428,10 +433,9 @@ const int ndmC64ImageFormats = sizeof(dmC64ImageFormats) / sizeof(dmC64ImageFormats[0]); -int dmC64ProbeGeneric(const Uint8 *buf, const size_t len, - DMC64ImageFormat **pfmt) +int dmC64ProbeGeneric(const Uint8 *buf, const size_t len, DMC64ImageFormat **pfmt) { - int i, scoreMax = 0, scoreIndex = -1; + int i, scoreMax = DM_PROBE_SCORE_FALSE, scoreIndex = -1; for (i = 0; i < ndmC64ImageFormats; i++) { @@ -450,7 +454,7 @@ return scoreMax; } else - return 0; + return DM_PROBE_SCORE_FALSE; } @@ -667,61 +671,99 @@ #define BUF_SIZE_INITIAL (16*1024) -#define BUF_SIZE_GROW (2*1024) +#define BUF_SIZE_GROW (8*1024) -int dmReadDataFile(const char *filename, Uint8 **pbuf, size_t *pbufSize) +int dmReadDataFile(FILE *inFile, const char *filename, Uint8 **pbuf, size_t *pbufSize) { FILE *f; + int res = DMERR_OK; Uint8 *dataBuf = NULL, *dataPtr; - size_t bufSize, readSize, dataSize; + size_t readSize, dataSize, dataRead; - if (filename == NULL) - f = stdin; + if (inFile != NULL) + f = inFile; else - if ((f = fopen(filename, "rb")) == NULL) + if (filename != NULL) { - int err = errno; - dmError("Could not open input file '%s': %d, %s\n", - filename, err, strerror(err)); - return -1; + if ((f = fopen(filename, "rb")) == NULL) + { + dmError("Could not open '%s' for reading.\n", filename); + return DMERR_FOPEN; + } + } + else + { + dmError("NULL filename and stream pointers.\n"); + return DMERR_NULLPTR; } - readSize = bufSize = BUF_SIZE_INITIAL; - if ((dataBuf = dmMalloc(bufSize)) == NULL) + // Allocate initial data buffer + readSize = dataSize = BUF_SIZE_INITIAL; + if ((dataBuf = dmMalloc(dataSize)) == NULL) { - fclose(f); - dmError("Error allocating memory for data, %d bytes.\n", bufSize); - return -4; + dmError("Error allocating memory for data, %d bytes.\n", dataSize); + res = DMERR_MALLOC; + goto error; } dataPtr = dataBuf; - dataSize = 0; + dataRead = 0; + dataPtr += read; + dataRead += read; while (!feof(f) && !ferror(f)) { size_t read = fread(dataPtr, 1, readSize, f); - dataSize += read; - dataPtr += read; - - if (read == readSize && !feof(f)) + if (dataRead >= dataSize) { readSize = BUF_SIZE_GROW; - bufSize += BUF_SIZE_GROW; - if ((dataBuf = dmRealloc(dataBuf, bufSize)) == NULL) + dataSize += BUF_SIZE_GROW; + if ((dataBuf = dmRealloc(dataBuf, dataSize)) == NULL) { - dmError("Error reallocating memory for data, %d bytes.\n", bufSize); - return -4; + dmError("Error reallocating memory for data, %d bytes.\n", dataSize); + res = DMERR_MALLOC; + goto error; } } else break; } - fclose(f); - + *pbufSize = dataRead; *pbuf = dataBuf; - *pbufSize = dataSize; + +error: + if (f != inFile) + fclose(f); - return 0; + return res; } + + +int dmC64DecodeBMP(DMC64Image *img, const Uint8 *buf, const size_t len, + const size_t probeOffs, const size_t loadOffs, + DMC64ImageFormat **fmt, DMC64ImageFormat *forced) +{ + // Check for forced format + if (forced != NULL) + *fmt = forced; + else + { + // Nope, perform a generic probe + if (probeOffs >= len) + return -200; + + if (dmC64ProbeGeneric(buf + probeOffs, len - probeOffs, fmt) == DM_PROBE_SCORE_FALSE) + return -201; + } + + if (loadOffs >= len) + return -203; + + // Decode the bitmap to memory layout + if ((*fmt)->decode != NULL) + return (*fmt)->decode(img, buf + loadOffs, len - loadOffs, *fmt); + else + return dmC64DecodeGenericBMP(img, buf + loadOffs, len - loadOffs, *fmt); +}