summaryrefslogtreecommitdiffstats
path: root/xrdp
diff options
context:
space:
mode:
authorJay Sorg <jay.sorg@gmail.com>2013-08-19 10:48:38 -0700
committerJay Sorg <jay.sorg@gmail.com>2013-08-19 10:48:38 -0700
commit4a66be133f4e2dad7246baeb020f64dda4ce2d8c (patch)
tree998fd0acb750f927a7edcc51f237c4e55336b0e0 /xrdp
parentf17692adaacc234f90db845e295946b5a68e511a (diff)
downloadxrdp-proprietary-4a66be133f4e2dad7246baeb020f64dda4ce2d8c.tar.gz
xrdp-proprietary-4a66be133f4e2dad7246baeb020f64dda4ce2d8c.zip
CRC optimize
Diffstat (limited to 'xrdp')
-rw-r--r--xrdp/xrdp_bitmap.c57
-rw-r--r--xrdp/xrdp_cache.c13
2 files changed, 64 insertions, 6 deletions
diff --git a/xrdp/xrdp_bitmap.c b/xrdp/xrdp_bitmap.c
index 19620c40..b3faea41 100644
--- a/xrdp/xrdp_bitmap.c
+++ b/xrdp/xrdp_bitmap.c
@@ -821,6 +821,8 @@ xrdp_bitmap_copy_box_with_crc(struct xrdp_bitmap *self,
unsigned char *d8 = (unsigned char *)NULL;
unsigned short *s16 = (unsigned short *)NULL;
unsigned short *d16 = (unsigned short *)NULL;
+ unsigned int *s32;
+ unsigned int *d32;
if (self == 0)
{
@@ -864,16 +866,65 @@ xrdp_bitmap_copy_box_with_crc(struct xrdp_bitmap *self,
if (self->bpp == 24)
{
+ s32 = ((unsigned int *)(self->data)) + (self->width * y + x);
+ d32 = ((unsigned int *)(dest->data)) + (dest->width * desty + destx);
+ incs = self->width - cx;
+ incd = dest->width - cx;
+
for (i = 0; i < cy; i++)
{
- for (j = 0; j < cx; j++)
+ j = 0;
+ while (j < cx - 4)
{
- pixel = GETPIXEL32(self->data, j + x, i + y, self->width);
+ pixel = *s32;
CRC_PASS(pixel, crc);
CRC_PASS(pixel >> 8, crc);
CRC_PASS(pixel >> 16, crc);
- SETPIXEL32(dest->data, j + destx, i + desty, dest->width, pixel);
+ *d32 = pixel;
+ s32++;
+ d32++;
+
+ pixel = *s32;
+ CRC_PASS(pixel, crc);
+ CRC_PASS(pixel >> 8, crc);
+ CRC_PASS(pixel >> 16, crc);
+ *d32 = pixel;
+ s32++;
+ d32++;
+
+ pixel = *s32;
+ CRC_PASS(pixel, crc);
+ CRC_PASS(pixel >> 8, crc);
+ CRC_PASS(pixel >> 16, crc);
+ *d32 = pixel;
+ s32++;
+ d32++;
+
+ pixel = *s32;
+ CRC_PASS(pixel, crc);
+ CRC_PASS(pixel >> 8, crc);
+ CRC_PASS(pixel >> 16, crc);
+ *d32 = pixel;
+ s32++;
+ d32++;
+
+ j += 4;
}
+ while (j < cx)
+ {
+ pixel = *s32;
+ CRC_PASS(pixel, crc);
+ CRC_PASS(pixel >> 8, crc);
+ CRC_PASS(pixel >> 16, crc);
+ *d32 = pixel;
+ s32++;
+ d32++;
+
+ j += 1;
+ }
+
+ s32 += incs;
+ d32 += incd;
}
}
else if (self->bpp == 15 || self->bpp == 16)
diff --git a/xrdp/xrdp_cache.c b/xrdp/xrdp_cache.c
index cac7f114..52022546 100644
--- a/xrdp/xrdp_cache.c
+++ b/xrdp/xrdp_cache.c
@@ -136,6 +136,10 @@ xrdp_cache_reset(struct xrdp_cache *self,
return 0;
}
+#define COMPARE_WITH_CRC(_b1, _b2) \
+ _b1 != 0 && _b2 != 0 && _b1->crc == _b2->crc && _b1->bpp == _b2->bpp && \
+ _b1->width == _b1->width && _b1->height == _b2->height
+
/*****************************************************************************/
/* returns cache id */
int APP_CC
@@ -171,7 +175,8 @@ xrdp_cache_add_bitmap(struct xrdp_cache *self, struct xrdp_bitmap *bitmap,
{
#ifdef USE_CRC
- if (xrdp_bitmap_compare_with_crc(self->bitmap_items[i][j].bitmap, bitmap))
+ //if (xrdp_bitmap_compare_with_crc(self->bitmap_items[i][j].bitmap, bitmap))
+ if (COMPARE_WITH_CRC(self->bitmap_items[i][j].bitmap, bitmap))
#else
if (xrdp_bitmap_compare(self->bitmap_items[i][j].bitmap, bitmap))
#endif
@@ -191,7 +196,8 @@ xrdp_cache_add_bitmap(struct xrdp_cache *self, struct xrdp_bitmap *bitmap,
{
#ifdef USE_CRC
- if (xrdp_bitmap_compare_with_crc(self->bitmap_items[i][j].bitmap, bitmap))
+ //if (xrdp_bitmap_compare_with_crc(self->bitmap_items[i][j].bitmap, bitmap))
+ if (COMPARE_WITH_CRC(self->bitmap_items[i][j].bitmap, bitmap))
#else
if (xrdp_bitmap_compare(self->bitmap_items[i][j].bitmap, bitmap))
#endif
@@ -211,7 +217,8 @@ xrdp_cache_add_bitmap(struct xrdp_cache *self, struct xrdp_bitmap *bitmap,
{
#ifdef USE_CRC
- if (xrdp_bitmap_compare_with_crc(self->bitmap_items[i][j].bitmap, bitmap))
+ //if (xrdp_bitmap_compare_with_crc(self->bitmap_items[i][j].bitmap, bitmap))
+ if (COMPARE_WITH_CRC(self->bitmap_items[i][j].bitmap, bitmap))
#else
if (xrdp_bitmap_compare(self->bitmap_items[i][j].bitmap, bitmap))
#endif