1 #include <rfb/rfb.h>
2
rfbFillRect(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2,rfbPixel col)3 void rfbFillRect(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2,rfbPixel col)
4 {
5 int rowstride = s->paddedWidthInBytes, bpp = s->bitsPerPixel>>3;
6 int i,j;
7 char* colour=(char*)&col;
8
9 if(!rfbEndianTest)
10 colour += 4-bpp;
11 for(j=y1;j<y2;j++)
12 for(i=x1;i<x2;i++)
13 memcpy(s->frameBuffer+j*rowstride+i*bpp,colour,bpp);
14 rfbMarkRectAsModified(s,x1,y1,x2,y2);
15 }
16
17 #define SETPIXEL(x,y) \
18 memcpy(s->frameBuffer+(y)*rowstride+(x)*bpp,colour,bpp)
19
rfbDrawPixel(rfbScreenInfoPtr s,int x,int y,rfbPixel col)20 void rfbDrawPixel(rfbScreenInfoPtr s,int x,int y,rfbPixel col)
21 {
22 int rowstride = s->paddedWidthInBytes, bpp = s->bitsPerPixel>>3;
23 char* colour=(char*)&col;
24
25 if(!rfbEndianTest)
26 colour += 4-bpp;
27 SETPIXEL(x,y);
28 rfbMarkRectAsModified(s,x,y,x+1,y+1);
29 }
30
rfbDrawLine(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2,rfbPixel col)31 void rfbDrawLine(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2,rfbPixel col)
32 {
33 int rowstride = s->paddedWidthInBytes, bpp = s->bitsPerPixel>>3;
34 int i;
35 char* colour=(char*)&col;
36
37 if(!rfbEndianTest)
38 colour += 4-bpp;
39
40 #define SWAPPOINTS { i=x1; x1=x2; x2=i; i=y1; y1=y2; y2=i; }
41 if(abs(x1-x2)<abs(y1-y2)) {
42 if(y1>y2)
43 SWAPPOINTS
44 for(i=y1;i<=y2;i++)
45 SETPIXEL(x1+(i-y1)*(x2-x1)/(y2-y1),i);
46 /* TODO: Maybe make this more intelligently? */
47 if(x2<x1) { i=x1; x1=x2; x2=i; }
48 rfbMarkRectAsModified(s,x1,y1,x2+1,y2+1);
49 } else {
50 if(x1>x2)
51 SWAPPOINTS
52 else if(x1==x2) {
53 rfbDrawPixel(s,x1,y1,col);
54 return;
55 }
56 for(i=x1;i<=x2;i++)
57 SETPIXEL(i,y1+(i-x1)*(y2-y1)/(x2-x1));
58 if(y2<y1) { i=y1; y1=y2; y2=i; }
59 rfbMarkRectAsModified(s,x1,y1,x2+1,y2+1);
60 }
61 }
62