changeset 2005:2ff214f811b4

Implement negative input data skip values for gfxconv -s option. A negative value will start from end of the input.
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 07 Jul 2018 01:12:21 +0300
parents 161e731eb152
children 9f7e9a393771
files tools/gfxconv.c
diffstat 1 files changed, 26 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/tools/gfxconv.c	Sat Jul 07 01:11:22 2018 +0300
+++ b/tools/gfxconv.c	Sat Jul 07 01:12:21 2018 +0300
@@ -103,6 +103,7 @@
         optPlanedWidth = 1,
         optForcedInSubFormat = -1;
 unsigned int optInSkip = 0;
+BOOL    optInSkipNeg = FALSE;
 
 int     optCropMode = CROP_NONE,
         optCropX0, optCropY0,
@@ -653,7 +654,7 @@
             break;
 
         case 4:
-            if (!dmGetIntVal(optArg, &optInSkip, NULL))
+            if (!dmGetIntVal(optArg, &optInSkip, &optInSkipNeg))
             {
                 dmErrorMsg("Invalid skip value argument '%s'.\n", optArg);
                 return FALSE;
@@ -1791,7 +1792,7 @@
     DMConvFormat inFormat, outFormat;
     DMC64Image *inC64Image = NULL, *outC64Image = NULL;
     Uint8 *dataBuf = NULL, *dataBufOrig = NULL;
-    size_t dataSize, dataSizeOrig;
+    size_t dataSize, dataSizeOrig, dataRealOffs;
     int i, n;
 
     // Default color mapping
@@ -1896,8 +1897,28 @@
         goto error;
     }
 
-    dataBuf = dataBufOrig + optInSkip;
-    dataSize = dataSizeOrig - optInSkip;
+    if (optInSkipNeg)
+    {
+        dataBuf = dataBufOrig + dataSizeOrig - optInSkip;
+        dataSize = optInSkip;
+        dataRealOffs = dataSizeOrig - optInSkip;
+
+        dmMsg(1, "Input skip -%d (-%x). Offset %d (%x), size %d (%x).\n",
+            optInSkip, optInSkip,
+            dataRealOffs, dataRealOffs,
+            dataSize, dataSize);
+
+    }
+    else
+    {
+        dataBuf = dataBufOrig + optInSkip;
+        dataSize = dataSizeOrig - optInSkip;
+        dataRealOffs = optInSkip;
+
+        dmMsg(1, "Input skip %d (%x), size %d (%x).\n",
+            optInSkip, optInSkip,
+            dataSize, dataSize);
+    }
 
     // Check for forced input format here
     if (optForcedInSubFormat >= 0)
@@ -1968,7 +1989,7 @@
     {
         case FFMT_SPRITE:
         case FFMT_CHAR:
-            dmDumpSpritesAndChars(dataBuf, dataSize, optInSkip);
+            dmDumpSpritesAndChars(dataBuf, dataSize, dataRealOffs);
             break;
 
         case FFMT_BITMAP: