Skip to content
Snippets Groups Projects
Select Git revision
  • 7a9a5ef9d1c106884a6d7d4153ac0187e6d8454c
  • master default protected
2 results

main.h

Blame
  • Paper.pm 4.97 KiB
    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 = (
    	'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) },
    	'ISOB0' => { Name => 'B0', W => mm(1000), H => mm(1414) },
    	'ISOB1' => { Name => 'B1', W => mm(707), H => mm(1000) },
    	'ISOB2' => { Name => 'B2', W => mm(500), H => mm(707) },
    	'ISOB3' => { Name => 'B3', W => mm(353), H => mm(500) },
    	'ISOB4' => { Name => 'B4', W => mm(250), H => mm(353) },
    	'ISOB5' => { Name => 'B5', W => mm(176), H => mm(250) },
    	'ISOB6' => { Name => 'B6', W => mm(125), H => mm(176) },
    	'EnvC0' => { Name => 'C0 Envelope', W => mm(917), H => mm(1297) },
    	'EnvC1' => { Name => 'C1 Envelope', W => mm(648), H => mm(917) },
    	'EnvC2' => { Name => 'C2 Envelope', W => mm(458), H => mm(648) },
    	'EnvC3' => { Name => 'C3 Envelope', W => mm(324), H => mm(458) },
    	'EnvC4' => { Name => 'C4 Envelope', W => mm(229), H => mm(324) },
    	'EnvC5' => { Name => 'C5 Envelope', W => mm(162), H => mm(229) },
    	'EnvC6' => { Name => 'C6 Envelope', W => mm(114), H => mm(162) },
    	'EnvC7' => { Name => 'C7 Envelope', W => mm(81), H => mm(114) },
    	'EnvC8' => { Name => 'C8 Envelope', W => mm(57), H => mm(81) },
    	'Letter' => { Name => 'US Letter', W => 612, H => 792 },
    	'Legal' => { Name => 'US Legal', W => 612, H => 1008 },
    );
    
    # 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)
    #	MarginV => pt,		# Vertical margin (default: 0)
    #	DefPaper => paper,	# Default paper type (default: A4)
    #	JCL => 1,		# Paper should be handled via JCL (default: 0)
    #	PSPageSize => PS,	# PS code for setting PageSize (subroutine called with ref to media object)
    #	PSPageRegion => PS,	# The same for PageRegion (default: use PSPageSize)
    #	PSCustomPageSize => PS,	# PS code for setting custom PageSize (default: use setpagedevice)
    # })
    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 $jcl = $o->{JCL} // 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';
    
    	define_ui_group({ Key => 'Media', Name => 'Media settings' });
    
    	option({
    		Key => 'PageSize',
    		Name => 'Page Size',
    		Choice => 'PickOne',
    		Priority => 20,
    		JCL => $jcl,
    		Values => [ map {
    			my $k = $_;
    			my $m = $real_media{$_};
    			{
    				Key => $k,
    				Name => ($m->{Name} // $k),
    				PS => &{$o->{PSPageSize}}($m),
    			}
    		} sort keys %real_media ],
    		Default => $o->{DefPaper},
    		Custom => {
    			PS => $o->{PSCustomPageSize} // 'pop pop pop << /PageSize [5 -2 roll] >> setpagedevice',
    			Params => [
    				{ Key => 'Width', Unit => 'points', Min => $minw, Max => $maxw },
    				{ Key => 'Height', Unit => 'points', Min => $minh, Max => $maxh },
    				{ Key => 'WidthOffset', Unit => 'points', Min => 0, Max => 0 },
    				{ Key => 'HeightOffset', Unit => 'points', Min => 0, Max => 0 },
    				{ Key => 'Orientation', Unit => 'int', Min => 1, Max => 1 },
    			]
    		},
    	});
    
    	option({
    		Key => 'PageRegion',
    		Name => 'Page Region',
    		Choice => 'PickOne',
    		Priority => 21,
    		JCL => $jcl,
    		Values => [ map {
    			my $k = $_;
    			my $m = $real_media{$_};
    			{
    				Key => $k,
    				Name => ($m->{Name} // $k),
    				PS => &{$o->{PSPageRegion} // $o->{PSPageSize}}($m),
    			}
    		} sort keys %real_media ],
    		Default => $o->{DefPaper},
    	});
    
    	option({
    		Key => 'ImageableArea',
    		Values => [ map {
    			my $k = $_;
    			my $m = $real_media{$_};
    			{
    				Key => $k,
    				Name => ($m->{Name} // $k),
    				PS => sprintf("%g %g %g %g", $margh, $margv, $m->{W} - $margh, $m->{H} - $margv),
    			}
    		} sort keys %real_media ],
    		Default => $o->{DefPaper},
    	});
    
    	option({
    		Key => 'PaperDimension',
    		Values => [ map {
    			my $k = $_;
    			my $m = $real_media{$_};
    			{
    				Key => $k,
    				Name => ($m->{Name} // $k),
    				PS => sprintf("%d %d", $m->{W}, $m->{H}),
    			}
    		} sort keys %real_media ],
    		Default => $o->{DefPaper},
    	});
    
    	declare('Media',
    		[ 'LandscapeOrientation',	's',	'Plus90' ],
    		[ 'MaxMediaWidth',		'q',	$maxw ],
    		[ 'MaxMediaHeight',		'q',	$maxh ],
    		[ 'HWMargins',			's',	sprintf("%g %g %g %g", $margh, $margv, $margh, $margv) ],	# left, bottom, right, top
    	);
    
    	option({
    		Key => 'LeadingEdge',
    		Values => [{ Key => 'PreferLong', PS => "", Default => 1 }],
    	});
    }
    
    42;