getter usage example
[Printer-Zebra.git] / ZPL2pbm.pl
index 8a7c2b7..e54e8fd 100755 (executable)
@@ -13,7 +13,7 @@ while(<DATA>) {
        $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,30 +27,42 @@ 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 = 1;
+               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 .= "1" x $l;
+                               $out .= "F" x $l;
                        } elsif ( $c eq ':' ) {
-                               $out .= length($out) > $w ? substr($out,-$w*2) : "00" x $w;
-                               warn "# $p :\n";
+#                              $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;
                        } elsif ( $c ge 'g' && $c le 'y' ) {
@@ -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);