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;