X-Git-Url: http://git.rot13.org/?p=Printer-Zebra.git;a=blobdiff_plain;f=ZPL2pbm.pl;h=e54e8fd2e10ea469d82d4409c881905f06574386;hp=692fb66344499c05126ce8524fc96c998728e403;hb=974345e63fe26686eaacdcafd4af73564c6fda73;hpb=e3d07b7bcee9e98f7600a9cea357a3a58397f745 diff --git a/ZPL2pbm.pl b/ZPL2pbm.pl index 692fb66..e54e8fd 100755 --- a/ZPL2pbm.pl +++ b/ZPL2pbm.pl @@ -13,7 +13,7 @@ while() { $command->{$cmd} = $desc; } -my $file = shift @ARGV || die "usage: $0 dump.zpl > dump.pbm"; +my $file = shift @ARGV || die "usage: $0 dump.zpl > dump.pbm\n"; open(my $in, '<', $file); @@ -27,29 +27,41 @@ while( $line ) { $line =~ s/[\r\n]+$// && warn "## removed CR/LF\n"; warn "# line ",dump($line),$/ if length($line) < 80 or $ENV{DEBUG}; if ( $line =~ s/~DG(\w+:)?(.+)// ) { - my ( $name, $t,$w ) = split(/,/,$2,4); + my ( $name, $total_bytes, $row_bytes ) = split(/,/,$2,4); - warn "# ~DG$1 => [$name] t=$t w=$w\n"; + warn "# ~DG$1 => [$name] $total_bytes bytes $row_bytes in row\n"; my $data = <$in>; - my $out; + my $w = $row_bytes * 2; # hex digits + + my $out = ''; # ZPL decompress my $repeat = 0; foreach my $p ( 0 .. length($data) - 1 ) { + + if ( length($out) == $total_bytes * 2 ) { + warn "END of bitmap\n"; + $line = substr($data,$p); + slurp_line; + last; + }; + my $c = substr($data,$p,1); + if ( $c eq ',' ) { - my $l = ( $w * 2 ) - length($out) % ( $w * 2 ); - $l = $w * 2 if $l == 0; + my $l = $w - ( length($out) % $w ); + $l = $w if $l == 0; warn "# $p ZERO-to-EOL $c [$l]\n"; $out .= "0" x $l; } elsif ( $c eq '!' ) { - my $l = ( $w * 2 ) - length($out) % ( $w * 2 ); - $l = $w * 2 if $l == 0; + my $l = $w - ( length($out) % $w ); + $l = $w if $l == 0; warn "# $p ONE-to-EOL $c [$l]\n"; $out .= "F" x $l; } elsif ( $c eq ':' ) { - $out .= length($out) > $w ? substr($out,-$w*2) : "00" x $w; +# $out .= length($out) > $w ? substr($out,-$w) : "0" x $w; + $out .= substr($out,-$w); warn "# $p repeat last line\n"; } elsif ( $c eq 'z' ) { $repeat += 400; @@ -67,10 +79,7 @@ while( $line ) { $out .= $c; } } else { - warn "ABORT: offset $p data [$c]"; - $line = $c . substr($data,$p); - slurp_line; - last; + die "ABORT: offset $p data [$c]"; } warn "## $repeat [$c] out = ",length($out),$/; @@ -78,9 +87,9 @@ while( $line ) { my $bitmap = pack('H*', $out); warn "# graphics of ",length($data)," bytes ZPL decompressed to ",length($out)," hex and ", length($bitmap), " bytes bitmap\n"; - my $pw = $w * 8; - my $ph = int(length($bitmap) / $w); - print "P4\n$pw $ph\n", substr($bitmap,0,$ph*$w); + my $pw = $row_bytes * 8; + my $ph = int(length($bitmap) / $row_bytes); + print "P4\n$pw $ph\n", substr($bitmap,0,$ph*$row_bytes); } elsif ( $line =~ s/^([~\^][^~\^\r\n]*)// ) { my $cmd = substr($1,0,3);