# HG changeset patch # User Matti Hamalainen # Date 1526009273 -10800 # Node ID 5c46004dad1577dc19aa702d0c768be53aaf4e1d # Parent acb607e2c350a518b3a67830b544414255931eda Work on the RLE encoding. diff -r acb607e2c350 -r 5c46004dad15 tools/lib64gfx.c --- a/tools/lib64gfx.c Fri May 11 06:26:55 2018 +0300 +++ b/tools/lib64gfx.c Fri May 11 06:27:53 2018 +0300 @@ -346,25 +346,45 @@ } -static BOOL dmEncodeGenericRLESequence(DMGrowBuf *dst, const Uint8 data, const Uint8 count, const Uint8 rleMarker, const int rleType) +static BOOL dmEncodeGenericRLESequence(DMGrowBuf *dst, const Uint8 data, Uint8 count, const Uint8 rleMarker, const Uint8 rleMinCount, const int rleType) { + BOOL copyOnly = FALSE; switch (rleType) { case DM_RLE_MARKER: - // A simple marker byte RLE variant: [Marker] [count] [data] - if (!dmGrowBufPutU8(dst, rleMarker) || - !dmGrowBufPutU8(dst, count) || - !dmGrowBufPutU8(dst, data)) - return FALSE; + if (count >= rleMinCount || data == rleMarker) + { + // A simple marker byte RLE variant: [Marker] [count] [data] + if (!dmGrowBufPutU8(dst, rleMarker) || + !dmGrowBufPutU8(dst, count) || + !dmGrowBufPutU8(dst, data)) + return FALSE; + } + else + copyOnly = TRUE; break; case DM_RLE_MASK: - // Mask marker RLE: usually high bit(s) of byte mark RLE sequence - // and the lower bits contain the count: [Mask + count] [data] - if (!dmGrowBufPutU8(dst, rleMarker | count) || - !dmGrowBufPutU8(dst, data)) + if (count >= rleMinCount || (data & rleMarker) == rleMarker) + { + // Mask marker RLE: usually high bit(s) of byte mark RLE sequence + // and the lower bits contain the count: [Mask + count] [data] + if (!dmGrowBufPutU8(dst, rleMarker | count) || + !dmGrowBufPutU8(dst, data)) + return FALSE; + } + else + copyOnly = TRUE; + break; + } + + if (copyOnly) + { + while (count--) + { + if (!dmGrowBufPutU8(dst, data)) return FALSE; - break; + } } return TRUE; @@ -382,9 +402,9 @@ { Uint8 data = *src++; - if ((count >= rleMinCount && data != prev) || count >= rleMaxCount) + if (data != prev || count >= rleMaxCount) { - if (!dmEncodeGenericRLESequence(dst, prev, count + 1, rleMarker, rleType)) + if (!dmEncodeGenericRLESequence(dst, prev, count, rleMarker, rleMinCount, rleType)) { res = dmError(DMERR_MALLOC, "Could reallocate memory for RLE encoding buffer.\n"); @@ -393,6 +413,8 @@ count = 1; } + else + count++; prev = data; }