source: subversion/sites/other/freemap-npe/Painter.php @ 3986

Last change on this file since 3986 was 1540, checked in by nick, 14 years ago

Freemap-NPE: initial version

File size: 7.1 KB
Line 
1<?php
2
3// dashes in gd
4require_once('defines.php');
5
6class Painter 
7{
8
9}
10
11class GDPainter extends Painter
12{
13        var $colours, $im, $backcol;
14
15        function GDPainter()
16        {
17
18        }
19
20        function createImage($w,$h,$r,$g,$b)
21        {
22                $this->im = ImageCreateTrueColor($w,$h);
23                $this->backcol =  ImageColorAllocate($this->im,$r,$g,$b);
24                ImageFill($this->im,$w/2,$h/2,$this->backcol);
25                ImageColorTransparent($this->im,$this->backcol);
26                return $this->backcol;
27        }
28
29        function getColour($r, $g, $b)
30        {
31                return ImageColorAllocate($this->im,$r,$g,$b);
32        }
33
34        function drawText($x,$y,$fontsize,$text, $colour)
35        {
36                ImageTTFText($this->im, $fontsize, 0, $x, $y,
37                                                                $colour, 
38                                                        TRUETYPE_FONT, $text);
39        }
40
41        function drawImage($x,$y,$imgfile, $format)
42        {
43                $imgsize=getimagesize($imgfile);
44                $w = $imgsize[0];
45                $h = $imgsize[1];
46                if($format=="jpeg")
47                        $img = ImageCreateFromJPEG($imgfile);
48                else
49                        $img = ImageCreateFromPNG($imgfile);
50                ImageCopy($this->im,$img, $x, $y, 0, 0, $w, $h);
51                ImageDestroy($img);
52        }
53
54        function drawLine($x1,$y1,$x2,$y2,$colour,$thickness)
55        {
56                ImageSetThickness($this->im, $thickness);
57                ImageLine($this->im,$x1,$y1,$x2,$y2, $colour);
58        }
59
60        function drawPolygon ($p, $colour)
61        {
62                ImageFilledPolygon($this->im,$p,count($p)/2,$colour);
63        }
64
65        // $dash is the dash pattern in the XML e.g. 2,2
66        function drawDashedLine($x1,$y1,$x2,$y2,$dash, $colour, $thickness)
67        {
68                $dashpattern = $this->makeDashPattern($dash,$colour);
69                ImageSetThickness($this->im, $thickness);
70                ImageSetStyle($this->im,  $dashpattern);
71                ImageLine($this->im,$x1,$y1,$x2,$y2,IMG_COLOR_STYLED);
72        }
73
74        function makeDashPattern($dash, $colour)
75        {
76                if($dash && $colour)
77                {
78                        list($on,$off)=explode(",",$dash);
79                        $dashpattern=array();
80                        for($count2=0; $count2<$on; $count2++)
81                                $dashpattern[$count2] = $colour;
82                        for($count2=0; $count2<$off;$count2++)
83                                $dashpattern[$on+$count2] = IMG_COLOR_TRANSPARENT;
84                        return $dashpattern;
85                }
86                return null;
87        }
88
89        # 16/11/04 new version for truetype fonts.
90        function drawMultiword($x,$y,$multiword,$fontsize,$colour)
91        {
92               
93                $multiword_arr = explode(' ',$multiword);
94               
95                for($count=0; $count<count($multiword_arr)-1; $count++)
96                {
97                        ImageTTFText($this->im, $fontsize, 0, $x, $y, 
98                                                        $colour, 
99                                                        TRUETYPE_FONT,
100                                                        $multiword_arr[$count]);
101
102                        // Get the height of the next word, so we know how far down to
103                        // draw it.     
104                        $bbox = ImageTTFBBox
105                        ($fontsize,0,TRUETYPE_FONT,$multiword_arr[$count+1]);
106                        $y += ($bbox[1]-$bbox[7])+FONT_MARGIN;
107                }
108                       
109                // Finally draw the last word
110                @ImageTTFText($this->im, $fontsize, 0, $x, $y, $colour,
111                                                        TRUETYPE_FONT, $multiword_arr[$count]);
112        } 
113
114        function angleText ($x1,$y1,$x2,$y2, $fontsize, $colour, $text)
115        {
116                $angle=slope_angle($x1, $y1, $x2, $y2);
117                $ix = $x2 > $x1 ? $x1:$x2;
118                $iy= $x2 > $x1 ? $y1:$y2;
119                ImageTTFText($this->im, $fontsize, -$angle, $ix, $iy,
120                                                $colour, TRUETYPE_FONT, $text);
121                return $i;
122        }
123
124        function drawFilledRectangle($x1,$y1,$x2,$y2,$colour)
125        {
126                ImageFilledRectangle($this->im,$x1,$y1,$x2,$y2,$colour);
127        }
128
129        function getTextDimensions($fontsize,$text)
130        {
131                $bbox = ImageTTFBBox($fontsize,0,TRUETYPE_FONT,$text);
132                return array 
133                        ( line_length($bbox[6],$bbox[7],$bbox[4],$bbox[5]),
134                          line_length($bbox[6],$boox[7],$bbox[0],$bbox[1]) );
135        }
136
137        function renderImage()
138        {
139                ImagePNG($this->im);
140        }
141
142        function crop($x,$y,$w,$h)
143        {
144                $newim = ImageCreateTrueColor($w,$h);
145                $backcol =  $this->backcol; 
146                ImageFill($newim,$w/2,$h/2,$backcol);
147                ImageColorTransparent($newim,$backcol);
148                ImageCopyMerge($newim,$this->im,0,0,$x,$y,$w,$h,100);
149                ImageDestroy($this->im);
150                $this->im = $newim;
151        }
152}
153
154class MagickPainter extends Painter
155{
156        var $wand, $dwand, $bgcolour;
157
158        function MagickPainter()
159        {
160                $this->wand = NewMagickWand();
161        }
162
163        function createImage($w,$h,$r,$g,$b)
164        {
165                MagickNewImage($this->wand,$w,$h,htmlcolour($r,$g,$b));
166                MagickSetImageFormat($this->wand,"png");
167                $this->dwand = NewDrawingWand();
168                DrawSetStrokeLineCap($this->dwand,MW_RoundCap);
169                DrawSetFont($this->dwand,TRUETYPE_FONT);
170                $this->bgcolour = htmlcolour($r,$g,$b);
171        }
172
173        function getColour($r, $g, $b)
174        {
175                return NewPixelWand(htmlcolour($r,$g,$b));
176        }
177
178        function drawText($x,$y,$fontsize,$text, $pwand)
179        {
180                if($text!="") 
181                {
182                        DrawSetFontSize($this->dwand,$fontsize);
183                        DrawSetStrokeColor($this->dwand,$pwand); 
184                        DrawSetFontWeight($this->dwand,100);
185                        DrawAnnotation($this->dwand,$x,$y,$text); 
186                }
187        }
188
189        function drawImage($x,$y,$imgfile, $format)
190        {
191                $imgwand = NewMagickWand();
192                MagickReadImage($imgwand,$imgfile);
193                $w = MagickGetImageWidth($imgwand);
194                $h = MagickGetImageHeight($imgwand);
195
196                /*
197                DrawComposite($this->dwand, MW_CopyCompositeOp,
198                                        $x, $y, $w, $h, $imgwand);
199                */
200                MagickCompositeImage($this->wand,$imgwand,MW_CopyCompositeOp,$x,$y);
201        }
202
203        function drawLine($x1,$y1,$x2,$y2,$pwand,$thickness)
204        {
205                DrawSetStrokeColor($this->dwand,$pwand);
206                DrawSetStrokeWidth($this->dwand,$thickness);
207                DrawLine($this->dwand,$x1,$y1,$x2,$y2);
208        }
209
210        function drawPolygon ($p, $pwand)
211        {
212                DrawSetFillColor($this->dwand, $pwand);
213                DrawPolygon($this->dwand,$p);
214        }
215
216        function drawDashedLine($x1,$y1,$x2,$y2,$dash, $pwand, $thickness)
217        {
218                //$dashpattern = explode(",",$dash);
219                //DrawSetStrokeDashArray($this->dwand, $dashpattern);
220                $this->drawLine($x1,$y1,$x2,$y2,$pwand,$thickness);
221                //DrawSetStrokeDashArray($this->dwand); // remove the dash pattern
222        }
223
224        # 16/11/04 new version for truetype fonts.
225        function drawMultiword($x,$y,$multiword,$fontsize,$pwand)
226        {
227               
228                $multiword_arr = explode(' ',$multiword);
229               
230                for($count=0; $count<count($multiword_arr); $count++)
231                {
232                        if($multiword_arr[$count]!="") 
233                        {
234                                // draw text   
235                                $this->drawText($x,$y,$fontsize,$multiword_arr[$count],$pwand);
236
237                                // Get the height of the next word, so we know how far down to
238                                // draw it.     
239
240                                $y += MagickGetStringHeight($this->wand,$this->dwand,
241                                                                                $multiword_arr[$count]); 
242                        }
243                }
244        } 
245
246        function angleText ($x1, $y1, $x2, $y2, $fontsize, $pwand, $text)
247        {
248                $angle=slope_angle($x1, $y1, $x2, $y2);
249                $ix = $x2 > $x1 ? $x1:$x2;
250                $iy= $x2 > $x1 ? $y1:$y2;
251                DrawTranslate($this->dwand,$ix,$iy);
252                DrawRotate($this->dwand,$angle);
253                $this->drawText(0,0,$fontsize,$text,$pwand);
254                DrawRotate($this->dwand,-$angle);
255                DrawTranslate($this->dwand,-$ix,-$iy);
256                return $i;
257        }
258
259        function drawFilledRectangle($x1,$y1,$x2,$y2,$colour)
260        {
261                DrawSetFillColor($this->dwand,$colour);
262                DrawRectangle($this->dwand,$x1,$y1,$x2,$y2);
263        }
264
265        function getTextDimensions($fontsize,$text)
266        {
267                // Fatal errors should be restricted to exceptional conditions,
268                // surely???
269                if($text!="") 
270                {
271                        $f = DrawGetFontSize($this->dwand);
272                        DrawSetFontSize($this->dwand,$fontsize);
273                        // I presume this uses the current font size
274                        return array 
275                                ( MagickGetStringWidth($this->wand,$this->dwand,$text),
276                                MagickGetStringHeight($this->wand,$this->dwand,$text ) );
277                        DrawSetFontSize($this->dwand,$f);
278                }
279                return null;
280        }
281
282        function renderImage()
283        {
284                MagickEchoImageBlob($this->wand);
285                DestroyDrawingWand($this->dwand);
286                DestroyMagickWand($this->wand);
287        }
288
289        function crop($x,$y,$w,$h)
290        {
291                MagickDrawImage($this->wand,$this->dwand);
292                MagickCropImage($this->wand,$w,$h,$x,$y);
293        }
294}
295
296function htmlcolour($r,$g,$b)
297{
298        return sprintf("#%02x%02x%02x", $r, $g, $b);
299}
300
301?>
Note: See TracBrowser for help on using the repository browser.