Files
luos/thirdparty/html2ps_pdf/ps.image.encoder.simple.inc.php
Paula Quispe 9eb7d6cac2 HOR-2689
2017-08-03 17:00:30 -04:00

216 lines
6.7 KiB
PHP
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
require_once(HTML2PS_DIR.'ps.image.encoder.stream.inc.php');
/**
* Deprecated. Big. Slow. Causes /limitcheck Ghostcript error on big images. Use
* another encoder.
* @author Konstantin Bournayev
* @version 1.0
* @updated 24-mb-2006 21:18:30
*/
class PSImageEncoderSimple extends PSImageEncoderStream {
function PSImageEncoderSimple() {
}
function auto($psdata, $src_img, &$size_x, &$size_y, &$tcolor, &$image, &$mask) {
if (imagecolortransparent($src_img) == -1) {
$id = $this->solid($psdata, $src_img, $size_x, $size_y, $image, $mask);
$tcolor = 0;
return $id;
} else {
$id = $this->transparent($psdata, $src_img, $size_x, $size_y, $image, $mask);
$tcolor = 1;
return $id;
};
}
function solid($psdata, $src_img, &$size_x, &$size_y, &$image, &$mask) {
$id = $this->generate_id();
$size_x = imagesx($src_img);
$size_y = imagesy($src_img);
$dest_img = imagecreatetruecolor($size_x, $size_y);
imagecopymerge($dest_img, $src_img, 0, 0, 0, 0, $size_x, $size_y, 100);
$ps_image_data = "";
$ctr = 1; $row = 1;
for ($y = 0; $y < $size_y; $y++) {
for ($x = 0; $x < $size_x; $x++) {
// Image pixel
$rgb = ImageColorAt($dest_img, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$ps_image_data .= sprintf("\\%03o\\%03o\\%03o",$r,$g,$b);
// Write image rows
$ctr++;
if ($ctr > MAX_IMAGE_ROW_LEN || ($x + 1 == $size_x)) {
$row_next = ($size_x - $x - 1 + $size_x * ($size_y - $y - 1) == 0) ? 1 : $row+1;
$psdata->write("/row-{$id}-{$row} { /image-{$id}-data { row-{$id}-{$row_next} } def ({$ps_image_data}) } def\n");
$ps_image_data = "";
$ctr = 1; $row += 1;
};
};
};
if ($ps_image_data) {
$psdata->write("/row-{$id}-{$row} { /image-{$id}-data { row-{$id}-1 } def ({$ps_image_data}) } def\n");
};
$psdata->write("/image-{$id}-data { row-{$id}-1 } def\n");
$psdata->write("/image-{$id}-init { } def\n");
// return image and mask data references
$image = "{image-{$id}-data}";
$mask = "";
return $id;
}
function transparent($psdata, $src_img, &$size_x, &$size_y, &$image, &$mask) {
$id = $this->generate_id();
$size_x = imagesx($src_img);
$size_y = imagesy($src_img);
$transparent = imagecolortransparent($src_img);
$dest_img = imagecreatetruecolor($size_x, $size_y);
imagecopymerge($dest_img, $src_img, 0, 0, 0, 0, $size_x, $size_y, 100);
$ps_image_data = "";
$ps_mask_data = 0xff;
$ctr = 1; $row = 1;
$handler =& CSS::get_handler(CSS_BACKGROUND_COLOR);
$background_color = $handler->get_visible_background_color();
for ($y = 0; $y < $size_y; $y++) {
for ($x = 0; $x < $size_x; $x++) {
// Image pixel
$rgb = ImageColorAt($dest_img, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
// Mask pixel
if (ImageColorAt($src_img, $x, $y) == $transparent) {
$ps_mask_data = ($ps_mask_data << 1) | 0x1;
// Also, reset the image colors to the visible background to work correctly
// while using 'transparency hack'
$r = $background_color[0];
$g = $background_color[1];
$b = $background_color[2];
} else {
$ps_mask_data = ($ps_mask_data << 1) | 0;
};
$ps_image_data .= sprintf("\\%03o\\%03o\\%03o",$r,$g,$b);
// Write mask and image rows
$ctr++;
if ($ctr > MAX_TRANSPARENT_IMAGE_ROW_LEN || ($x + 1 == $size_x)) {
while ($ctr <= 8) {
$ps_mask_data <<= 1;
$ps_mask_data |= 1;
$ctr ++;
};
$ps_mask_data_str = sprintf("\\%03o",$ps_mask_data & 0xff);
$row_next = ($size_x - $x - 1 + $size_x * ($size_y - $y - 1) == 0) ? 1 : $row+1;
$psdata->write("/row-{$id}-{$row} { /image-{$id}-data { row-{$id}-{$row_next} } def ({$ps_image_data}) } def\n");
$psdata->write("/mrow-{$id}-{$row} { /mask-{$id}-data { mrow-{$id}-{$row_next} } def ({$ps_mask_data_str}) } def\n");
$ps_image_data = "";
$ps_mask_data = 0xff;
$ctr = 1; $row += 1;
};
};
};
if ($ps_image_data) {
while ($ctr <= 8) {
$ps_mask_data <<= 1;
$ps_mask_data |= 1;
$ctr ++;
};
$ps_mask_data_str = sprintf("\\%03o",$ps_mask_data & 0xFF);
$psdata->write("/row-{$id}-{$row} { /image-{$id}-data { row-{$id}-{$row_next} } def ({$ps_image_data}) } def\n");
$psdata->write("/mrow-{$id}-{$row} { /mask-{$id}-data { mrow-{$id}-{$row_next} } def ({$ps_mask_data_str}) } def\n");
};
$psdata->write("/image-{$id}-data { row-{$id}-1 } def\n");
$psdata->write("/mask-{$id}-data { mrow-{$id}-1 } def\n");
$psdata->write("/image-{$id}-init { } def\n");
// return image and mask data references
$image = "{image-{$id}-data}";
$mask = "{mask-{$id}-data}";
return $id;
}
function alpha($psdata, $src_img, &$size_x, &$size_y, &$image, &$mask) {
$id = $this->generate_id();
$size_x = imagesx($src_img);
$size_y = imagesy($src_img);
$ps_image_data = "";
$ps_mask_data = 0xff;
$ctr = 1; $row = 1;
for ($y = 0; $y < $size_y; $y++) {
for ($x = 0; $x < $size_x; $x++) {
// Mask pixel
$colors = imagecolorsforindex($src_img, imagecolorat($src_img, $x, $y));
$a = $colors['alpha'];
$r = $colors['red'];
$g = $colors['green'];
$b = $colors['blue'];
$handler =& CSS::get_handler(CSS_BACKGROUND_COLOR);
$bg = $handler->get_visible_background_color();
$r = (int)($r + ($bg[0] - $r)*$a/127);
$g = (int)($g + ($bg[1] - $g)*$a/127);
$b = (int)($b + ($bg[2] - $b)*$a/127);
$ps_image_data .= sprintf("\\%03o\\%03o\\%03o",$r,$g,$b);
// Write mask and image rows
$ctr++;
if ($ctr > MAX_IMAGE_ROW_LEN || ($x + 1 == $size_x)) {
$row_next = ($size_x - $x - 1 + $size_x * ($size_y - $y - 1) == 0) ? 1 : $row+1;
$psdata->write("/row-{$id}-{$row} { /image-{$id}-data { row-{$id}-{$row_next} } def ({$ps_image_data}) } def\n");
$ps_image_data = "";
$ctr = 1; $row += 1;
};
};
};
if ($ps_image_data) {
$psdata->write("/row-{$id}-{$row} { /image-{$id}-data { row-{$id}-{$row_next} } def ({$ps_image_data}) } def\n");
};
$psdata->write("/image-{$id}-data { row-{$id}-1 } def\n");
$psdata->write("/image-{$id}-init { } def\n");
// return image and mask data references
$image = "{image-{$id}-data}";
$mask = "";
return $id;
}
}
?>