Blob Blame History Raw
diff --git a/devices/gdev3852.c b/devices/gdev3852.c
index 2bee8ec..9d99068 100644
--- a/devices/gdev3852.c
+++ b/devices/gdev3852.c
@@ -62,116 +62,117 @@ jetp3852_print_page(gx_device_printer *pdev, FILE *prn_stream)
 #define DATA_SIZE (LINE_SIZE * 8)
 
    unsigned int cnt_2prn;
-        unsigned int count,tempcnt;
-        unsigned char vtp,cntc1,cntc2;
-        int line_size_color_plane;
-
-        byte data[DATA_SIZE];
-        byte plane_data[LINE_SIZE * 3];
-
-        /* Set initial condition for printer */
-        fputs("\033@",prn_stream);
-
-        /* Send each scan line in turn */
-           {	int lnum;
-                int line_size = gdev_mem_bytes_per_scan_line((gx_device *)pdev);
-                int num_blank_lines = 0;
-
-                if (line_size > DATA_SIZE) {
-                  emprintf2(pdev->memory, "invalid resolution and/or width gives line_size = %d, max. is %d\n",
-                            line_size, DATA_SIZE);
-                  return_error(gs_error_rangecheck);
-               }
-                
-                for ( lnum = 0; lnum < pdev->height; lnum++ )
-                   {	byte *end_data = data + line_size;
-                        gdev_prn_copy_scan_lines(pdev, lnum,
-                                                 (byte *)data, line_size);
-                        /* Remove trailing 0s. */
-                        while ( end_data > data && end_data[-1] == 0 )
-                                end_data--;
-                        if ( end_data == data )
-                           {	/* Blank line */
-                                num_blank_lines++;
-                           }
-                        else
-                           {	int i;
-                                byte *odp;
-                                byte *row;
-
-                                /* Pad with 0s to fill out the last */
-                                /* block of 8 bytes. */
-                                memset(end_data, 0, 7);
-
-                                /* Transpose the data to get pixel planes. */
-                                for ( i = 0, odp = plane_data; i < DATA_SIZE;
-                                      i += 8, odp++
-                                    )
-                                 { /* The following is for 16-bit machines */
+   unsigned int count,tempcnt;
+   unsigned char vtp,cntc1,cntc2;
+   int line_size_color_plane;
+
+   byte data[DATA_SIZE];
+   byte plane_data[LINE_SIZE * 3];
+
+   /* Initialise data to zeros, otherwise later on, uninitialised bytes in
+   dp[] can be greater than 7, which breaks spr8[dp[]]. */
+   memset(data, 0x00, DATA_SIZE);
+
+
+   /* Set initial condition for printer */
+   fputs("\033@",prn_stream);
+
+   /* Send each scan line in turn */
+   {	int lnum;
+        int line_size = gdev_mem_bytes_per_scan_line((gx_device *)pdev);
+        int num_blank_lines = 0;
+
+        if (line_size > DATA_SIZE) {
+          emprintf2(pdev->memory, "invalid resolution and/or width gives line_size = %d, max. is %d\n",
+                    line_size, DATA_SIZE);
+          return_error(gs_error_rangecheck);
+       }
+
+        for ( lnum = 0; lnum < pdev->height; lnum++ )
+           {	byte *end_data = data + line_size;
+                gdev_prn_copy_scan_lines(pdev, lnum,
+                                         (byte *)data, line_size);
+                /* Remove trailing 0s. */
+                while ( end_data > data && end_data[-1] == 0 )
+                        end_data--;
+                if ( end_data == data )
+                   {	/* Blank line */
+                        num_blank_lines++;
+                   }
+                else
+                   {	int i;
+                        byte *odp;
+                        byte *row;
+
+                        /* Transpose the data to get pixel planes. */
+                        for ( i = 0, odp = plane_data; i < DATA_SIZE;
+                              i += 8, odp++
+                            )
+                        { /* The following is for 16-bit machines */
 #define spread3(c)\
  { 0, c, c*0x100, c*0x101, c*0x10000L, c*0x10001L, c*0x10100L, c*0x10101L }
-                                   static ulong spr40[8] = spread3(0x40);
-                                   static ulong spr8[8] = spread3(8);
-                                   static ulong spr2[8] = spread3(2);
-                                   register byte *dp = data + i;
-                                   register ulong pword =
-                                     (spr40[dp[0]] << 1) +
-                                     (spr40[dp[1]]) +
-                                     (spr40[dp[2]] >> 1) +
-                                     (spr8[dp[3]] << 1) +
-                                     (spr8[dp[4]]) +
-                                     (spr8[dp[5]] >> 1) +
-                                     (spr2[dp[6]]) +
-                                     (spr2[dp[7]] >> 1);
-                                   odp[0] = (byte)(pword >> 16);
-                                   odp[LINE_SIZE] = (byte)(pword >> 8);
-                                   odp[LINE_SIZE*2] = (byte)(pword);
-                                 }
-                                /* Skip blank lines if any */
-                                if ( num_blank_lines > 0 )
-                                   {
-                                        /* Do "dot skips" */
-                                        while(num_blank_lines > 255)
-                                          {
-                                          fputs("\033e\377",prn_stream);
-                                          num_blank_lines -= 255;
-                                          }
-                                        vtp = num_blank_lines;
-                                        fprintf(prn_stream,"\033e%c",vtp);
-                                        num_blank_lines = 0;
-                                   }
-
-                                /* Transfer raster graphics in the order R, G, B. */
-                                /* Apparently it is stored in B, G, R */
-                                /* Calculate the amount of data to send by what */
-                                /* Ghostscript tells us the scan line_size in (bytes) */
-
-                                count = line_size / 3;
-                                line_size_color_plane = count / 3;
-                           cnt_2prn = line_size_color_plane * 3 + 5;
-                                tempcnt = cnt_2prn;
-                                cntc1 = (tempcnt & 0xFF00) >> 8;
-                                cntc2 = (tempcnt & 0x00FF);
-                                fprintf(prn_stream, "\033[O%c%c\200\037",cntc2,cntc1);
-                                fputc('\000',prn_stream);
+                           static ulong spr40[8] = spread3(0x40);
+                           static ulong spr8[8] = spread3(8);
+                           static ulong spr2[8] = spread3(2);
+                           register byte *dp = data + i;
+                           register ulong pword =
+                             (spr40[dp[0]] << 1) +
+                             (spr40[dp[1]]) +
+                             (spr40[dp[2]] >> 1) +
+                             (spr8[dp[3]] << 1) +
+                             (spr8[dp[4]]) +
+                             (spr8[dp[5]] >> 1) +
+                             (spr2[dp[6]]) +
+                             (spr2[dp[7]] >> 1);
+                           odp[0] = (byte)(pword >> 16);
+                           odp[LINE_SIZE] = (byte)(pword >> 8);
+                           odp[LINE_SIZE*2] = (byte)(pword);
+                        }
+                        /* Skip blank lines if any */
+                        if ( num_blank_lines > 0 )
+                           {
+                                /* Do "dot skips" */
+                                while(num_blank_lines > 255)
+                                  {
+                                  fputs("\033e\377",prn_stream);
+                                  num_blank_lines -= 255;
+                                  }
+                                vtp = num_blank_lines;
+                                fprintf(prn_stream,"\033e%c",vtp);
+                                num_blank_lines = 0;
+                           }
+
+                        /* Transfer raster graphics in the order R, G, B. */
+                        /* Apparently it is stored in B, G, R */
+                        /* Calculate the amount of data to send by what */
+                        /* Ghostscript tells us the scan line_size in (bytes) */
+
+                        count = line_size / 3;
+                        line_size_color_plane = count / 3;
+                        cnt_2prn = line_size_color_plane * 3 + 5;
+                        tempcnt = cnt_2prn;
+                        cntc1 = (tempcnt & 0xFF00) >> 8;
+                        cntc2 = (tempcnt & 0x00FF);
+                        fprintf(prn_stream, "\033[O%c%c\200\037",cntc2,cntc1);
+                        fputc('\000',prn_stream);
                         fputs("\124\124",prn_stream);
 
-                                for ( row = plane_data + LINE_SIZE * 2, i = 0;
-                                      i < 3; row -= LINE_SIZE, i++ )
-                                {	int jj;
-                                   byte ctemp;
-                                   odp = row;
-                                        /* Complement bytes */
-                                        for (jj=0; jj< line_size_color_plane; jj++)
-                                          { ctemp = *odp;
-                                            *odp++ = ~ctemp;
-                                                 }
-                                        fwrite(row, sizeof(byte),
-                                            line_size_color_plane, prn_stream);
-                                        }
-                           }
-                   }
-           }
+                        for ( row = plane_data + LINE_SIZE * 2, i = 0;
+                              i < 3; row -= LINE_SIZE, i++ )
+                        {  int jj;
+                           byte ctemp;
+                           odp = row;
+                              /* Complement bytes */
+                              for (jj=0; jj< line_size_color_plane; jj++)
+                              { ctemp = *odp;
+                                *odp++ = ~ctemp;
+                              }
+                           fwrite(row, sizeof(byte),
+                           line_size_color_plane, prn_stream);
+                        }
+                  }
+            }
+   }
 
         /* eject page */
         fputs("\014", prn_stream);