if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
return FALSE;
- while (runLength > 0)
+ UNROLL(runLength,
{
DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
DESTNEXTPIXEL(pbDest);
- runLength--;
- }
+ });
}
else
{
if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
return FALSE;
- while (runLength > 0)
+ UNROLL(runLength,
{
DESTREADPIXEL(temp, pbDest - rowDelta);
DESTWRITEPIXEL(pbDest, temp);
DESTNEXTPIXEL(pbDest);
- runLength--;
- }
+ });
}
/* A follow-on background run order will need a foreground pel inserted. */
if (fFirstLine)
{
- while (runLength > 0)
+ UNROLL(runLength,
{
DESTWRITEPIXEL(pbDest, fgPel);
DESTNEXTPIXEL(pbDest);
- runLength--;
- }
+ });
}
else
{
- while (runLength > 0)
+ UNROLL(runLength,
{
DESTREADPIXEL(temp, pbDest - rowDelta);
DESTWRITEPIXEL(pbDest, temp ^ fgPel);
DESTNEXTPIXEL(pbDest);
- runLength--;
- }
+ });
}
break;
if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
return FALSE;
- while (runLength > 0)
+ UNROLL(runLength,
{
DESTWRITEPIXEL(pbDest, pixelA);
DESTNEXTPIXEL(pbDest);
DESTWRITEPIXEL(pbDest, pixelB);
DESTNEXTPIXEL(pbDest);
- runLength--;
- }
-
+ });
break;
/* Handle Color Run Orders. */
if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
return FALSE;
- while (runLength > 0)
+ UNROLL(runLength,
{
DESTWRITEPIXEL(pbDest, pixelA);
DESTNEXTPIXEL(pbDest);
- runLength--;
- }
-
+ });
break;
/* Handle Foreground/Background Image Orders. */
case MEGA_MEGA_COLOR_IMAGE:
runLength = ExtractRunLength(code, pbSrc, &advance);
pbSrc = pbSrc + advance;
-
- if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
- return FALSE;
-
- while (runLength > 0)
+ UNROLL(runLength,
{
SRCREADPIXEL(temp, pbSrc);
SRCNEXTPIXEL(pbSrc);
DESTWRITEPIXEL(pbDest, temp);
DESTNEXTPIXEL(pbDest);
- runLength--;
- }
-
+ });
break;
/* Handle Special Order 1. */
#define TAG FREERDP_TAG("codec")
+#define UNROLL_BODY(_exp, _count) do \
+ { \
+ size_t x; \
+ for (x=0; x<(_count); x++) \
+ { \
+ (_exp); \
+ } \
+ } while (0)
+
+#define UNROLL_MULTIPLE(_condition, _exp, _count) do \
+ { \
+ while ((_condition) >= _count) \
+ { \
+ UNROLL_BODY(_exp, _count); \
+ (_condition) -= _count; \
+ } \
+ } while (FALSE)
+
+#define UNROLL(_condition, _exp) do \
+ { \
+ UNROLL_MULTIPLE(_condition, _exp, 16); \
+ UNROLL_MULTIPLE(_condition, _exp, 4); \
+ UNROLL_MULTIPLE(_condition, _exp, 1); \
+ } while (FALSE)
+
/*
RLE Compressed Bitmap Stream (RLE_BITMAP_STREAM)
http://msdn.microsoft.com/en-us/library/cc240895%28v=prot.10%29.aspx