diff options
author | dscho <dscho> | 2004-01-21 01:16:49 +0000 |
---|---|---|
committer | dscho <dscho> | 2004-01-21 01:16:49 +0000 |
commit | c4a0223e389e9d570acea8e8ddec6a658ba8c7d4 (patch) | |
tree | 5b5b9dba1da1ffdcd6d94245783979c2c7a6a556 | |
parent | dede7749226de8d24e6bb775582f3e3243d2e729 (diff) | |
download | libtdevnc-c4a0223e.tar.gz libtdevnc-c4a0223e.zip |
do not send unnecessary updated because of cursor drawing
-rw-r--r-- | cursor.c | 21 |
1 files changed, 14 insertions, 7 deletions
@@ -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); } |