don't chomp line all over
[Printer-EVOLIS.git] / evolis-printer.pl
1 #!/usr/bin/perl
2
3 # Simulate EVOLIS Dualys printer
4
5 use warnings;
6 use strict;
7
8 use Data::Dump qw(dump);
9
10 local $/ = "\r";
11
12 my $page = 1;
13
14 my $name = $ARGV[0] || 'page';
15
16 sub save_pbm;
17
18 while(<>) {
19         die "no escape at beginning",dump($_) unless s/^(\x00*)\x1B//;
20         warn "WARNING: ", length($1), " extra nulls before ESC\n" if $1;
21         my @a = split(/;/,$_);
22         my $c = shift @a;
23         chomp $c;
24         if ( $c eq 'Pmi' ) {
25                 print "$_ mode insertion @a\n";
26         } elsif ( $c eq 'Pc' ) {
27                 print "$_ contrast @a\n";
28         } elsif ( $c eq 'Pl' ) {
29                 print "$_ luminosity @a\n";
30         } elsif ( $c eq 'Ps' ) {
31                 print "$_ speed @a\n";
32         } elsif ( $c eq 'Pr' ) {
33                 print "$_ ribbon $a[0]\n";
34         } elsif ( $c eq 'Ss' ) {
35                 print "$_ sequence start\n";
36         } elsif ( $c eq 'Se' ) {
37                 print "$_ sequence end\n";
38         } elsif ( $c eq 'Sr' ) {
39                 print "$_ sequence recto - card side\n";
40         } elsif ( $c eq 'Sv' ) {
41                 print "$_ sequence verso - back side\n";
42         } elsif ( $c eq 'Db' ) {
43                 my ( $color, $two, $data ) = @a;
44                 print "$c;$color;$two;... bitmap\n";
45                 $two eq '2' or die '2';
46                 my $path = "$name-Db-$color-$page.pbm"; $page++;
47                 save_pbm $path, 648, 1015, $data;       # FIXME 1016?
48         } elsif ( $c eq 'Dbc' ) { # XXX not in cups
49                 my ( $color, $line, $len, $comp ) = @a;
50                 print "$c;$color;$line;$len;... download bitmap compressed\n";
51                 while ( $len > length($comp) ) {
52                         warn "# slurp more ",length($comp), " < $len\n";
53                         $comp .= <>;
54                 }
55                 $len == length $comp or warn "wrong length $len != ", length $comp;
56
57                 die "compression not supported" unless $color =~ m/[ko]/;
58
59                 my $data;
60                 my $i = 0;
61                 while ( $i < length $comp ) {
62                         my $first = substr($comp,$i++,1);
63                         if ( $first eq "\x00" ) {
64                                 $data .= "\x00" x 81;
65                         } elsif ( $first eq "\xFF" ) {
66                                 $data .= "\xFF" x 81;
67                         } else {
68                                 my $len = ord $first;
69                                 $data .= substr($comp,$i,$len);
70                                 my $padding = 81 - $len;
71 warn "# $len $padding\n";
72                                 $data .= "\x00" x $padding;
73                                 $i += $len;
74                         }
75                 }
76
77                 my $path = "$name-Dbc-$color-$page.pbm"; $page++;
78                 save_pbm $path, 648, 1015, $data;
79
80         } else {
81                 print "FIXME: $_\n";
82         }
83 }
84
85 sub save_pbm {
86         my ( $path, $w, $h, $data ) = @_;
87         open(my $pbm, '>', $path);
88         print $pbm "P4\n$w $h\n", $data;
89         close($pbm);
90         print "saved $path $w * $h size ", -s $path, "\n";
91 }