diff --git a/progs/demos/osdemo16.c b/progs/demos/osdemo16.c
index 6f89262..10ed695 100644
--- a/progs/demos/osdemo16.c
+++ b/progs/demos/osdemo16.c
@@ -4,7 +4,7 @@
  *
  * Compile with something like this:
  *
- * gcc osdemo16.c -I../include -L../lib -lOSMesa16 -lm -o osdemo16
+ * gcc osdemo16.c -I../../include -L../../lib -lglut -lGLU -lOSMesa16 -lm -o osdemo16
  */
 
 
@@ -178,6 +178,7 @@
       for (y=height-1; y>=0; y--) {
          for (x=0; x<width; x++) {
             i = (y*width + x) * 4;
+            /* just write 8 high bits */
             fputc(ptr[i+2] >> 8, f); /* write blue */
             fputc(ptr[i+1] >> 8, f); /* write green */
             fputc(ptr[i] >> 8, f);   /* write red */
@@ -188,13 +189,13 @@
 
 
 static void
-write_ppm(const char *filename, const GLubyte *buffer, int width, int height)
+write_ppm(const char *filename, const GLushort *buffer, int width, int height)
 {
    const int binary = 0;
    FILE *f = fopen( filename, "w" );
    if (f) {
       int i, x, y;
-      const GLubyte *ptr = buffer;
+      const GLushort *ptr = buffer;
       if (binary) {
          fprintf(f,"P6\n");
          fprintf(f,"# ppm-file created by osdemo.c\n");
@@ -205,9 +206,10 @@
          for (y=height-1; y>=0; y--) {
             for (x=0; x<width; x++) {
                i = (y*width + x) * 4;
-               fputc(ptr[i], f);   /* write red */
-               fputc(ptr[i+1], f); /* write green */
-               fputc(ptr[i+2], f); /* write blue */
+               /* just write 8 high bits */
+               fputc(ptr[i] >> 8, f);   /* write red */
+               fputc(ptr[i+1] >> 8, f); /* write green */
+               fputc(ptr[i+2] >> 8, f); /* write blue */
             }
          }
       }
@@ -221,7 +223,8 @@
          for (y=height-1; y>=0; y--) {
             for (x=0; x<width; x++) {
                i = (y*width + x) * 4;
-               fprintf(f, " %3d %3d %3d", ptr[i], ptr[i+1], ptr[i+2]);
+               /* just write 8 high bits */
+               fprintf(f, " %3d %3d %3d", ptr[i] >> 8, ptr[i+1] >> 8, ptr[i+2] >> 8);
                counter++;
                if (counter % 5 == 0)
                   fprintf(f, "\n");
@@ -236,7 +239,7 @@
 
 int main( int argc, char *argv[] )
 {
-   void *buffer;
+   GLushort *buffer;
 
    /* Create an RGBA-mode context */
 #if OSMESA_MAJOR_VERSION * 100 + OSMESA_MINOR_VERSION >= 305
@@ -251,7 +254,7 @@
    }
 
    /* Allocate the image buffer */
-   buffer = malloc( WIDTH * HEIGHT * 4 * sizeof(GLushort));
+   buffer = (GLushort *) malloc( WIDTH * HEIGHT * 4 * sizeof(GLushort));
    if (!buffer) {
       printf("Alloc image buffer failed!\n");
       return 0;
diff --git a/progs/demos/osdemo32.c b/progs/demos/osdemo32.c
index b425a56..7295b46 100644
--- a/progs/demos/osdemo32.c
+++ b/progs/demos/osdemo32.c
@@ -4,7 +4,7 @@
  *
  * Compile with something like this:
  *
- * gcc osdemo32.c -I../include -L../lib -lOSMesa32 -lm -o osdemo32
+ * gcc osdemo32.c -I../../include -L../../lib -lglut -lGLU -lOSMesa32 -lm -o osdemo32
  */
 
 
@@ -194,13 +194,13 @@
 
 
 static void
-write_ppm(const char *filename, const GLubyte *buffer, int width, int height)
+write_ppm(const char *filename, const GLfloat *buffer, int width, int height)
 {
    const int binary = 0;
    FILE *f = fopen( filename, "w" );
    if (f) {
       int i, x, y;
-      const GLubyte *ptr = buffer;
+      const GLfloat *ptr = buffer;
       if (binary) {
          fprintf(f,"P6\n");
          fprintf(f,"# ppm-file created by osdemo.c\n");
@@ -210,10 +210,17 @@
          f = fopen( filename, "ab" );  /* reopen in binary append mode */
          for (y=height-1; y>=0; y--) {
             for (x=0; x<width; x++) {
+               int r, g, b;
                i = (y*width + x) * 4;
-               fputc(ptr[i], f);   /* write red */
-               fputc(ptr[i+1], f); /* write green */
-               fputc(ptr[i+2], f); /* write blue */
+               r = (int) (ptr[i+0] * 255.0);
+               g = (int) (ptr[i+1] * 255.0);
+               b = (int) (ptr[i+2] * 255.0);
+               if (r > 255) r = 255;
+               if (g > 255) g = 255;
+               if (b > 255) b = 255;
+               fputc(r, f);   /* write red */
+               fputc(g, f); /* write green */
+               fputc(b, f); /* write blue */
             }
          }
       }
@@ -226,8 +233,15 @@
          fprintf(f,"255\n");
          for (y=height-1; y>=0; y--) {
             for (x=0; x<width; x++) {
+               int r, g, b;
                i = (y*width + x) * 4;
-               fprintf(f, " %3d %3d %3d", ptr[i], ptr[i+1], ptr[i+2]);
+               r = (int) (ptr[i+0] * 255.0);
+               g = (int) (ptr[i+1] * 255.0);
+               b = (int) (ptr[i+2] * 255.0);
+               if (r > 255) r = 255;
+               if (g > 255) g = 255;
+               if (b > 255) b = 255;
+               fprintf(f, " %3d %3d %3d", r, g, b);
                counter++;
                if (counter % 5 == 0)
                   fprintf(f, "\n");
@@ -242,7 +256,7 @@
 
 int main( int argc, char *argv[] )
 {
-   void *buffer;
+   GLfloat *buffer;
 
    /* Create an RGBA-mode context */
 #if OSMESA_MAJOR_VERSION * 100 + OSMESA_MINOR_VERSION >= 305
@@ -257,7 +271,7 @@
    }
 
    /* Allocate the image buffer */
-   buffer = malloc( WIDTH * HEIGHT * 4 * sizeof(GLfloat));
+   buffer = (GLfloat *) malloc( WIDTH * HEIGHT * 4 * sizeof(GLfloat));
    if (!buffer) {
       printf("Alloc image buffer failed!\n");
       return 0;
