Listing 2 A sample procedure to call scale_fax_line

   if (!init_fax_scale(x_scale,y_scale,src_bytes_per_line))
      {                               /* initialize scaler */
      printf("Scale values out of range (3%% to 3200%%).\n");
      cleanup();
      exit(EXIT_BAD_SCALE);
      }
   total_lines = 0;
   do      /* main read/scale/write loop */
      {   /* note: we have split the buffer so read_pcx and write_cx stay in lock step */
      if ((src_actual_size = read_pcx(src_scale_buffer,src_max_size)) == IO_ERROR)
         {                               /* read a buffer */
         printf("Error reading source file - %s.\n",src_file);
         cleanup();
         exit(EXIT_READ_ERROR);
         }
      dest_lines = 0;                    /* set up line counters and pointers */
      src_ptr = src_scale_buffer;
      dest_ptr = dest_scale_buffer;
      for (src_lines = src_actual_size/src_bytes_per_line ; src_lines > 0 ; src_lines--)
         {                               /* scale each source line */
         repeat = scale_fax_line(dest_ptr,src_ptr);
         dest_lines += repeat;
         while (repeat--)                /* repeat it if necessary */
            {
            if (repeat)
               memcpy(dest_ptr+dest_bytes_per_line,des_ptr,dest_bytes_per_line);
            dest_ptr += dest_bytes_per_line;
            }
         src_ptr += src_bytes_per_line;  /* move pointers */
         }
      assert(dest_ptr <= src_scale_buffer + SCALE_BUFFER_SIZE);
      assert(src_ptr <= dest_scale_buffer);
      if (write_pcx(dest_scale_buffer,dest_lines*dest_bytes_per_line) == I0_ERROR)
         {                               /* write out destination buffer */
         printf("Cannot write to destination file - %s.\n",dest_file);
         cleanup();
         exit(EXIT_WRITE_ERROR);
         }
      total_lines += dest_lines;
      } while (src_actual_size==src_max_size && total_lines<MAX_FAX_LENGTH);

/* End of File */