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);
+}