X-Git-Url: http://git.rot13.org/?p=Printer-Zebra.git;a=blobdiff_plain;f=pbm2ZPL.pl;h=2556f26758e3d6200f918a9dbc3c4c56b5d487a2;hp=5c095af110721f7bafdea3297e7ed04a7ef9b798;hb=50d3781a7b8767f85d03c8b29872cdd05ea7be10;hpb=10b7a0774d32e9f960c1262db94d7eece16fd393 diff --git a/pbm2ZPL.pl b/pbm2ZPL.pl index 5c095af..2556f26 100755 --- a/pbm2ZPL.pl +++ b/pbm2ZPL.pl @@ -6,19 +6,53 @@ use Data::Dump qw(dump); # DG compression is documented in ZPL II Programming Guide Volume Two, page 71-72 +my $darkness = $ENV{DARKNESS} || 0; my $compress = $ENV{COMPRESS} || 1; -my $pnm_file = shift @ARGV || die "usage: $0 print.pnm"; +my $pnm_file = shift @ARGV || die "usage: $0 print.pnm > print.zpl\n"; open(my $fh, '<', $pnm_file); -my $p4 = <$fh>; chomp $p4; -die "no P4 header in [$p4] from $pnm_file" unless $p4 eq 'P4'; -my $size = <$fh>; chomp $size; -my $size = <$fh>; chomp $size if $size =~ m/^#/; -my ( $w, $h ) = split(/ /,$size,$2); +my $magic = <$fh>; chomp $magic; +my $size = <$fh>; +while ( $size =~ m/^#/ ) { $size = <$fh> }; # skip comments +chomp $size; +my ( $w, $h ) = split(/ /,$size,2); warn "WARNING: width of $pnm_file not 832 but $w !\n" if $w != 832; -local $/ = undef; -my $bitmap = <$fh>; + +my $bitmap; + +if ( $magic eq 'P4' ) { + local $/ = undef; + $bitmap = <$fh>; +} elsif ( $magic eq 'P6' ) { + my $max_color = <$fh>; chomp $max_color; + + my $trashold = $max_color / 2; + + local $/ = undef; + my $rgb = <$fh>; + + my $mask = 0x80; + my $byte = 0; + + my $o = 0; + while ( $o < length($rgb) ) { + my $px = ord(substr($rgb,$o,1)); $o += 3; + $byte ^= $mask if $px < $trashold; + $mask >>= 1; + if ( ! $mask ) { + $bitmap .= chr($byte); + $byte = 0; + $mask = 0x80; + } + } + + warn dump $bitmap; + +} else { + die "$pnm_file magick $magic not supported\n"; +} + print '^XA'; @@ -32,11 +66,11 @@ print '^PMN'; # print mirror Y/N print '^LH0,0'; # label home x,y print '^JMA'; # dots/mm A = 24/12/8/6 B = 12/6/4/3 print '^PR4,4'; # print,slew,backfeed speed in inch/s 2 .. 12 [default: 2,6,2] -print '^MD13'; # media darkness -30 .. 30 / XiIIIPlus 0..30/0.1 increments +printf '^MD%d', $darkness ; # media darkness -30 .. 30 / XiIIIPlus 0..30/0.1 increments print '^JUS'; # configuration update F = factory default R = recall S = save print '^LRN'; # label reverse Y/N print '^CI0'; # change international font 0..255 -print '^XZ'; +print "^XZ\r\n"; printf "~DG000.GRF,%d,%d,\r\n", $w / 8 * $h, $w / 8; @@ -65,11 +99,12 @@ sub zpl_compress { foreach my $y ( 0 .. $h - 1 ) { my $line = substr( $bitmap, $y * ( $w / 8 ), $w / 8 ); if ( $line eq $last_line ) { - print ":" && warn "# $y repeat previous line\n"; + print ':'; + warn "# $y repeat previous line\n"; } else { my $hex = unpack('H*', $line); if ( $compress ) { -# $last_line = $line; + $last_line = $line; $hex =~ s/0+$/,/ && warn "# $y fill 0 to right\n"; $hex =~ s/F+$/!/i && warn "# $y fill 1 to right\n"; $hex =~ s/((.)\2+)/zpl_compress($1)/egs; @@ -86,9 +121,9 @@ print '^LS0'; # label shift -9999..9999 printf '^FT%d,%d', 0, $h; # field typeset x,y graphic origin is bottom-left print '^XG000.GRF,1,1^FS'; # recall grapmic source/name,magnification_x,magnification_y print '^PQ1,0,1,Y'; # print quantity total,pause/cut,replicates,no_pause -print '^XZ'; +print "^XZ\r\n"; print '^XA'; print '^ID000.GRF^FS'; # object delete -print '^XZ'; +print "^XZ\r\n";