You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
2.2 KiB
100 lines
2.2 KiB
/** |
|
* @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
|
|
|