San Mehat | a430b2b | 2014-09-23 08:30:51 -0700 | [diff] [blame] | 1 | /** |
| 2 | * @example pnmshow24.c |
| 3 | */ |
| 4 | |
| 5 | #include <stdio.h> |
| 6 | #include <rfb/rfb.h> |
| 7 | #include <rfb/keysym.h> |
| 8 | |
| 9 | #ifndef LIBVNCSERVER_ALLOW24BPP |
| 10 | int main() { |
| 11 | printf("I need the ALLOW24BPP LibVNCServer flag to work\n"); |
| 12 | exit(1); |
| 13 | } |
| 14 | #else |
| 15 | |
| 16 | static void HandleKey(rfbBool down,rfbKeySym key,rfbClientPtr cl) |
| 17 | { |
| 18 | if(down && (key==XK_Escape || key=='q' || key=='Q')) |
| 19 | rfbCloseClient(cl); |
| 20 | } |
| 21 | |
| 22 | int main(int argc,char** argv) |
| 23 | { |
| 24 | FILE* in=stdin; |
| 25 | int j,width,height,paddedWidth; |
| 26 | char buffer[1024]; |
| 27 | rfbScreenInfoPtr rfbScreen; |
| 28 | |
| 29 | if(argc>1) { |
| 30 | in=fopen(argv[1],"rb"); |
| 31 | if(!in) { |
| 32 | printf("Couldn't find file %s.\n",argv[1]); |
| 33 | exit(1); |
| 34 | } |
| 35 | } |
| 36 | |
| 37 | fgets(buffer,1024,in); |
| 38 | if(strncmp(buffer,"P6",2)) { |
| 39 | printf("Not a ppm.\n"); |
| 40 | exit(2); |
| 41 | } |
| 42 | |
| 43 | /* skip comments */ |
| 44 | do { |
| 45 | fgets(buffer,1024,in); |
| 46 | } while(buffer[0]=='#'); |
| 47 | |
| 48 | /* get width & height */ |
| 49 | sscanf(buffer,"%d %d",&width,&height); |
| 50 | rfbLog("Got width %d and height %d.\n",width,height); |
| 51 | fgets(buffer,1024,in); |
| 52 | |
| 53 | /* vncviewers have problems with widths which are no multiple of 4. */ |
| 54 | paddedWidth = width; |
| 55 | |
| 56 | /* if your vncviewer doesn't have problems with a width |
| 57 | which is not a multiple of 4, you can comment this. */ |
| 58 | if(width&3) |
| 59 | paddedWidth+=4-(width&3); |
| 60 | |
| 61 | /* initialize data for vnc server */ |
| 62 | rfbScreen = rfbGetScreen(&argc,argv,paddedWidth,height,8,3,3); |
| 63 | if(!rfbScreen) |
| 64 | return 0; |
| 65 | if(argc>1) |
| 66 | rfbScreen->desktopName = argv[1]; |
| 67 | else |
| 68 | rfbScreen->desktopName = "Picture"; |
| 69 | rfbScreen->alwaysShared = TRUE; |
| 70 | rfbScreen->kbdAddEvent = HandleKey; |
| 71 | |
| 72 | /* enable http */ |
| 73 | rfbScreen->httpDir = "../webclients"; |
| 74 | |
| 75 | /* allocate picture and read it */ |
| 76 | rfbScreen->frameBuffer = (char*)malloc(paddedWidth*3*height); |
| 77 | fread(rfbScreen->frameBuffer,width*3,height,in); |
| 78 | fclose(in); |
| 79 | |
| 80 | /* pad to paddedWidth */ |
| 81 | if(width != paddedWidth) { |
| 82 | int padCount = 3*(paddedWidth - width); |
| 83 | for(j=height-1;j>=0;j--) { |
| 84 | memmove(rfbScreen->frameBuffer+3*paddedWidth*j, |
| 85 | rfbScreen->frameBuffer+3*width*j, |
| 86 | 3*width); |
| 87 | memset(rfbScreen->frameBuffer+3*paddedWidth*(j+1)-padCount, |
| 88 | 0,padCount); |
| 89 | } |
| 90 | } |
| 91 | |
| 92 | /* initialize server */ |
| 93 | rfbInitServer(rfbScreen); |
| 94 | |
| 95 | /* run event loop */ |
| 96 | rfbRunEventLoop(rfbScreen,40000,FALSE); |
| 97 | |
| 98 | return(0); |
| 99 | } |
| 100 | #endif |