changeset 1869:1067df067f28

Improve input/output format probe/forcing and related messages.
author Matti Hamalainen <ccr@tnsp.org>
date Sun, 24 Jun 2018 18:45:33 +0300
parents 4bb3d10328a9
children 1e8f60ce21d1
files tools/gfxconv.c
diffstat 1 files changed, 48 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/tools/gfxconv.c	Sun Jun 24 17:35:32 2018 +0300
+++ b/tools/gfxconv.c	Sun Jun 24 18:45:33 2018 +0300
@@ -27,11 +27,11 @@
 
     FFMT_ASCII,
     FFMT_ANSI,
-    FFMT_IMAGE,
-
+    FFMT_BITMAP,
     FFMT_CHAR,
     FFMT_SPRITE,
-    FFMT_BITMAP,
+
+    FFMT_IMAGE,
 
     FFMT_LAST
 };
@@ -252,16 +252,33 @@
 }
 
 
-int dmGetConvFormat(const int format, const int subformat)
+BOOL dmGetConvFormat(const int format, const int subformat, DMConvFormat *pfmt)
 {
     for (int i = 0; i < nconvFormatList; i++)
     {
         const DMConvFormat *fmt = &convFormatList[i];
         if (fmt->format == format &&
             fmt->subformat == subformat)
-            return i;
+        {
+            memcpy(pfmt, fmt, sizeof(DMConvFormat));
+            return TRUE;
+        }
     }
-    return -1;
+
+    for (int i = 0; i < nconvFormatList; i++)
+    {
+        const DMConvFormat *fmt = &convFormatList[i];
+        if (fmt->format == format && format == FFMT_BITMAP)
+        {
+            const DMConvFormat *fmt = &convFormatList[i];
+            const DMC64ImageFormat *cfmt = &dmC64ImageFormats[subformat];
+            memcpy(pfmt, fmt, sizeof(DMConvFormat));
+            pfmt->fext = cfmt->name;
+            return TRUE;
+        }
+    }
+
+    return FALSE;
 }
 
 
@@ -286,7 +303,6 @@
 }
 
 
-
 BOOL dmGetFormatByExt(const char *fext, int *format, int *subformat)
 {
     if (fext == NULL)
@@ -560,8 +576,20 @@
             break;
 
         case 1:
-            if (!dmParseFormatOption("input", "Input", optArg, &optInFormat, &optForcedInSubFormat))
-                return FALSE;
+            {
+                DMConvFormat fmt;
+
+                if (!dmParseFormatOption("input", "Input", optArg, &optInFormat, &optForcedInSubFormat))
+                    return FALSE;
+
+                dmGetConvFormat(optInFormat, optForcedInSubFormat, &fmt);
+                if ((fmt.flags & DM_FMT_RD) == 0)
+                {
+                    dmErrorMsg("Invalid input format '%s'.\n",
+                        fmt.name);
+                    return FALSE;
+                }
+            }
             break;
 
         case 3:
@@ -1669,6 +1697,7 @@
 {
     FILE *inFile = NULL;
     const DMC64ImageFormat *inC64Fmt = NULL;
+    DMConvFormat inFormat, outFormat;
     DMC64Image *inC64Image = NULL, *outC64Image = NULL;
     Uint8 *dataBuf = NULL, *dataBufOrig = NULL;
     size_t dataSize, dataSizeOrig;
@@ -1755,6 +1784,10 @@
     dataBuf = dataBufOrig + optInSkip;
     dataSize = dataSizeOrig - optInSkip;
 
+    // Check for forced input subformat here
+    if (optForcedInSubFormat >= 0)
+        optInSubFormat = optForcedInSubFormat;
+
     // Perform probing, if required
     if (optInFormat == FFMT_AUTO || optInFormat == FFMT_BITMAP)
     {
@@ -1766,7 +1799,7 @@
         if (optForcedInSubFormat >= 0)
         {
             forced = &dmC64ImageFormats[optForcedInSubFormat];
-            dmMsg(0, "Forced %s format image, type %d, %s\n",
+            dmMsg(0, "Forced '%s' format image, type %d, %s\n",
                 forced->name, forced->format->type, forced->fext);
         }
 
@@ -1798,7 +1831,7 @@
         {
             optInFormat = FFMT_IMAGE;
             optInSubFormat = index;
-            dmMsg(1, "Probed '%s' format image.\n", ifmt->fext);
+            dmMsg(1, "Probed '%s' format image.\n", ifmt->name);
         }
     }
 
@@ -1808,22 +1841,12 @@
         goto error;
     }
 
-    int inFormat = dmGetConvFormat(optInFormat, optInSubFormat),
-        outFormat = dmGetConvFormat(optOutFormat, optOutSubFormat);
-
-    if (inFormat != -1 && outFormat != -1)
+    if (dmGetConvFormat(optInFormat, optInSubFormat, &inFormat) &&
+        dmGetConvFormat(optOutFormat, optOutSubFormat, &outFormat))
     {
-        const char
-             *inFmtName = convFormatList[inFormat].name,
-             *inFmtExt = convFormatList[inFormat].fext,
-             *outFmtName = convFormatList[outFormat].name,
-             *outFmtExt = convFormatList[outFormat].fext;
-
-        if (optInFormat == FFMT_BITMAP)
-            inFmtExt = inC64Fmt->name;
-
         dmMsg(1, "Attempting conversion %s (%s) -> %s (%s)\n",
-            inFmtName, inFmtExt, outFmtName, outFmtExt);
+            inFormat.name, inFormat.fext,
+            outFormat.name, outFormat.fext);
     }
 
     switch (optInFormat)