216 lines
6.7 KiB
PHP
216 lines
6.7 KiB
PHP
|
|
<?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;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
?>
|