From d6082b694129df97fcbe027d30655d2f0225fdca Mon Sep 17 00:00:00 2001
From: dscho <dscho>
Date: Wed, 26 Sep 2001 10:34:56 +0000
Subject: adapted pnmshow to aligned width

---
 TODO      |  3 ++-
 main.c    |  3 +++
 pnmshow.c | 23 ++++++++++++++---------
 3 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/TODO b/TODO
index ac0dcd5..bbe0b22 100644
--- a/TODO
+++ b/TODO
@@ -1,8 +1,8 @@
 immediate:
 ----------
 
-fix bug with odd width (depends on client depth: width has to be multiple of server.bytesPerPixel/client.bytesPerPixel). only raw!!
 fix bug in http (java) client with big endian server: byte swapping is broken
+cursor "smears" sometimes when not using cursor encoding
 
 in the works:
 -------------
@@ -28,4 +28,5 @@ done:
 .httpd
 .other encodings
 .test drawing of cursors when not using xcursor or rich cursor encoding
+fix bug with odd width (depends on client depth: width has to be multiple of server.bytesPerPixel/client.bytesPerPixel). only raw!! -> bug of vncviewer!
 
diff --git a/main.c b/main.c
index cb33583..e0efb8f 100644
--- a/main.c
+++ b/main.c
@@ -345,6 +345,9 @@ rfbScreenInfoPtr rfbDefaultScreenInit(int argc,char** argv,int width,int height,
    rfbScreenInfoPtr rfbScreen=malloc(sizeof(rfbScreenInfo));
    rfbPixelFormat* format=&rfbScreen->rfbServerFormat;
 
+   if(width&3)
+     fprintf(stderr,"WARNING: Width (%d) is not a multiple of 4. VncViewer has problems with that.\n",width);
+
    rfbScreen->rfbPort=5900;
    rfbScreen->socketInitDone=FALSE;
    rfbScreen->inetdSock=-1;
diff --git a/pnmshow.c b/pnmshow.c
index 7c13d93..15644e7 100644
--- a/pnmshow.c
+++ b/pnmshow.c
@@ -11,7 +11,7 @@ void HandleKey(Bool down,KeySym key,rfbClientPtr cl)
 int main(int argc,char** argv)
 {
   FILE* in=stdin;
-  int i,width,height;
+  int i,j,k,width,height,paddedWidth;
   unsigned char buffer[1024];
   rfbScreenInfoPtr rfbScreen;
 
@@ -36,9 +36,14 @@ int main(int argc,char** argv)
 
   /* get width & height */
   sscanf(buffer,"%d %d",&width,&height);
-  fprintf(stderr,"Got width %d and height %d (%s).\n",width,height,buffer);
+  fprintf(stderr,"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(width&3)
+    paddedWidth+=4-(width&3);
+
   /* initialize data for vnc server */
   rfbScreen = rfbDefaultScreenInit(argc,argv,width,height,8,3,4);
   if(argc>1)
@@ -52,16 +57,16 @@ int main(int argc,char** argv)
   rfbScreen->httpDir = "./classes";
 
   /* allocate picture and read it */
-  rfbScreen->frameBuffer = (char*)malloc(width*height*4);
+  rfbScreen->frameBuffer = (char*)calloc(paddedWidth*4,height);
   fread(rfbScreen->frameBuffer,width*3,height,in);
   fclose(in);
 
-  /* correct the format to 4 bytes instead of 3 */
-  for(i=width*height-1;i>=0;i--) {
-    rfbScreen->frameBuffer[i*4+2]=rfbScreen->frameBuffer[i*3+2];
-    rfbScreen->frameBuffer[i*4+1]=rfbScreen->frameBuffer[i*3+1];
-    rfbScreen->frameBuffer[i*4+0]=rfbScreen->frameBuffer[i*3+0];
-  }
+  /* correct the format to 4 bytes instead of 3 (and pad to paddedWidth) */
+  for(j=height-1;j>=0;j--)
+    for(i=width-1;i>=0;i--)
+      for(k=2;k>=0;k--)
+	rfbScreen->frameBuffer[(j*paddedWidth+i)*4+k]=
+	  rfbScreen->frameBuffer[(j*width+i)*3+k];
 
   /* run event loop */
   runEventLoop(rfbScreen,40000,FALSE);
-- 
cgit v1.2.3

