Mercurial > hg > dmlib
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;