Subversion-Projekte lars-tiefland.php_share

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 1
<?php
2
 
3
require_once(HTML2PS_DIR.'ps.image.encoder.stream.inc.php');
4
 
5
/**
6
 * Deprecated. Big. Slow. Causes /limitcheck Ghostcript error on big images. Use
7
 * another encoder.
8
 * @author Konstantin Bournayev
9
 * @version 1.0
10
 * @updated 24-ÿíâ-2006 21:18:30
11
 */
12
class PSImageEncoderSimple extends PSImageEncoderStream {
13
  function PSImageEncoderSimple() {
14
  }
15
 
16
  function auto($psdata, $src_img, &$size_x, &$size_y, &$tcolor, &$image, &$mask) {
17
    if (imagecolortransparent($src_img) == -1) {
18
      $id = $this->solid($psdata,
19
                         $src_img->get_handle(),
20
                         $size_x,
21
                         $size_y,
22
                         $image->get_handle(),
23
                         $mask);
24
      $tcolor = 0;
25
      return $id;
26
    } else {
27
      $id = $this->transparent($psdata,
28
                               $src_img->get_handle(),
29
                               $size_x,
30
                               $size_y,
31
                               $image->get_handle(),
32
                               $mask);
33
      $tcolor = 1;
34
      return $id;
35
    };
36
  }
37
 
38
  function solid($psdata, $src_img, &$size_x, &$size_y, &$image, &$mask) {
39
    $id = $this->generate_id();
40
 
41
    $size_x      = imagesx($src_img);
42
    $size_y      = imagesy($src_img);
43
    $dest_img    = imagecreatetruecolor($size_x, $size_y);
44
 
45
    imagecopymerge($dest_img, $src_img, 0, 0, 0, 0, $size_x, $size_y, 100);
46
 
47
    $ps_image_data = "";
48
    $ctr = 1; $row = 1;
49
 
50
    for ($y = 0; $y < $size_y; $y++) {
51
      for ($x = 0; $x < $size_x; $x++) {
52
        // Image pixel
53
        $rgb = ImageColorAt($dest_img, $x, $y);
54
        $r = ($rgb >> 16) & 0xFF;
55
        $g = ($rgb >> 8) & 0xFF;
56
        $b = $rgb & 0xFF;
57
        $ps_image_data .= sprintf("\\%03o\\%03o\\%03o",$r,$g,$b);
58
 
59
        // Write image rows
60
        $ctr++;
61
        if ($ctr > MAX_IMAGE_ROW_LEN || ($x + 1 == $size_x)) {
62
          $row_next = ($size_x - $x - 1 + $size_x * ($size_y - $y - 1) == 0) ? 1 : $row+1;
63
          $psdata->write("/row-{$id}-{$row} { /image-{$id}-data { row-{$id}-{$row_next} } def ({$ps_image_data}) } def\n");
64
 
65
          $ps_image_data = "";
66
          $ctr = 1; $row += 1;
67
        };
68
      };
69
    };
70
 
71
    if ($ps_image_data) {
72
      $psdata->write("/row-{$id}-{$row}  { /image-{$id}-data { row-{$id}-1 } def ({$ps_image_data}) } def\n");
73
    };
74
 
75
    $psdata->write("/image-{$id}-data { row-{$id}-1 } def\n");
76
    $psdata->write("/image-{$id}-init { } def\n");
77
 
78
    // return image and mask data references
79
    $image = "{image-{$id}-data}";
80
    $mask  = "";
81
 
82
    return $id;
83
  }
84
 
85
  function transparent($psdata, $src_img, &$size_x, &$size_y, &$image, &$mask) {
86
    $id = $this->generate_id();
87
 
88
    $size_x      = imagesx($src_img);
89
    $size_y      = imagesy($src_img);
90
    $transparent = imagecolortransparent($src_img);
91
    $dest_img    = imagecreatetruecolor($size_x, $size_y);
92
 
93
    imagecopymerge($dest_img, $src_img, 0, 0, 0, 0, $size_x, $size_y, 100);
94
 
95
    $ps_image_data = "";
96
    $ps_mask_data  = 0xff;
97
    $ctr = 1; $row = 1;
98
 
99
    $handler =& CSS::get_handler(CSS_BACKGROUND_COLOR);
100
    $background_color = $handler->get_visible_background_color();
101
 
102
    for ($y = 0; $y < $size_y; $y++) {
103
      for ($x = 0; $x < $size_x; $x++) {
104
        // Image pixel
105
        $rgb = ImageColorAt($dest_img, $x, $y);
106
        $r = ($rgb >> 16) & 0xFF;
107
        $g = ($rgb >> 8) & 0xFF;
108
        $b = $rgb & 0xFF;
109
 
110
        // Mask pixel
111
        if (ImageColorAt($src_img, $x, $y) == $transparent) {
112
          $ps_mask_data = ($ps_mask_data << 1) | 0x1;
113
          // Also, reset the image colors to the visible background to work correctly
114
          // while using 'transparency hack'
115
          $r = $background_color[0];
116
          $g = $background_color[1];
117
          $b = $background_color[2];
118
        } else {
119
          $ps_mask_data = ($ps_mask_data << 1) | 0;
120
        };
121
 
122
        $ps_image_data .= sprintf("\\%03o\\%03o\\%03o",$r,$g,$b);
123
 
124
        // Write mask and image rows
125
        $ctr++;
126
        if ($ctr > MAX_TRANSPARENT_IMAGE_ROW_LEN || ($x + 1 == $size_x)) {
127
          while ($ctr <= 8) {
128
            $ps_mask_data <<= 1;
129
            $ps_mask_data |= 1;
130
            $ctr ++;
131
          };
132
 
133
          $ps_mask_data_str = sprintf("\\%03o",$ps_mask_data & 0xff);
134
 
135
          $row_next = ($size_x - $x - 1 + $size_x * ($size_y - $y - 1) == 0) ? 1 : $row+1;
136
 
137
          $psdata->write("/row-{$id}-{$row} { /image-{$id}-data { row-{$id}-{$row_next} } def ({$ps_image_data}) } def\n");
138
          $psdata->write("/mrow-{$id}-{$row} { /mask-{$id}-data { mrow-{$id}-{$row_next} } def ({$ps_mask_data_str}) } def\n");
139
 
140
          $ps_image_data = "";
141
          $ps_mask_data  = 0xff;
142
          $ctr = 1; $row += 1;
143
        };
144
      };
145
    };
146
 
147
    if ($ps_image_data) {
148
      while ($ctr <= 8) {
149
        $ps_mask_data <<= 1;
150
        $ps_mask_data |= 1;
151
        $ctr ++;
152
      };
153
      $ps_mask_data_str = sprintf("\\%03o",$ps_mask_data & 0xFF);
154
 
155
      $psdata->write("/row-{$id}-{$row} { /image-{$id}-data { row-{$id}-{$row_next} } def ({$ps_image_data}) } def\n");
156
      $psdata->write("/mrow-{$id}-{$row} { /mask-{$id}-data { mrow-{$id}-{$row_next} } def ({$ps_mask_data_str}) } def\n");
157
    };
158
 
159
    $psdata->write("/image-{$id}-data { row-{$id}-1 } def\n");
160
    $psdata->write("/mask-{$id}-data  { mrow-{$id}-1 } def\n");
161
    $psdata->write("/image-{$id}-init { } def\n");
162
 
163
    // return image and mask data references
164
    $image = "{image-{$id}-data}";
165
    $mask  = "{mask-{$id}-data}";
166
 
167
    return $id;
168
  }
169
 
170
  function alpha($psdata, $src_img, &$size_x, &$size_y, &$image, &$mask) {
171
    $id = $this->generate_id();
172
 
173
    $size_x      = imagesx($src_img);
174
    $size_y      = imagesy($src_img);
175
 
176
    $ps_image_data = "";
177
    $ps_mask_data  = 0xff;
178
    $ctr = 1; $row = 1;
179
 
180
    for ($y = 0; $y < $size_y; $y++) {
181
      for ($x = 0; $x < $size_x; $x++) {
182
        // Mask pixel
183
        $colors = imagecolorsforindex($src_img, imagecolorat($src_img, $x, $y));
184
 
185
        $a = $colors['alpha'];
186
        $r = $colors['red'];
187
        $g = $colors['green'];
188
        $b = $colors['blue'];
189
 
190
        $handler =& CSS::get_handler(CSS_BACKGROUND_COLOR);
191
        $bg = $handler->get_visible_background_color();
192
        $r = (int)($r + ($bg[0] - $r)*$a/127);
193
        $g = (int)($g + ($bg[1] - $g)*$a/127);
194
        $b = (int)($b + ($bg[2] - $b)*$a/127);
195
 
196
        $ps_image_data .= sprintf("\\%03o\\%03o\\%03o",$r,$g,$b);
197
 
198
        // Write mask and image rows
199
        $ctr++;
200
        if ($ctr > MAX_IMAGE_ROW_LEN || ($x + 1 == $size_x)) {
201
          $row_next = ($size_x - $x - 1 + $size_x * ($size_y - $y - 1) == 0) ? 1 : $row+1;
202
 
203
          $psdata->write("/row-{$id}-{$row} { /image-{$id}-data { row-{$id}-{$row_next} } def ({$ps_image_data}) } def\n");
204
 
205
          $ps_image_data = "";
206
          $ctr = 1; $row += 1;
207
        };
208
      };
209
    };
210
 
211
    if ($ps_image_data) {
212
      $psdata->write("/row-{$id}-{$row} { /image-{$id}-data { row-{$id}-{$row_next} } def ({$ps_image_data}) } def\n");
213
    };
214
 
215
    $psdata->write("/image-{$id}-data { row-{$id}-1 } def\n");
216
    $psdata->write("/image-{$id}-init { } def\n");
217
 
218
    // return image and mask data references
219
    $image = "{image-{$id}-data}";
220
    $mask  = "";
221
 
222
    return $id;
223
  }
224
 
225
}
226
?>