draw.c 1.54 KB
Newer Older
1
#include <rfb/rfb.h>
2

3
void rfbFillRect(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2,rfbPixel col)
4 5 6 7 8
{
  int rowstride = s->paddedWidthInBytes, bpp = s->bitsPerPixel>>3;
  int i,j;
  char* colour=(char*)&col;

9
   if(!rfbEndianTest)
10 11 12 13 14 15 16
    colour += 4-bpp;
  for(j=y1;j<y2;j++)
    for(i=x1;i<x2;i++)
      memcpy(s->frameBuffer+j*rowstride+i*bpp,colour,bpp);
  rfbMarkRectAsModified(s,x1,y1,x2,y2);
}

17 18 19
#define SETPIXEL(x,y) \
  memcpy(s->frameBuffer+(y)*rowstride+(x)*bpp,colour,bpp)

20
void rfbDrawPixel(rfbScreenInfoPtr s,int x,int y,rfbPixel col)
21 22 23 24 25 26 27 28 29 30
{
  int rowstride = s->paddedWidthInBytes, bpp = s->bitsPerPixel>>3;
  char* colour=(char*)&col;

  if(!rfbEndianTest)
    colour += 4-bpp;
  SETPIXEL(x,y);
  rfbMarkRectAsModified(s,x,y,x+1,y+1);
}

31
void rfbDrawLine(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2,rfbPixel col)
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
{
  int rowstride = s->paddedWidthInBytes, bpp = s->bitsPerPixel>>3;
  int i;
  char* colour=(char*)&col;

  if(!rfbEndianTest)
    colour += 4-bpp;

#define SWAPPOINTS { i=x1; x1=x2; x2=i; i=y1; y1=y2; y2=i; }
  if(abs(x1-x2)<abs(y1-y2)) {
    if(y1>y2)
      SWAPPOINTS
    for(i=y1;i<=y2;i++)
      SETPIXEL(x1+(i-y1)*(x2-x1)/(y2-y1),i);
    /* TODO: Maybe make this more intelligently? */
    if(x2<x1) { i=x1; x1=x2; x2=i; }
    rfbMarkRectAsModified(s,x1,y1,x2+1,y2+1);
  } else {
    if(x1>x2)
      SWAPPOINTS
    else if(x1==x2) {
      rfbDrawPixel(s,x1,y1,col);
      return;
    }
    for(i=x1;i<=x2;i++)
      SETPIXEL(i,y1+(i-x1)*(y2-y1)/(x2-x1));
    if(y2<y1) { i=y1; y1=y2; y2=i; }
    rfbMarkRectAsModified(s,x1,y1,x2+1,y2+1);
  }
}