From 01363340541623887b001c5fa9a5c142e8b04e70 Mon Sep 17 00:00:00 2001 From: Martin Mares <mj@ucw.cz> Date: Thu, 14 Jun 2012 18:24:31 +0200 Subject: [PATCH] PPD: Bits of media setting options --- ppd/PPD/Paper.pm | 92 ++++++++++++++++++++++++++++++++++++++++++++++++ ppd/gen-hp | 4 +++ 2 files changed, 96 insertions(+) create mode 100644 ppd/PPD/Paper.pm diff --git a/ppd/PPD/Paper.pm b/ppd/PPD/Paper.pm new file mode 100644 index 0000000..6e97eab --- /dev/null +++ b/ppd/PPD/Paper.pm @@ -0,0 +1,92 @@ +package PPD::Paper; + +use PPD; + +# Media parameters: +# Name human-readable name +# W width in PS points +# H height in PS points +my %media = ( + 'A3' => { Name => 'A3 (297 x 420 mm)', W => 842, H => 1191 }, + 'A4' => { Name => 'A4 (210 x 297 mm)', W => 595, H => 842 }, + 'A5' => { Name => 'A5 (148 x 210 mm)', W => 419, H => 595 }, +); + +# add_papers({ +# MinW => pt, # Minimum paper width (default: 0) +# MaxW => pt, # Maximum paper width (default: 595) +# MinH => pt, # Minimum paper height (default: 0) +# MaxH => pt, # Maximum paper height (default: 842) +# MarginH => pt, # Horizontal margin (default: 0) +# MarginW => pt, # Vertical margin (default: 0) +# DefPaper => paper, # Default paper type (default: A4) +# PSPageSize => PS, # PS code for setting page size (subroutine called with ref to media object) +# }) +sub add_papers($) { + # Scan available paper formats + my ($o) = @_; + my $minw = $o->{MinW} // 0; + my $maxw = $o->{MaxW} // 595; + my $minh = $o->{MinH} // 0; + my $maxh = $o->{MaxH} // 842; + my $margh = $o->{MarginH} // 0; + my $margv = $o->{MarginV} // 0; + my %real_media = (); + for my $p (keys %media) { + my $m = $media{$p}; + $m->{W} >= $minw && $m->{W} <= $maxw && $m->{H} >= $minh && $m->{H} <= $maxh or next; + $real_media{$p} = $m; + $m->{Key} = $p; + } + $o->{DefPaper} //= 'A4'; + + option({ + Key => 'PageSize', + Name => 'Page Size', + UI => '', + Priority => 30, + Values => [ map { + my $k = $_; + my $m = $real_media{$_}; + { + Key => $k, + Name => ($m->{Name} // $k), + PS => &{$o->{PSPageSize}}($m), + Default => ($k eq $o->{'DefPaper'}), + } + } sort keys %real_media ] + }); + + option({ + Key => 'PageRegion', + Name => 'Page Region', + UI => '', + Priority => 40, + Values => [ map { + my $k = $_; + my $m = $real_media{$_}; + { + Key => $k, + Name => ($m->{Name} // $k), + PS => &{$o->{PSPageSize}}($m), + Default => ($k eq $o->{'DefPaper'}), + } + } sort keys %real_media ] + }); + + option({ + Key => 'ImageableArea', + Values => [ map { + my $k = $_; + my $m = $real_media{$_}; + { + Key => $k, + Name => ($m->{Name} // $k), + PS => sprintf("%.2f %.2f %.2f %.2f", $margh, $margv, $m->{W} - $margh, $m->{H} - $margv), + Default => ($k eq $o->{'DefPaper'}), + } + } sort keys %real_media ] + }); +} + +42; diff --git a/ppd/gen-hp b/ppd/gen-hp index 008ada7..13a6f41 100755 --- a/ppd/gen-hp +++ b/ppd/gen-hp @@ -6,6 +6,7 @@ use warnings; use lib "."; use PPD; use PPD::PJL; +use PPD::Paper; set('f/FileVersion', '1.0'); set('f/PCFileName', 'HP4350.PPD'); @@ -80,5 +81,8 @@ option({ }); PPD::PJL::add_jcl(); +PPD::Paper::add_papers({ + 'PSPageSize' => sub { my ($m) = @_; return sprintf("<< /PageSize [%d %d] >> setpagedevice", $m->{W}, $m->{H}); }, +}); generate(); -- GitLab