diff tools/lib64gfx.c @ 1573:86373ac0861a

Implement another RLE variant, with different ordering of marker, count and data bytes.
author Matti Hamalainen <ccr@tnsp.org>
date Sun, 13 May 2018 09:08:18 +0300
parents 20cd589366d7
children 72f809e6eb3c
line wrap: on
line diff
--- a/tools/lib64gfx.c	Sun May 13 08:23:58 2018 +0300
+++ b/tools/lib64gfx.c	Sun May 13 09:08:18 2018 +0300
@@ -256,7 +256,7 @@
         stats[buf->data[offs]]++;
 
     // According to compression type ..
-    if (rleType == DM_COMP_RLE_MARKER)
+    if (rleType == DM_COMP_RLE_MARKER1 || rleType == DM_COMP_RLE_MARKER2)
     {
         size_t selected = 0,
             smallest = buf->len;
@@ -292,7 +292,8 @@
 
         switch (cfg->type)
         {
-            case DM_COMP_RLE_MARKER:
+            case DM_COMP_RLE_MARKER1:
+            case DM_COMP_RLE_MARKER2:
                 // A simple marker byte RLE variant: [Marker] [count] [data]
                 if (data == cfg->rleMarker)
                 {
@@ -301,8 +302,19 @@
                         res = DMERR_INVALID_DATA;
                         goto err;
                     }
-                    count = *src++;
-                    data = *src++;
+
+                    switch (cfg->type)
+                    {
+                        case DM_COMP_RLE_MARKER1:
+                            count = *src++;
+                            data = *src++;
+                            break;
+
+                        case DM_COMP_RLE_MARKER2:
+                            data = *src++;
+                            count = *src++;
+                            break;
+                    }
                 }
                 break;
 
@@ -356,14 +368,28 @@
 
     switch (cfg->type)
     {
-        case DM_COMP_RLE_MARKER:
+        case DM_COMP_RLE_MARKER1:
+        case DM_COMP_RLE_MARKER2:
             if (count >= cfg->rleMinCount || data == cfg->rleMarker)
             {
                 // A simple marker byte RLE variant: [Marker] [count] [data]
-                if (!dmGrowBufPutU8(dst, cfg->rleMarker) ||
-                    !dmGrowBufPutU8(dst, count) ||
-                    !dmGrowBufPutU8(dst, data))
+                if (!dmGrowBufPutU8(dst, cfg->rleMarker))
                     return FALSE;
+
+                switch (cfg->type)
+                {
+                    case DM_COMP_RLE_MARKER1:
+                        if (!dmGrowBufPutU8(dst, count) ||
+                            !dmGrowBufPutU8(dst, data))
+                            return FALSE;
+                        break;
+
+                    case DM_COMP_RLE_MARKER2:
+                        if (!dmGrowBufPutU8(dst, data) ||
+                            !dmGrowBufPutU8(dst, count))
+                            return FALSE;
+                        break;
+                }
             }
             else
                 copyOnly = TRUE;