| /** |
| * @example pnmshow24.c |
| */ |
| |
| #include <stdio.h> |
| #include <rfb/rfb.h> |
| #include <rfb/keysym.h> |
| |
| #ifndef LIBVNCSERVER_ALLOW24BPP |
| int main() { |
| printf("I need the ALLOW24BPP LibVNCServer flag to work\n"); |
| exit(1); |
| } |
| #else |
| |
| static void HandleKey(rfbBool down,rfbKeySym key,rfbClientPtr cl) |
| { |
| if(down && (key==XK_Escape || key=='q' || key=='Q')) |
| rfbCloseClient(cl); |
| } |
| |
| int main(int argc,char** argv) |
| { |
| FILE* in=stdin; |
| int j,width,height,paddedWidth; |
| char buffer[1024]; |
| rfbScreenInfoPtr rfbScreen; |
| |
| if(argc>1) { |
| in=fopen(argv[1],"rb"); |
| if(!in) { |
| printf("Couldn't find file %s.\n",argv[1]); |
| exit(1); |
| } |
| } |
| |
| fgets(buffer,1024,in); |
| if(strncmp(buffer,"P6",2)) { |
| printf("Not a ppm.\n"); |
| exit(2); |
| } |
| |
| /* skip comments */ |
| do { |
| fgets(buffer,1024,in); |
| } while(buffer[0]=='#'); |
| |
| /* get width & height */ |
| sscanf(buffer,"%d %d",&width,&height); |
| rfbLog("Got width %d and height %d.\n",width,height); |
| fgets(buffer,1024,in); |
| |
| /* vncviewers have problems with widths which are no multiple of 4. */ |
| paddedWidth = width; |
| |
| /* if your vncviewer doesn't have problems with a width |
| which is not a multiple of 4, you can comment this. */ |
| if(width&3) |
| paddedWidth+=4-(width&3); |
| |
| /* initialize data for vnc server */ |
| rfbScreen = rfbGetScreen(&argc,argv,paddedWidth,height,8,3,3); |
| if(!rfbScreen) |
| return 0; |
| if(argc>1) |
| rfbScreen->desktopName = argv[1]; |
| else |
| rfbScreen->desktopName = "Picture"; |
| rfbScreen->alwaysShared = TRUE; |
| rfbScreen->kbdAddEvent = HandleKey; |
| |
| /* enable http */ |
| rfbScreen->httpDir = "../webclients"; |
| |
| /* allocate picture and read it */ |
| rfbScreen->frameBuffer = (char*)malloc(paddedWidth*3*height); |
| fread(rfbScreen->frameBuffer,width*3,height,in); |
| fclose(in); |
| |
| /* pad to paddedWidth */ |
| if(width != paddedWidth) { |
| int padCount = 3*(paddedWidth - width); |
| for(j=height-1;j>=0;j--) { |
| memmove(rfbScreen->frameBuffer+3*paddedWidth*j, |
| rfbScreen->frameBuffer+3*width*j, |
| 3*width); |
| memset(rfbScreen->frameBuffer+3*paddedWidth*(j+1)-padCount, |
| 0,padCount); |
| } |
| } |
| |
| /* initialize server */ |
| rfbInitServer(rfbScreen); |
| |
| /* run event loop */ |
| rfbRunEventLoop(rfbScreen,40000,FALSE); |
| |
| return(0); |
| } |
| #endif |