00001 #include <rfb/rfb.h>
00002
00003 void rfbFillRect(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2,rfbPixel col)
00004 {
00005 int rowstride = s->paddedWidthInBytes, bpp = s->bitsPerPixel>>3;
00006 int i,j;
00007 char* colour=(char*)&col;
00008
00009 if(!rfbEndianTest)
00010 colour += 4-bpp;
00011 for(j=y1;j<y2;j++)
00012 for(i=x1;i<x2;i++)
00013 memcpy(s->frameBuffer+j*rowstride+i*bpp,colour,bpp);
00014 rfbMarkRectAsModified(s,x1,y1,x2,y2);
00015 }
00016
00017 #define SETPIXEL(x,y) \
00018 memcpy(s->frameBuffer+(y)*rowstride+(x)*bpp,colour,bpp)
00019
00020 void rfbDrawPixel(rfbScreenInfoPtr s,int x,int y,rfbPixel col)
00021 {
00022 int rowstride = s->paddedWidthInBytes, bpp = s->bitsPerPixel>>3;
00023 char* colour=(char*)&col;
00024
00025 if(!rfbEndianTest)
00026 colour += 4-bpp;
00027 SETPIXEL(x,y);
00028 rfbMarkRectAsModified(s,x,y,x+1,y+1);
00029 }
00030
00031 void rfbDrawLine(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2,rfbPixel col)
00032 {
00033 int rowstride = s->paddedWidthInBytes, bpp = s->bitsPerPixel>>3;
00034 int i;
00035 char* colour=(char*)&col;
00036
00037 if(!rfbEndianTest)
00038 colour += 4-bpp;
00039
00040 #define SWAPPOINTS { i=x1; x1=x2; x2=i; i=y1; y1=y2; y2=i; }
00041 if(abs(x1-x2)<abs(y1-y2)) {
00042 if(y1>y2)
00043 SWAPPOINTS
00044 for(i=y1;i<=y2;i++)
00045 SETPIXEL(x1+(i-y1)*(x2-x1)/(y2-y1),i);
00046
00047 if(x2<x1) { i=x1; x1=x2; x2=i; }
00048 rfbMarkRectAsModified(s,x1,y1,x2+1,y2+1);
00049 } else {
00050 if(x1>x2)
00051 SWAPPOINTS
00052 else if(x1==x2) {
00053 rfbDrawPixel(s,x1,y1,col);
00054 return;
00055 }
00056 for(i=x1;i<=x2;i++)
00057 SETPIXEL(i,y1+(i-x1)*(y2-y1)/(x2-x1));
00058 if(y2<y1) { i=y1; y1=y2; y2=i; }
00059 rfbMarkRectAsModified(s,x1,y1,x2+1,y2+1);
00060 }
00061 }