changeset 2516:5fcc9f7b8ad8

Change dmC64DecodeBMP() probeOffs and dataOffs to ssize_t, and use default values if negative values are provided. Also implement support for load-addressless formats.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 12 May 2020 20:27:00 +0300
parents a40de347fcb0
children 106f4426c729
files tools/64vw.c tools/gfxconv.c tools/lib64gfx.c tools/lib64gfx.h
diffstat 4 files changed, 16 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/tools/64vw.c	Tue May 12 20:06:24 2020 +0300
+++ b/tools/64vw.c	Tue May 12 20:27:00 2020 +0300
@@ -222,7 +222,7 @@
     if (optProbeOnly)
         ret = dmC64ProbeBMP(&tmp, fmt) != DM_PROBE_SCORE_FALSE ? DMERR_OK : DMERR_NOT_SUPPORTED;
     else
-        ret = dmC64DecodeBMP(cimage, &tmp, 0, 2, fmt, forced);
+        ret = dmC64DecodeBMP(cimage, &tmp, -1, -1, fmt, forced);
 
 exit:
     dmFree(dataBuf);
--- a/tools/gfxconv.c	Tue May 12 20:06:24 2020 +0300
+++ b/tools/gfxconv.c	Tue May 12 20:27:00 2020 +0300
@@ -2770,7 +2770,7 @@
 
         res = dmC64DecodeBMP(&inC64Image,
             dmGrowBufConstCreateFrom(&tbuf, dataBuf, dataSize),
-            0, 2, &inC64Fmt, forced);
+            -1, -1, &inC64Fmt, forced);
 
         if (forced == NULL && inC64Fmt != NULL && res == DMERR_OK)
         {
--- a/tools/lib64gfx.c	Tue May 12 20:06:24 2020 +0300
+++ b/tools/lib64gfx.c	Tue May 12 20:27:00 2020 +0300
@@ -1512,7 +1512,7 @@
 
 
 int dmC64DecodeBMP(DMC64Image **img, const DMGrowBuf *buf,
-    const size_t probeOffs, const size_t loadOffs,
+    ssize_t probeOffs, ssize_t dataOffs,
     const DMC64ImageFormat **fmt, const DMC64ImageFormat *forced)
 {
     DMGrowBuf tmp;
@@ -1526,7 +1526,10 @@
     else
     {
         // Nope, perform a generic probe
-        if (probeOffs >= buf->len)
+        if (probeOffs < 0)
+            probeOffs = 0;
+
+        if ((size_t) probeOffs >= buf->len)
             return DMERR_OUT_OF_DATA;
 
         dmGrowBufConstCopyOffs(&tmp, buf, probeOffs);
@@ -1534,9 +1537,6 @@
             return DMERR_NOT_SUPPORTED;
     }
 
-    if (loadOffs >= buf->len)
-        return DMERR_INVALID_ARGS;
-
     if (*fmt == NULL)
         return DMERR_NOT_SUPPORTED;
 
@@ -1548,7 +1548,14 @@
     if ((*img = dmC64ImageAlloc(*fmt)) == NULL)
         return DMERR_MALLOC;
 
-    dmGrowBufConstCopyOffs(&tmp, buf, loadOffs);
+    // If the format has a loading address, adjust buffer
+    if (dataOffs < 0)
+        dataOffs = 2;
+
+    if ((*fmt)->addr >= 0)
+        dmGrowBufConstCopyOffs(&tmp, buf, dataOffs);
+    else
+        dmGrowBufConstCopy(&tmp, buf);
 
     // Decode the bitmap to memory layout
     if ((*fmt)->decode != NULL)
--- a/tools/lib64gfx.h	Tue May 12 20:06:24 2020 +0300
+++ b/tools/lib64gfx.h	Tue May 12 20:27:00 2020 +0300
@@ -424,7 +424,7 @@
 int       dmC64ConvertBMP2Image(DMImage **pdst, const DMC64Image *src, const DMC64ImageConvSpec *spec);
 int       dmC64ConvertImage2BMP(DMC64Image **pdst, const DMImage *src, const DMC64ImageFormat *fmt, const DMC64ImageConvSpec *spec);
 
-int       dmC64DecodeBMP(DMC64Image **img, const DMGrowBuf *buf, const size_t probeOffs, const size_t loadOffs, const DMC64ImageFormat **fmt, const DMC64ImageFormat *forced);
+int       dmC64DecodeBMP(DMC64Image **img, const DMGrowBuf *buf, ssize_t probeOffs, ssize_t dataOffs, const DMC64ImageFormat **fmt, const DMC64ImageFormat *forced);
 int       dmC64EncodeBMP(DMGrowBuf *buf, const DMC64Image *img, const DMC64ImageFormat *fmt);
 
 int       dmGenericRLEAnalyze(const DMGrowBuf *buf, DMCompParams *cfg);