diff --git a/ppd/PPD.pm b/ppd/PPD.pm index 36e179f9ea37473ad253e21bff5c0da45d677ded..f48aba1625391c61ebe6386126f2b9e00a8d8aaa 100644 --- a/ppd/PPD.pm +++ b/ppd/PPD.pm @@ -4,7 +4,7 @@ use strict; use warnings; use Exporter 'import'; -our @EXPORT = qw(define_group define_ui_group declare get set maybe_set option generate); +our @EXPORT = qw(define_group define_ui_group switch_group declare get set maybe_set option gen_values generate); ### PPD data model ### @@ -45,6 +45,7 @@ my %groups = (); my @head_groups = (); my @ui_groups = (); my @nonui_groups = (); +my $current_group_key; sub define_group($$) { my ($key, $g) = @_; @@ -54,6 +55,7 @@ sub define_group($$) { if ($g->{UI}) { push @ui_groups, $key; } elsif ($g->{Head}) { push @head_groups, $key; } else { push @nonui_groups, $key; } + $current_group_key = $key; } sub define_head_group($$) { @@ -68,6 +70,14 @@ sub define_ui_group($$) { define_group($key, $g); } +sub switch_group($) { + my ($key) = @_; + $groups{$key} or die "Group $key does not exist\n"; + my $prev = $current_group_key; + $current_group_key = $key; + return $prev; +} + # declare("group", ["keyword", "type[!]", "value"], ...) sub declare($@) { my $gn = shift @_; @@ -119,12 +129,31 @@ sub option($) { my ($o) = @_; my $key = $o->{Key}; !defined $keywords{$key} or die "Keyword $key already known\n"; - my $g = $groups{$o->{Group}} or die "Keyword $key specified with an unknown group\n"; - $o->{Type} = 'o'; $keywords{$key} = $o; + my $g = $groups{$current_group_key}; + $o->{Group} = $current_group_key; + $o->{Type} = 'o'; push @{$g->{Keywords}}, $o; } +### Auxiliary functions ### + +sub gen_values($@) { + my $template = shift @_; + my @values = (); + while (@_) { + my $v = shift @_; + if (!ref $v) { + $v = { Key => $v }; + } + if (!defined $v->{PS}) { + $v->{PS} = sprintf($template, $v->{Key}); + } + push @values, $v; + } + return \@values; +} + ### Known main keywords ### # Group "f": file description @@ -229,7 +258,7 @@ sub emit_option($) { print "*${jcl}OpenUI *$key/", ($o->{Name} // $o->{Key}), ": ", $o->{Choice}, "\n"; my $pri = $o->{Priority} // 100; my $sec = $o->{Section} // ($jcl ? "JCLSetup" : "AnySetup"); - print '*', ((defined $o->{UI}) ? "" : 'NonUI'), "OrderDependency $pri $sec *$key\n"; + print '*', ((defined $o->{Choice}) ? "" : 'NonUI'), "OrderDependency $pri $sec *$key\n"; } print "*Default$key: ", get_default($o), "\n"; for my $v (@{$o->{Values}}) { diff --git a/ppd/PPD/Paper.pm b/ppd/PPD/Paper.pm index 2112b7bcdd8b9a74662a9c9f97f52f9b16209857..29e11a2265ddb9e2433cbfdd0ee3c17deea2face 100644 --- a/ppd/PPD/Paper.pm +++ b/ppd/PPD/Paper.pm @@ -12,10 +12,29 @@ sub mm($) { # W width in PS points # H height in PS points my %media = ( + 'A0' => { Name => 'A0', W => mm(841), H => mm(1189) }, + 'A1' => { Name => 'A1', W => mm(594), H => mm(841) }, + 'A2' => { Name => 'A2', W => mm(420), H => mm(594) }, 'A3' => { Name => 'A3', W => mm(297), H => mm(420) }, 'A4' => { Name => 'A4', W => mm(210), H => mm(297) }, 'A5' => { Name => 'A5', W => mm(148), H => mm(210) }, 'A6' => { Name => 'A6', W => mm(105), H => mm(148) }, + 'B0' => { Name => 'B0', W => mm(1000), H => mm(1414) }, + 'B1' => { Name => 'B1', W => mm(707), H => mm(1000) }, + 'B2' => { Name => 'B2', W => mm(500), H => mm(707) }, + 'B3' => { Name => 'B3', W => mm(353), H => mm(500) }, + 'B4' => { Name => 'B4', W => mm(250), H => mm(353) }, + 'B5' => { Name => 'B5', W => mm(176), H => mm(250) }, + 'B6' => { Name => 'B6', W => mm(125), H => mm(176) }, + 'C0' => { Name => 'C0', W => mm(917), H => mm(1297) }, + 'C1' => { Name => 'C1', W => mm(648), H => mm(917) }, + 'C2' => { Name => 'C2', W => mm(458), H => mm(648) }, + 'C3' => { Name => 'C3', W => mm(324), H => mm(458) }, + 'C4' => { Name => 'C4', W => mm(229), H => mm(354) }, + 'C5' => { Name => 'C5', W => mm(162), H => mm(229) }, + 'C6' => { Name => 'C6', W => mm(114), H => mm(162) }, + 'C7' => { Name => 'C7', W => mm(81), H => mm(114) }, + 'C8' => { Name => 'C8', W => mm(57), H => mm(81) }, 'Letter' => { Name => 'US Letter', W => 612, H => 792 }, 'Legal' => { Name => 'US Legal', W => 612, H => 1008 }, ); @@ -52,7 +71,6 @@ sub add_papers($) { define_ui_group('Media', { Name => 'Media settings' }); option({ - Group => 'Media', Key => 'PageSize', Name => 'Page Size', Choice => 'PickAny', @@ -70,7 +88,6 @@ sub add_papers($) { }); option({ - Group => 'Media', Key => 'PageRegion', Name => 'Page Region', Choice => 'PickAny', @@ -88,7 +105,6 @@ sub add_papers($) { }); option({ - Group => 'Media', Key => 'ImageableArea', Values => [ map { my $k = $_; @@ -103,7 +119,6 @@ sub add_papers($) { }); option({ - Group => 'Media', Key => 'PaperDimension', Values => [ map { my $k = $_; diff --git a/ppd/gen-hp b/ppd/gen-hp index 7bf8f6897780a257611dcd19858bfd8c6f0a9550..9dd670d4ae453cb63200460a5b9c8450203a6295 100755 --- a/ppd/gen-hp +++ b/ppd/gen-hp @@ -24,7 +24,6 @@ set('cupsProtocol', 'None'); define_ui_group('Basic', { Name => 'Basic options' }); option({ - Group => 'Basic', Key => 'Duplex', Name => '2-Sided Printing', Choice => 'PickOne', @@ -36,7 +35,6 @@ option({ }); option({ - Group => 'Basic', Key => 'Resolution', Name => 'Printer Resolution', Choice => 'PickOne', @@ -50,7 +48,6 @@ option({ }); option({ - Group => 'Basic', Key => 'HPEconoMode', Name => 'EconoMode', Choice => 'Boolean', @@ -61,7 +58,6 @@ option({ }); option({ - Group => 'Basic', Key => 'Smoothing', Name => 'Resolution Enhancement', Choice => 'Boolean', @@ -74,7 +70,6 @@ option({ }); option({ - Group => 'Basic', Key => 'Collate', Choice => 'Boolean', Values => [ @@ -84,6 +79,7 @@ option({ }); PPD::PJL::add_jcl(); + PPD::Paper::add_papers({ MinW => 216, MaxW => 612, MinH => 360, MaxH => 1008, @@ -91,4 +87,39 @@ PPD::Paper::add_papers({ PSPageSize => sub { my ($m) = @_; return sprintf("<< /PageSize [%d %d] >> setpagedevice", $m->{W}, $m->{H}); }, }); +option({ + Key => 'MediaType', + Name => 'Media Type', + Choice => 'PickOne', + Priority => 20, + Values => gen_values("<< /MediaType (%s) >> setpagedevice", + { Key => 'None', PS => '<< /MediaType null >> setpagedevice', Default => 1 }, + "Plain", + "Preprinted", + "Letterhead", + "Transparency", + "Prepunched", + "Labels", + "Bond", + "Recycled", + "Color", + "Rough", + "Card Stock", + "Envelope" + ), +}); + +option({ + Key => 'InputSlot', + Name => 'Input Slot', + Choice => 'PickOne', + Priority => 20, + Values => [ + { Key => 'ManualFeed', Name => 'Tray 1 with manual feed', PS => '<< /ManualFeed true /MediaPosition 3 >> setpagedevice' }, + { Key => 'Tray1', Name => 'Tray 1', PS => '<< /ManualFeed false /MediaPosition 3 >> setpagedevice' }, + { Key => 'Tray2', Name => 'Tray 2', PS => '<< /ManualFeed false /MediaPosition 0 >> setpagedevice' }, + { Key => 'Tray3', Name => 'Tray 3', PS => '<< /ManualFeed false /MediaPosition 1 >> setpagedevice' }, + ], +}); + generate();