OutputDriverGenericPS($image_encoder);
}
function add_link($x, $y, $w, $h, $target) {
$this->write(sprintf("[ /Rect [ %.2f %.2f %.2f %.2f ] /Action << /Subtype /URI /URI (%s) >> /Border [0 0 0] /Subtype /Link /ANN pdfmark\n",
$x, $y, $x+$w, $y-$h, $this->_string($target)));
}
function add_local_link($left, $top, $width, $height, $anchor) {
$this->write(sprintf("[ /Rect [ %.2f %.2f %.2f %.2f ] /Page %d /View [ /XYZ null %.2f null ] /Border [0 0 0] /Subtype /Link /ANN pdfmark\n",
$left, $top, $left + $width, $top - $height, $anchor->page, $anchor->y));
}
function circle($x, $y, $r) {
$this->moveto($x, $y);
$this->write(sprintf("%.2f %.2f %.2f 0 360 arc\n", $x, $y, $r));
}
function clip() {
$this->write("clip newpath\n");
}
function close() {
$this->_terminate_output();
fclose($this->data);
}
function closepath() {
$this->write("closepath\n");
}
function dash($x, $y) {
$this->write(sprintf("[%.2f %.2f] 0 setdash\n", $x, $y));
}
function decoration($underline, $overline, $linethrough) {
$this->underline = $underline;
$this->overline = $overline;
$this->linethrough = $linethrough;
}
function fill() {
$this->write("fill\n");
}
function _findfont($name, $encoding) {
$font =& $this->font_factory->get_type1($name, $encoding);
if (is_null($font)) {
$this->error_message .= $this->font_factory->error_message();
$dummy = null;
return $dummy;
};
if (!isset($this->used_encodings[$encoding])) {
$this->used_encodings[$encoding] = true;
$manager = ManagerEncoding::get();
$this->_write_document_prolog($manager->get_ps_encoding_vector($encoding));
$this->_write_document_prolog("\n");
};
$fontname = $font->name();
if (!isset($this->found_fonts[$fontname])) {
$this->found_fonts[$fontname] = true;
$this->_write_document_prolog("/$fontname /$name $encoding findfont-enc def\n");
};
return $font;
}
// @return 'null' in case of error or ascender fraction of font-size
//
function font_ascender($name, $encoding) {
$font = $this->_findfont($name, $encoding);
if (is_null($font)) { return null; };
return $font->ascender()/1000;
}
// @return 'null' in case of error or ascender fraction of font-size
//
function font_descender($name, $encoding) {
$font = $this->_findfont($name, $encoding);
if (is_null($font)) { return null; };
return -$font->descender()/1000;
}
function get_bottom() {
return $this->bottom + $this->offset;
}
function &get_font_resolver() {
global $g_font_resolver;
return $g_font_resolver;
}
function image($image, $x, $y, $scale) {
$image_encoder = $this->get_image_encoder();
$id = $image_encoder->auto($this, $image, $size_x, $size_y, $tcolor, $image, $mask);
$init = "image-".$id."-init";
$this->moveto($x, $y);
$this->write(sprintf("%.2f %.2f %s %s {%s} %d %d image-create image-show\n",
$size_x * $scale,
$size_y * $scale,
($mask !== "" ? $mask : "/null"),
$image,
$init,
$size_y,
$size_x));
}
function image_scaled($image, $x, $y, $scale_x, $scale_y) {
$image_encoder = $this->get_image_encoder();
$id = $image_encoder->auto($this, $image, $size_x, $size_y, $tcolor, $image, $mask);
$init = "image-".$id."-init";
$this->moveto($x, $y);
$this->write(sprintf("%.2f %.2f %s %s {%s} %d %d image-create image-show\n",
$size_x * $scale_x ,
$size_y * $scale_y,
($mask !== "" ? $mask : "/null"),
$image,
$init,
$size_y,
$size_x));
}
function image_ry($image, $x, $y, $height, $bottom, $ox, $oy, $scale) {
$image_encoder = $this->get_image_encoder();
$id = $image_encoder->auto($this, $image, $size_x, $size_y, $tcolor, $image, $mask);
$init = "image-".$id."-init";
$this->write(sprintf("%.2f %.2f %.2f %.2f %.2f %.2f %.2f %s %s {%s} %d %d image-create image-show-repeat-y\n",
$scale, $oy, $ox, $bottom, $height, $y, $x,
($mask !== "" ? $mask : "/null"),
$image,
$init,
$size_y,
$size_x));
}
function image_rx($image, $x, $y, $width, $right, $ox, $oy, $scale) {
$image_encoder = $this->get_image_encoder();
$id = $image_encoder->auto($this, $image, $size_x, $size_y, $tcolor, $image, $mask);
$init = "image-".$id."-init";
$this->write(sprintf("%.2f %.2f %.2f %.2f %.2f %.2f %.2f %s %s {%s} %d %d image-create image-show-repeat-x\n",
$scale, $oy, $ox, $right, $width, $y, $x,
($mask !== "" ? $mask : "/null"),
$image,
$init,
$size_y,
$size_x));
}
function image_rx_ry($image, $x, $y, $width, $height, $right, $bottom, $ox, $oy, $scale) {
$image_encoder = $this->get_image_encoder();
$id = $image_encoder->auto($this, $image, $size_x, $size_y, $tcolor, $image, $mask);
$init = "image-".$id."-init";
$this->write(sprintf("%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %s %s {%s} %d %d image-create image-show-repeat-xy\n",
$scale, $oy, $ox, $bottom, $right, $height, $width, $y, $x,
($mask !== "" ? $mask : "/null"),
$image,
$init,
$size_y,
$size_x));
}
function lineto($x, $y) {
$data = sprintf("%.2f %.2f lineto\n", $x, $y);
$this->write($data);
}
function moveto($x, $y) {
$data = sprintf("%.2f %.2f moveto\n", $x, $y);
$this->write($data);
}
function next_page($height) {
if ($this->current_page > 0) {
$this->write("showpage\n");
};
$this->offset -= $height - $this->offset_delta;
// Reset the "correction" offset to it normal value
// Note: "correction" offset is an offset value required to avoid page breaking
// in the middle of text boxes
$this->offset_delta = 0;
$this->write(sprintf("%%%%Page: %d %d\n", $this->current_page + 1, $this->current_page + 1));
$this->write("%%BeginPageSetup\n");
$this->write(sprintf("initpage\n"));
$this->write(sprintf("0 %.2f translate\n", -$this->offset));
$this->write("0 0 0 setrgbcolor\n");
$this->write("%%EndPageSetup\n");
parent::next_page($height);
}
function reset(&$media) {
OutputDriverGenericPS::reset($media);
$this->media =& $media;
$this->data = fopen($this->get_filename(), "wb");
// List of fonts names which already had generated findfond PS code
$this->found_fonts = array();
$this->used_encodings = array();
$this->overline = false;
$this->underline = false;
$this->linethrough = false;
// A font class factory
$this->font_factory =& new FontFactory;
$this->_document_body = '';
$this->_document_prolog = '';
$this->status = FASTPS_STATUS_DOCUMENT_INITIALIZED;
}
function restore() {
$this->write("grestore\n");
}
function save() {
$this->write("gsave\n");
}
// @return true normally or null in case of error
//
function setfont($name, $encoding, $size) {
$this->fontsize = $size;
$this->currentfont = $this->_findfont($name, $encoding);
if (is_null($this->currentfont)) { return null; };
$this->write(sprintf("%s %.2f scalefont setfont\n", $this->currentfont->name(), $size));
return true;
}
function setlinewidth($x) {
$data = sprintf("%.2f setlinewidth\n", $x);
$this->write($data);
}
function setrgbcolor($r, $g, $b) {
$data = sprintf("%.2f %.2f %.2f setrgbcolor\n", $r, $g, $b);
$this->write($data);
}
function show_xy($text, $x, $y) {
if (trim($text) !== '') {
$this->moveto($x, $y);
$this->write("(".$this->_string($text).") show\n");
};
$width = Font::points($this->fontsize, $this->currentfont->stringwidth($text));
if ($this->overline) { $this->_show_overline($x, $y, $width, $this->fontsize); };
if ($this->underline) { $this->_show_underline($x, $y, $width, $this->fontsize); };
if ($this->linethrough) { $this->_show_linethrough($x, $y, $width, $this->fontsize); };
}
function stringwidth($string, $name, $encoding, $size) {
$font =& $this->font_factory->get_type1($name, $encoding);
if (is_null($font)) {
$this->error_message .= $this->font_factory->error_message();
$dummy = null;
return $dummy;
};
return Font::points($size, $font->stringwidth($string));
}
function stroke() {
$this->write("stroke\n");
}
function write($string) {
if ($this->status == FASTPS_STATUS_DOCUMENT_INITIALIZED) {
$this->_start_output();
};
$this->_document_body .= $string;
}
function _write_document_prolog($string) {
$this->_document_prolog .= $string;
}
function _show_line($x, $y, $width, $height, $up, $ut) {
$this->setlinewidth($ut);
$this->moveto($x, $y + $up);
$this->lineto($x+$width, $y + $up);
$this->stroke();
}
function _show_underline($x, $y, $width, $height) {
$up = Font::points($this->fontsize, $this->currentfont->underline_position());
$ut = Font::points($this->fontsize, $this->currentfont->underline_thickness());
$this->_show_line($x, $y, $width, $height, $up, $ut);
}
function _show_overline($x, $y, $width, $height) {
$up = Font::points($this->fontsize, $this->currentfont->overline_position());
$ut = Font::points($this->fontsize, $this->currentfont->underline_thickness());
$this->_show_line($x, $y, $width, $height, $up, $ut);
}
function _show_linethrough($x, $y, $width, $height) {
$up = Font::points($this->fontsize, $this->currentfont->linethrough_position());
$ut = Font::points($this->fontsize, $this->currentfont->underline_thickness());
$this->_show_line($x, $y, $width, $height, $up, $ut);
}
function _start_output() {
$this->status = FASTPS_STATUS_OUTPUT_STARTED;
}
function _terminate_output() {
/**
* Prepare the PS file header
* Note that %PS-Adobe-3.0 refers to DSC version, NOT language level
*/
$header = file_get_contents(HTML2PS_DIR.'postscript/fastps.header.ps');
global $g_config;
$header = preg_replace("/##PS2PDF##/",
($g_config['ps2pdf'] && $g_config['transparency_workaround']) ? "/ps2pdf-transparency-hack true def" : "/ps2pdf-transparency-hack false def",$header);
$header = preg_replace("/##TRANSPARENCY##/",($g_config['transparency_workaround']) ? "/no-transparency-output true def" : "/no-transparency-output false def",$header);
$header = preg_replace("/##PAGES##/", $this->expected_pages, $header);
$header = preg_replace("/##BBOX##/", $this->media->to_bbox(), $header);
$header = preg_replace("/##MEDIA##/", $this->media->to_ps(), $header);
$header = preg_replace("/##PROLOG##/", $this->_document_prolog, $header);
fwrite($this->data, $header);
fwrite($this->data, "\n");
fwrite($this->data, $this->_document_body);
$footer = file_get_contents(HTML2PS_DIR.'postscript/fastps.footer.ps');
fwrite($this->data, $footer);
}
function _show_watermark() {
}
/**
* Protected output-specific methods
*/
/**
* Escapes special Postscript symbols '(',')' and '%' inside a text string
*/
function _string($str) {
$str = str_replace("\\", "\\\\", $str);
$str = str_replace(array("(",")","%"), array("\\(","\\)","\\%"), $str);
// Replace characters having 8-bit set with their octal representation
for ($i=0; $i 127) {
$str = substr_replace($str, sprintf("\\%o", ord($str{$i})), $i, 1);
$i += 3;
};
};
return $str;
}
}
?>