$height, 'width' => $width);
}
class Media {
var $margins;
var $size;
var $pixels;
var $is_landscape;
/**
* @param Array $size associative array with 'height' and 'width' keys (mm)
* @param Array $margins associative array with 'top', 'bottom', 'left' and 'right' keys (mm)
*/
function Media($size, $margins) {
$this->size = $size;
$this->margins = $margins;
$this->pixels = 800;
}
function ©() {
$new_item =& new Media($this->size, $this->margins);
$new_item->pixels = $this->pixels;
return $new_item;
}
function doInherit() {
}
function get_width() {
return $this->is_landscape ? $this->size['height'] : $this->size['width'] ;
}
function width() {
return $this->get_width();
}
function get_height() {
return $this->height();
}
function height() {
return $this->is_landscape ? $this->size['width'] : $this->size['height'];
}
function real_width() {
return $this->width() - $this->margins['left'] - $this->margins['right'];
}
function real_height() {
return $this->height() - $this->margins['bottom'] - $this->margins['top'];
}
function set_height($height) {
$this->size['height'] = $height;
}
function set_landscape($state) {
$this->is_landscape = (bool)$state;
}
// TODO: validity checking
function set_margins($margins) {
$this->margins = $margins;
}
function set_pixels($pixels) {
$this->pixels = $pixels;
}
function set_width($width) {
$this->size['width'] = $width;
}
// TODO: validity checking
function &predefined($name) {
global $g_predefined_media;
// Let's check if the chosen media defined
if (isset($g_predefined_media[$name])) {
$media =& new Media($g_predefined_media[$name], array('top'=>0, 'bottom'=>0, 'left'=>0, 'right'=>0));
} else {
$media = null;
};
return $media;
}
/**
* Pixels per millimeter
*/
function PPM() {
return $this->pixels / ($this->size['width'] - $this->margins['left'] - $this->margins['right']);
}
function to_bbox() {
return '0 0 '.ceil(mm2pt($this->size['width'])).' '.ceil(mm2pt($this->size['height']));
}
function to_ps_landscape() {
if (!$this->is_landscape) { return "/initpage {} def"; };
return "/initpage {90 rotate 0 pageheight neg translate} def";
}
function to_ps() {
return
// Note that /pagewidth and /pageheight should contain page size on the "client"
// coordinate system for correct rendering, so the will swap place in landscape mode,
// while /width and height set in PageSize should have the real media values, because
// actual coordinate system rotation/offset is done by the /initpage command without
// actually ratating the media.
"/pagewidth {".$this->width()." mm} def\n".
"/pageheight {".$this->height()." mm} def\n".
"/lmargin {{$this->margins['left']} mm} def\n".
"/rmargin {{$this->margins['right']} mm} def\n".
"/tmargin {{$this->margins['top']} mm} def\n".
"/bmargin {{$this->margins['bottom']} mm} def\n".
"/px {pagewidth lmargin sub rmargin sub {$this->pixels} div mul} def\n".
"<< /PageSize [".$this->size['width']." mm ".$this->size['height']." mm] >> setpagedevice\n".
$this->to_ps_landscape();
}
}
?>