From 8592f0dfecfe795c4c4be608fdbe37ecac4fa47d Mon Sep 17 00:00:00 2001
From: Martin Mares <mj@ucw.cz>
Date: Fri, 15 Jun 2012 10:20:33 +0200
Subject: [PATCH] PPD: A bit more paper handling...

---
 ppd/PPD/Paper.pm | 38 +++++++++++++++++++++++++++++++-------
 ppd/gen-hp       |  5 ++++-
 2 files changed, 35 insertions(+), 8 deletions(-)

diff --git a/ppd/PPD/Paper.pm b/ppd/PPD/Paper.pm
index 6a67900..2112b7b 100644
--- a/ppd/PPD/Paper.pm
+++ b/ppd/PPD/Paper.pm
@@ -2,14 +2,22 @@ package PPD::Paper;
 
 use PPD;
 
+sub mm($) {
+	my ($mm) = @_;
+	return int($mm/25.4*72 + 0.5);
+}
+
 # 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 },
+	'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) },
+	'Letter' => { Name => 'US Letter', W => 612, H => 792 },
+	'Legal' => { Name => 'US Legal', W => 612, H => 1008 },
 );
 
 # add_papers({
@@ -18,9 +26,10 @@ my %media = (
 #	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)
+#	MarginV => 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)
+#	PSPageSize => PS,	# PS code for setting PageSize (subroutine called with ref to media object)
+#	PSPageRegion => PS,	# The same for PageRegion (default: use PSPageSize)
 # })
 sub add_papers($) {
 	# Scan available paper formats
@@ -72,7 +81,7 @@ sub add_papers($) {
 			{
 				Key => $k,
 				Name => ($m->{Name} // $k),
-				PS => &{$o->{PSPageSize}}($m),
+				PS => &{$o->{PSPageRegion} // $o->{PSPageSize}}($m),
 				Default => ($k eq $o->{'DefPaper'}),
 			}
 		} sort keys %real_media ]
@@ -87,7 +96,22 @@ sub add_papers($) {
 			{
 				Key => $k,
 				Name => ($m->{Name} // $k),
-				PS => sprintf("%.2f %.2f %.2f %.2f", $margh, $margv, $m->{W} - $margh, $m->{H} - $margv),
+				PS => sprintf("%d %d %d %d", $margh, $margv, $m->{W} - $margh, $m->{H} - $margv),
+				Default => ($k eq $o->{'DefPaper'}),
+			}
+		} sort keys %real_media ]
+	});
+
+	option({
+		Group => 'Media',
+		Key => 'PaperDimension',
+		Values => [ map {
+			my $k = $_;
+			my $m = $real_media{$_};
+			{
+				Key => $k,
+				Name => ($m->{Name} // $k),
+				PS => sprintf("%d %d", $m->{W}, $m->{H}),
 				Default => ($k eq $o->{'DefPaper'}),
 			}
 		} sort keys %real_media ]
diff --git a/ppd/gen-hp b/ppd/gen-hp
index 9c1f2e3..7bf8f68 100755
--- a/ppd/gen-hp
+++ b/ppd/gen-hp
@@ -85,7 +85,10 @@ option({
 
 PPD::PJL::add_jcl();
 PPD::Paper::add_papers({
-	'PSPageSize' => sub { my ($m) = @_; return sprintf("<< /PageSize [%d %d] >> setpagedevice", $m->{W}, $m->{H}); },
+	MinW => 216, MaxW => 612,
+	MinH => 360, MaxH => 1008,
+	MarginH => 16, MarginV => 16,
+	PSPageSize => sub { my ($m) = @_; return sprintf("<< /PageSize [%d %d] >> setpagedevice", $m->{W}, $m->{H}); },
 });
 
 generate();
-- 
GitLab