Mercurial > hg > dmlib
comparison tools/lib64gfx.c @ 1496:5c46004dad15
Work on the RLE encoding.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Fri, 11 May 2018 06:27:53 +0300 |
parents | 3b220604ae3c |
children | ee01fdec1a7b |
comparison
equal
deleted
inserted
replaced
1495:acb607e2c350 | 1496:5c46004dad15 |
---|---|
344 | 344 |
345 return dmDecodeGenericRLE(dst, src, srcEnd, rleMarker, rleMask1, rleMask2, rleType); | 345 return dmDecodeGenericRLE(dst, src, srcEnd, rleMarker, rleMask1, rleMask2, rleType); |
346 } | 346 } |
347 | 347 |
348 | 348 |
349 static BOOL dmEncodeGenericRLESequence(DMGrowBuf *dst, const Uint8 data, const Uint8 count, const Uint8 rleMarker, const int rleType) | 349 static BOOL dmEncodeGenericRLESequence(DMGrowBuf *dst, const Uint8 data, Uint8 count, const Uint8 rleMarker, const Uint8 rleMinCount, const int rleType) |
350 { | 350 { |
351 BOOL copyOnly = FALSE; | |
351 switch (rleType) | 352 switch (rleType) |
352 { | 353 { |
353 case DM_RLE_MARKER: | 354 case DM_RLE_MARKER: |
354 // A simple marker byte RLE variant: [Marker] [count] [data] | 355 if (count >= rleMinCount || data == rleMarker) |
355 if (!dmGrowBufPutU8(dst, rleMarker) || | 356 { |
356 !dmGrowBufPutU8(dst, count) || | 357 // A simple marker byte RLE variant: [Marker] [count] [data] |
357 !dmGrowBufPutU8(dst, data)) | 358 if (!dmGrowBufPutU8(dst, rleMarker) || |
359 !dmGrowBufPutU8(dst, count) || | |
360 !dmGrowBufPutU8(dst, data)) | |
361 return FALSE; | |
362 } | |
363 else | |
364 copyOnly = TRUE; | |
365 break; | |
366 | |
367 case DM_RLE_MASK: | |
368 if (count >= rleMinCount || (data & rleMarker) == rleMarker) | |
369 { | |
370 // Mask marker RLE: usually high bit(s) of byte mark RLE sequence | |
371 // and the lower bits contain the count: [Mask + count] [data] | |
372 if (!dmGrowBufPutU8(dst, rleMarker | count) || | |
373 !dmGrowBufPutU8(dst, data)) | |
374 return FALSE; | |
375 } | |
376 else | |
377 copyOnly = TRUE; | |
378 break; | |
379 } | |
380 | |
381 if (copyOnly) | |
382 { | |
383 while (count--) | |
384 { | |
385 if (!dmGrowBufPutU8(dst, data)) | |
358 return FALSE; | 386 return FALSE; |
359 break; | 387 } |
360 | |
361 case DM_RLE_MASK: | |
362 // Mask marker RLE: usually high bit(s) of byte mark RLE sequence | |
363 // and the lower bits contain the count: [Mask + count] [data] | |
364 if (!dmGrowBufPutU8(dst, rleMarker | count) || | |
365 !dmGrowBufPutU8(dst, data)) | |
366 return FALSE; | |
367 break; | |
368 } | 388 } |
369 | 389 |
370 return TRUE; | 390 return TRUE; |
371 } | 391 } |
372 | 392 |
380 int count = 0, prev; | 400 int count = 0, prev; |
381 while (src < srcEnd) | 401 while (src < srcEnd) |
382 { | 402 { |
383 Uint8 data = *src++; | 403 Uint8 data = *src++; |
384 | 404 |
385 if ((count >= rleMinCount && data != prev) || count >= rleMaxCount) | 405 if (data != prev || count >= rleMaxCount) |
386 { | 406 { |
387 if (!dmEncodeGenericRLESequence(dst, prev, count + 1, rleMarker, rleType)) | 407 if (!dmEncodeGenericRLESequence(dst, prev, count, rleMarker, rleMinCount, rleType)) |
388 { | 408 { |
389 res = dmError(DMERR_MALLOC, | 409 res = dmError(DMERR_MALLOC, |
390 "Could reallocate memory for RLE encoding buffer.\n"); | 410 "Could reallocate memory for RLE encoding buffer.\n"); |
391 goto err; | 411 goto err; |
392 } | 412 } |
393 | 413 |
394 count = 1; | 414 count = 1; |
395 } | 415 } |
416 else | |
417 count++; | |
396 | 418 |
397 prev = data; | 419 prev = data; |
398 } | 420 } |
399 | 421 |
400 res = DMERR_OK; | 422 res = DMERR_OK; |