summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordscho <dscho>2004-01-21 01:16:49 +0000
committerdscho <dscho>2004-01-21 01:16:49 +0000
commitc4a0223e389e9d570acea8e8ddec6a658ba8c7d4 (patch)
tree5b5b9dba1da1ffdcd6d94245783979c2c7a6a556
parentdede7749226de8d24e6bb775582f3e3243d2e729 (diff)
downloadlibtdevnc-c4a0223e.tar.gz
libtdevnc-c4a0223e.zip
do not send unnecessary updated because of cursor drawing
-rw-r--r--cursor.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/cursor.c b/cursor.c
index 99135f4..4f290da 100644
--- a/cursor.c
+++ b/cursor.c
@@ -419,7 +419,7 @@ void rfbUndrawCursor(rfbScreenInfoPtr s)
s->underCursorBuffer+j*x2*bpp,
x2*bpp);
- rfbMarkRectAsModified(s,x1,y1,x1+x2,y1+y2);
+ /* rfbMarkRectAsModified(s,x1,y1,x1+x2,y1+y2); */
s->cursorIsDrawn = FALSE;
UNLOCK(s->cursorMutex);
}
@@ -430,6 +430,8 @@ void rfbDrawCursor(rfbScreenInfoPtr s)
int i,j,x1,x2,y1,y2,i1,j1,bpp=s->rfbServerFormat.bitsPerPixel/8,
rowstride=s->paddedWidthInBytes,
bufSize,w;
+ rfbBool wasChanged=FALSE;
+
if(!c) return;
LOCK(s->cursorMutex);
if(s->cursorIsDrawn) {
@@ -465,10 +467,15 @@ void rfbDrawCursor(rfbScreenInfoPtr s)
}
/* save data */
- for(j=0;j<y2;j++)
- memcpy(s->underCursorBuffer+j*x2*bpp,
- s->frameBuffer+(y1+j)*rowstride+x1*bpp,
- x2*bpp);
+ for(j=0;j<y2;j++) {
+ char* dest=s->underCursorBuffer+j*x2*bpp;
+ const char* src=s->frameBuffer+(y1+j)*rowstride+x1*bpp;
+ unsigned int count=x2*bpp;
+ if(wasChanged || memcmp(dest,src,count)) {
+ wasChanged=TRUE;
+ memcpy(dest,src,count);
+ }
+ }
if(!c->richSource)
MakeRichCursorFromXCursor(s,c);
@@ -480,8 +487,8 @@ void rfbDrawCursor(rfbScreenInfoPtr s)
memcpy(s->frameBuffer+(j+y1)*rowstride+(i+x1)*bpp,
c->richSource+(j+j1)*c->width*bpp+(i+i1)*bpp,bpp);
-
- rfbMarkRectAsModified(s,x1,y1,x1+x2,y1+y2);
+ if(wasChanged)
+ rfbMarkRectAsModified(s,x1,y1,x1+x2,y1+y2);
s->cursorIsDrawn = TRUE;
UNLOCK(s->cursorMutex);
}