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