home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
rtsi.com
/
2014.01.www.rtsi.com.tar
/
www.rtsi.com
/
OS9
/
OSK
/
NETWORK
/
netpbm_src.lzh
/
NETPBM
/
PBM
/
pbmtoln03.c
< prev
next >
Wrap
Text File
|
1996-11-18
|
7KB
|
271 lines
/*
From tim@deakin.edu.au Fri May 7 00:18:57 1993
From: Tim Cook <tim@deakin.edu.au>
Date: Fri, 7 May 1993 15:18:34 -0500
X-Mailer: Mail User's Shell (7.2.4 2/2/92)
To: dyson@sunfish.Physics.UIowa.Edu
Subject: Re: DEC LN03+ printer (not postscript) under SunOS (on SS10) ?
Content-Length: 5893
In a message dated 6 May, 9:32, dyson@sunfish.Physics.UIowa.Edu
(Richard L. Dyson) wrote:
> > Just in case anyone is interested, I have a pbmtoln03 utility I wrote
> > when I was mucking about with an LN03+. If you are interested in
> > printing your bitmaps at 300x300dpi, ask me for the source.
>
> I would be interested. We still only have LN03+ printers on our VMS
> machines here...
Ok, here goes. Note that you will need the source from the pbmplus
utilities, because my pbmtoln03 utility uses the library routines that
are a part of pbmplus to read a PBM file (I linked it with libpbm.a).
I have not tested this utility on VMS, but it looks like it should
work.
*/
/* pbmtoln03.c - Converts a PBM bitmap to DEC LN03 SIXEL bitmap
*
* SYNOPSIS
* pbmtoln03 [pbm-file]
*
* OPTIONS
* -l nn Use "nn" as value for left margin (default 0).
* -r nn Use "nn" as value for right margin (default 2400).
* -t nn Use "nn" as value for top margin (default 0).
* -b nn Use "nn" as value for bottom margin (default 3400).
* -f nn Use "nn" as value for form length (default 3400).
*
* Tim Cook, 26 Feb 1992
* changed option parsing to PBM standards - Ingo Wilken, 13 Oct 1993
*/
#include <stdio.h>
#include "pbm.h"
FILE *input ;
#ifndef print
#define print(s) fputs (s, stdout)
#define fprint(f, s) fputs (s, f)
#endif
/* prototypes */
void output_sixel_record ARGS((unsigned char *record, int width));
void convert ARGS((int width, int height, int format));
void output_sixel_record (record, width)
unsigned char *record ;
int width ;
{
int i, j, k ;
unsigned char last_char ;
int start_repeat = 0 ;
int repeated ;
char repeated_str[16] ;
char *p ;
/* Do RLE */
last_char = record[0] ;
j = 0 ;
/* This will make the following loop complete */
record[width] = '\0' ;
for (i = 1 ; i <= width ; i++) {
repeated = i - start_repeat ;
if (record[i] != last_char || repeated >= 32766) {
/* Repeat has ended */
if (repeated > 3) {
/* Do an encoding */
record[j++] = '!' ;
sprintf (repeated_str, "%d", i - start_repeat) ;
for (p = repeated_str ; *p ; p++)
record[j++] = *p ;
record[j++] = last_char ; }
else {
for (k = 0 ; k < repeated ; k++)
record[j++] = last_char ; }
start_repeat = i ;
last_char = record[i] ; }
}
fwrite ((char *) record, j, 1, stdout) ;
putchar ('-') ; /* DECGNL (graphics new-line) */
putchar ('\n') ;
}
void convert (width, height, format)
int width ;
int height ;
int format ;
{
register i ;
unsigned char *sixel ; /* A row of sixels */
int sixel_row ;
bit *row = pbm_allocrow (width) ;
sixel = (unsigned char *) malloc (width + 2) ;
sixel_row = 0 ;
while (height--) {
pbm_readpbmrow (input, row, width, format) ;
switch (sixel_row) {
case 0 :
for (i = 0 ; i < width ; i++)
sixel[i] = row[i] ;
break ;
case 1 :
for (i = 0 ; i < width ; i++)
sixel[i] += row[i] << 1 ;
break ;
case 2 :
for (i = 0 ; i < width ; i++)
sixel[i] += row[i] << 2 ;
break ;
case 3 :
for (i = 0 ; i < width ; i++)
sixel[i] += row[i] << 3 ;
break ;
case 4 :
for (i = 0 ; i < width ; i++)
sixel[i] += row[i] << 4 ;
break ;
case 5 :
for (i = 0 ; i < width ; i++)
sixel[i] += (row[i] << 5) + 077 ;
output_sixel_record (sixel, width) ;
break ; }
if (sixel_row == 5)
sixel_row = 0 ;
else
sixel_row++ ;
}
if (sixel_row > 0) {
/* Incomplete sixel record needs to be output */
for (i = 0 ; i < width ; i++)
sixel[i] += 077 ;
output_sixel_record (sixel, width) ; }
}
int
main (argc, argv)
int argc ;
char **argv ;
{
int argc_copy = argc ;
char **argv_copy = argv ;
int ch ;
int argn;
char *usage = "[-left <nn>] [-right <nn>] [-top <nn>] [-bottom <nn>] [-formlength <nn>] [pbmfile]";
/* Options */
/* These defaults are for a DEC LN03 with A4 paper (2400x3400 pixels) */
char *opt_left_margin = "0";
char *opt_top_margin = opt_left_margin;
char *opt_right_margin = "2400";
char *opt_bottom_margin = "3400";
char *opt_form_length = opt_bottom_margin;
int width, height, format ;
pbm_init (&argc_copy, argv_copy) ;
argn = 1;
while( argn < argc && argv[argn][0] == '-' && argv[argn][1] != '\0' ) {
if( pm_keymatch(argv[argn], "-left", 2) ) {
if( ++argn >= argc )
pm_usage(usage);
opt_left_margin = argv[argn];
}
else
if( pm_keymatch(argv[argn], "-right", 2) ) {
if( ++argn >= argc )
pm_usage(usage);
opt_right_margin = argv[argn];
}
else
if( pm_keymatch(argv[argn], "-top", 2) ) {
if( ++argn >= argc )
pm_usage(usage);
opt_top_margin = argv[argn];
}
else
if( pm_keymatch(argv[argn], "-bottom", 2) ) {
if( ++argn >= argc )
pm_usage(usage);
opt_bottom_margin = argv[argn];
}
else
if( pm_keymatch(argv[argn], "-formlength", 2) ) {
if( ++argn >= argc )
pm_usage(usage);
opt_form_length = argv[argn];
}
else
pm_usage(usage);
++argn;
}
if( argn < argc ) {
input = pm_openr( argv[argn] );
argn++;
}
else
input = stdin;
if( argn != argc )
pm_usage(usage);
/* Initialise pbm file */
pbm_readpbminit (input, &width, &height, &format) ;
#ifdef notdef
fprintf (stderr, "width: %d, height: %d, format: %d\n", width,
height, format) ;
#endif
if (format != PBM_FORMAT && format != RPBM_FORMAT)
pm_error ("input not in PBM format") ;
/*
* In explanation of the sequence below:
* <ESC>[!p DECSTR soft terminal reset
* <ESC>[11h PUM select unit of measurement
* <ESC>[7 I SSU select pixel as size unit
* <ESC>[?52l DECOPM origin is corner of printable area
* <ESC>[%s;%ss DECSLRM left and right margins
* <ESC>[%s;%sr DECSTBM top and bottom margins
* <ESC>[%st DECSLPP form length
* <ESC>P0;0;1q select sixel graphics mode
* "1;1 DECGRA aspect ratio (1:1)
*/
/* Initialise sixel file */
printf (
"\033[!p\033[11h\033[7 I\033[?52l\033[%s;%ss\033[%s;%sr\033[%st\033P0;0;1q\"1;1",
opt_left_margin, opt_right_margin, opt_top_margin, opt_bottom_margin,
opt_form_length);
/* Convert data */
convert (width, height, format) ;
/* Terminate sixel data */
print ("\033\\\n") ;
}