Cache the calculated color
In desktop area, the next color has high odds to be the same of previous color.
If we cache the value, it can be reused by the next pixel avoiding recalculation.
This optimization can halve the function's processing.
@@ -651,15 +651,26 @@ BOOL freerdp_image_copy(BYTE* pDstData, DWORD DstFormat, UINT32 nDstStep, UINT32
const BYTE* srcLine = &pSrcData[(y + nYSrc) * nSrcStep * srcVMultiplier + srcVOffset];
BYTE* dstLine = &pDstData[(y + nYDst) * nDstStep * dstVMultiplier + dstVOffset];
- for (x = 0; x < nWidth; x++)
+ UINT32 color = ReadColor(&srcLine[nXSrc * srcByte], SrcFormat);
+ UINT32 oldColor = color;
+ UINT32 dstColor = FreeRDPConvertColor(color, SrcFormat, DstFormat, palette);
+ WriteColor(&dstLine[nXDst * dstByte], DstFormat, dstColor);
+ for (x = 1; x < nWidth; x++)
+ {
+ color = ReadColor(&srcLine[(x + nXSrc) * srcByte], SrcFormat);
+ if (color == oldColor)
{
- UINT32 dstColor;
- UINT32 color = ReadColor(&srcLine[(x + nXSrc) * srcByte], SrcFormat);
+ WriteColor(&dstLine[(x + nXDst) * dstByte], DstFormat, dstColor);
+ }
+ else
+ {
+ oldColor = color;
dstColor = FreeRDPConvertColor(color, SrcFormat, DstFormat, palette);
WriteColor(&dstLine[(x + nXDst) * dstByte], DstFormat, dstColor);
}
}
}
+ }
return TRUE;
}
