~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to www/php/phpBB3/includes/captcha/captcha_gd.php

  • Committer: William Grant
  • Date: 2009-02-23 23:47:02 UTC
  • mfrom: (1099.1.211 new-dispatch)
  • Revision ID: grantw@unimelb.edu.au-20090223234702-db4b1llly46ignwo
Merge from lp:~ivle-dev/ivle/new-dispatch.

Pretty much everything changes. Reread the setup docs. Backup your databases.
Every file is now in a different installed location, the configuration system
is rewritten, the dispatch system is rewritten, URLs are different, the
database is different, worksheets and exercises are no longer on the
filesystem, we use a templating engine, jail service protocols are rewritten,
we don't repeat ourselves, we have authorization rewritten, phpBB is gone,
and probably lots of other things that I cannot remember.

This is certainly the biggest commit I have ever made, and hopefully
the largest I ever will.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
<?php
2
 
/**
3
 
*
4
 
* @package VC
5
 
* @version $Id: captcha_gd.php,v 1.23 2007/10/05 14:36:32 acydburn Exp $
6
 
* @copyright (c) 2006 phpBB Group
7
 
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
8
 
*
9
 
*/
10
 
 
11
 
/**
12
 
* @ignore
13
 
*/
14
 
if (!defined('IN_PHPBB'))
15
 
{
16
 
        exit;
17
 
}
18
 
 
19
 
/**
20
 
* Original Author - Xore (Robert Hetzler)
21
 
* With contributions from Neothermic
22
 
*
23
 
* @package VC
24
 
*/
25
 
class captcha
26
 
{
27
 
        var $width = 360;
28
 
        var $height = 96;
29
 
 
30
 
        /**
31
 
        * Create the image containing $code with a seed of $seed
32
 
        */
33
 
        function execute($code, $seed)
34
 
        {
35
 
                global $config;
36
 
                srand($seed);
37
 
                mt_srand($seed);
38
 
 
39
 
                // Create image
40
 
                $img = imagecreatetruecolor($this->width, $this->height);
41
 
 
42
 
                // Generate colours
43
 
                $colour = new colour_manager($img, array(
44
 
                        'random'        => true,
45
 
                        'min_value'     => 60,
46
 
                ), 'hsv');
47
 
 
48
 
                $scheme = $colour->colour_scheme('background', false);
49
 
                $scheme = $colour->mono_range($scheme, 10, false);
50
 
                shuffle($scheme);
51
 
 
52
 
                $bg_colours = array_splice($scheme, mt_rand(6, 12));
53
 
 
54
 
                // Generate code characters
55
 
                $characters = $sizes = $bounding_boxes = array();
56
 
                $width_avail = $this->width - 15;
57
 
                $code_len = strlen($code);
58
 
 
59
 
                $captcha_bitmaps = $this->captcha_bitmaps();
60
 
                for ($i = 0; $i < $code_len; ++$i)
61
 
                {
62
 
                        $characters[$i] = new char_cube3d($captcha_bitmaps, $code[$i]);
63
 
 
64
 
                        list($min, $max) = $characters[$i]->range();
65
 
                        $sizes[$i] = mt_rand($min, $max);
66
 
 
67
 
                        $box = $characters[$i]->dimensions($sizes[$i]);
68
 
                        $width_avail -= ($box[2] - $box[0]);
69
 
                        $bounding_boxes[$i] = $box;
70
 
                }
71
 
 
72
 
                // Redistribute leftover x-space
73
 
                $offset = array();
74
 
                for ($i = 0; $i < $code_len; ++$i)
75
 
                {
76
 
                        $denom = ($code_len - $i);
77
 
                        $denom = max(1.3, $denom);
78
 
                        $offset[$i] = mt_rand(0, (1.5 * $width_avail) / $denom);
79
 
                        $width_avail -= $offset[$i];
80
 
                }
81
 
 
82
 
                if ($config['captcha_gd_x_grid'])
83
 
                {
84
 
                        $grid = (int) $config['captcha_gd_x_grid'];
85
 
                        for ($y = 0; $y < $this->height; $y += mt_rand($grid - 2, $grid + 2))
86
 
                        {
87
 
                                $current_colour = $scheme[array_rand($scheme)];
88
 
                                imageline($img, mt_rand(0,4), mt_rand($y - 3, $y), mt_rand($this->width - 5, $this->width), mt_rand($y - 3, $y), $current_colour);
89
 
                        }
90
 
                }
91
 
 
92
 
                if ($config['captcha_gd_y_grid'])
93
 
                {
94
 
                        $grid = (int) $config['captcha_gd_y_grid'];
95
 
                        for ($x = 0; $x < $this->width; $x += mt_rand($grid - 2, $grid + 2))
96
 
                        {
97
 
                                $current_colour = $scheme[array_rand($scheme)];
98
 
                                imagedashedline($img, mt_rand($x -3, $x + 3), mt_rand(0, 4), mt_rand($x -3, $x + 3), mt_rand($this->height - 5, $this->height), $current_colour);
99
 
                        }
100
 
                }
101
 
 
102
 
                $xoffset = 5;
103
 
                for ($i = 0; $i < $code_len; ++$i)
104
 
                {
105
 
                        $dimm = $bounding_boxes[$i];
106
 
                        $xoffset += ($offset[$i] - $dimm[0]);
107
 
                        $yoffset = mt_rand(-$dimm[1], $this->height - $dimm[3]);
108
 
 
109
 
                        $characters[$i]->drawchar($sizes[$i], $xoffset, $yoffset, $img, $colour->get_resource('background'), $scheme);
110
 
                        $xoffset += $dimm[2];
111
 
                }
112
 
                
113
 
                if ($config['captcha_gd_foreground_noise'])
114
 
                {
115
 
                        $this->noise_line($img, 0, 0, $this->width, $this->height, $colour->get_resource('background'), $scheme, $bg_colours);
116
 
                }
117
 
 
118
 
                // Send image
119
 
                header('Content-Type: image/png');
120
 
                header('Cache-control: no-cache, no-store');
121
 
                imagepng($img);
122
 
                imagedestroy($img);
123
 
        }
124
 
 
125
 
        /**
126
 
        * Noise line
127
 
        */
128
 
        function noise_line($img, $min_x, $min_y, $max_x, $max_y, $bg, $font, $non_font)
129
 
        {
130
 
                imagesetthickness($img, 2);
131
 
 
132
 
                $x1 = $min_x;
133
 
                $x2 = $max_x;
134
 
                $y1 = $min_y;
135
 
                $y2 = $min_y;
136
 
 
137
 
                do
138
 
                {
139
 
                        $line = array_merge(
140
 
                                array_fill(0, mt_rand(30, 60), $non_font[array_rand($non_font)]),
141
 
                                array_fill(0, mt_rand(30, 60), $bg)
142
 
                        );
143
 
 
144
 
                        imagesetstyle($img, $line);
145
 
                        imageline($img, $x1, $y1, $x2, $y2, IMG_COLOR_STYLED);
146
 
 
147
 
                        $y1 += mt_rand(12, 35);
148
 
                        $y2 += mt_rand(12, 35);
149
 
                }
150
 
                while ($y1 < $max_y && $y2 < $max_y);
151
 
 
152
 
                $x1 = $min_x;
153
 
                $x2 = $min_x;
154
 
                $y1 = $min_y;
155
 
                $y2 = $max_y;
156
 
 
157
 
                do
158
 
                {
159
 
                        $line = array_merge(
160
 
                                array_fill(0, mt_rand(30, 60), $non_font[array_rand($non_font)]),
161
 
                                array_fill(0, mt_rand(30, 60), $bg)
162
 
                        );
163
 
 
164
 
                        imagesetstyle($img, $line);
165
 
                        imageline($img, $x1, $y1, $x2, $y2, IMG_COLOR_STYLED);
166
 
 
167
 
                        $x1 += mt_rand(20, 35);
168
 
                        $x2 += mt_rand(20, 35);
169
 
                }
170
 
                while ($x1 < $max_x && $x2 < $max_x);
171
 
                imagesetthickness($img, 1);
172
 
        }
173
 
 
174
 
        /**
175
 
        * Return bitmaps
176
 
        */
177
 
        function captcha_bitmaps()
178
 
        {
179
 
                return array(
180
 
                        'width'         => 9,
181
 
                        'height'        => 15,
182
 
                        'data'          => array(
183
 
 
184
 
                        'A' => array(
185
 
                                array(0,0,0,0,1,0,0,0,0),
186
 
                                array(0,0,0,1,0,1,0,0,0),
187
 
                                array(0,0,0,1,0,1,0,0,0),
188
 
                                array(0,0,0,1,0,1,0,0,0),
189
 
                                array(0,0,1,0,0,0,1,0,0),
190
 
                                array(0,0,1,0,0,0,1,0,0),
191
 
                                array(0,0,1,0,0,0,1,0,0),
192
 
                                array(0,1,0,0,0,0,0,1,0),
193
 
                                array(0,1,0,0,0,0,0,1,0),
194
 
                                array(0,1,1,1,1,1,1,1,0),
195
 
                                array(0,1,0,0,0,0,0,1,0),
196
 
                                array(1,0,0,0,0,0,0,0,1),
197
 
                                array(1,0,0,0,0,0,0,0,1),
198
 
                                array(1,0,0,0,0,0,0,0,1),
199
 
                                array(1,0,0,0,0,0,0,0,1),
200
 
                        ),
201
 
                        'B' => array(
202
 
                                array(1,1,1,1,1,1,1,0,0),
203
 
                                array(1,0,0,0,0,0,0,1,0),
204
 
                                array(1,0,0,0,0,0,0,0,1),
205
 
                                array(1,0,0,0,0,0,0,0,1),
206
 
                                array(1,0,0,0,0,0,0,0,1),
207
 
                                array(1,0,0,0,0,0,0,0,1),
208
 
                                array(1,0,0,0,0,0,0,1,0),
209
 
                                array(1,1,1,1,1,1,1,0,0),
210
 
                                array(1,0,0,0,0,0,0,1,0),
211
 
                                array(1,0,0,0,0,0,0,0,1),
212
 
                                array(1,0,0,0,0,0,0,0,1),
213
 
                                array(1,0,0,0,0,0,0,0,1),
214
 
                                array(1,0,0,0,0,0,0,0,1),
215
 
                                array(1,0,0,0,0,0,0,1,0),
216
 
                                array(1,1,1,1,1,1,1,0,0),
217
 
                        ),
218
 
                        'C' => array(
219
 
                                array(0,0,1,1,1,1,1,0,0),
220
 
                                array(0,1,0,0,0,0,0,1,0),
221
 
                                array(1,0,0,0,0,0,0,0,1),
222
 
                                array(1,0,0,0,0,0,0,0,1),
223
 
                                array(1,0,0,0,0,0,0,0,0),
224
 
                                array(1,0,0,0,0,0,0,0,0),
225
 
                                array(1,0,0,0,0,0,0,0,0),
226
 
                                array(1,0,0,0,0,0,0,0,0),
227
 
                                array(1,0,0,0,0,0,0,0,0),
228
 
                                array(1,0,0,0,0,0,0,0,0),
229
 
                                array(1,0,0,0,0,0,0,0,0),
230
 
                                array(1,0,0,0,0,0,0,0,1),
231
 
                                array(1,0,0,0,0,0,0,0,1),
232
 
                                array(0,1,0,0,0,0,0,1,0),
233
 
                                array(0,0,1,1,1,1,1,0,0),
234
 
                        ),
235
 
                        'D' => array(
236
 
                                array(1,1,1,1,1,1,1,0,0),
237
 
                                array(1,0,0,0,0,0,0,1,0),
238
 
                                array(1,0,0,0,0,0,0,0,1),
239
 
                                array(1,0,0,0,0,0,0,0,1),
240
 
                                array(1,0,0,0,0,0,0,0,1),
241
 
                                array(1,0,0,0,0,0,0,0,1),
242
 
                                array(1,0,0,0,0,0,0,0,1),
243
 
                                array(1,0,0,0,0,0,0,0,1),
244
 
                                array(1,0,0,0,0,0,0,0,1),
245
 
                                array(1,0,0,0,0,0,0,0,1),
246
 
                                array(1,0,0,0,0,0,0,0,1),
247
 
                                array(1,0,0,0,0,0,0,0,1),
248
 
                                array(1,0,0,0,0,0,0,0,1),
249
 
                                array(1,0,0,0,0,0,0,1,0),
250
 
                                array(1,1,1,1,1,1,1,0,0),
251
 
                        ),
252
 
                        'E' => array(
253
 
                                array(1,1,1,1,1,1,1,1,1),
254
 
                                array(1,0,0,0,0,0,0,0,0),
255
 
                                array(1,0,0,0,0,0,0,0,0),
256
 
                                array(1,0,0,0,0,0,0,0,0),
257
 
                                array(1,0,0,0,0,0,0,0,0),
258
 
                                array(1,0,0,0,0,0,0,0,0),
259
 
                                array(1,0,0,0,0,0,0,0,0),
260
 
                                array(1,1,1,1,1,1,1,1,0),
261
 
                                array(1,0,0,0,0,0,0,0,0),
262
 
                                array(1,0,0,0,0,0,0,0,0),
263
 
                                array(1,0,0,0,0,0,0,0,0),
264
 
                                array(1,0,0,0,0,0,0,0,0),
265
 
                                array(1,0,0,0,0,0,0,0,0),
266
 
                                array(1,0,0,0,0,0,0,0,0),
267
 
                                array(1,1,1,1,1,1,1,1,1),
268
 
                        ),
269
 
                        'F' => array(
270
 
                                array(1,1,1,1,1,1,1,1,1),
271
 
                                array(1,0,0,0,0,0,0,0,0),
272
 
                                array(1,0,0,0,0,0,0,0,0),
273
 
                                array(1,0,0,0,0,0,0,0,0),
274
 
                                array(1,0,0,0,0,0,0,0,0),
275
 
                                array(1,0,0,0,0,0,0,0,0),
276
 
                                array(1,0,0,0,0,0,0,0,0),
277
 
                                array(1,1,1,1,1,1,1,0,0),
278
 
                                array(1,0,0,0,0,0,0,0,0),
279
 
                                array(1,0,0,0,0,0,0,0,0),
280
 
                                array(1,0,0,0,0,0,0,0,0),
281
 
                                array(1,0,0,0,0,0,0,0,0),
282
 
                                array(1,0,0,0,0,0,0,0,0),
283
 
                                array(1,0,0,0,0,0,0,0,0),
284
 
                                array(1,0,0,0,0,0,0,0,0),
285
 
                        ),
286
 
                        'G' => array(
287
 
                                array(0,0,1,1,1,1,1,0,0),
288
 
                                array(0,1,0,0,0,0,0,1,0),
289
 
                                array(1,0,0,0,0,0,0,0,1),
290
 
                                array(1,0,0,0,0,0,0,0,0),
291
 
                                array(1,0,0,0,0,0,0,0,0),
292
 
                                array(1,0,0,0,0,0,0,0,0),
293
 
                                array(1,0,0,0,0,0,0,0,0),
294
 
                                array(1,0,0,0,0,0,0,0,0),
295
 
                                array(1,0,0,0,0,0,1,1,1),
296
 
                                array(1,0,0,0,0,0,0,0,1),
297
 
                                array(1,0,0,0,0,0,0,0,1),
298
 
                                array(1,0,0,0,0,0,0,0,1),
299
 
                                array(1,0,0,0,0,0,0,0,1),
300
 
                                array(0,1,0,0,0,0,0,1,0),
301
 
                                array(0,0,1,1,1,1,1,0,0),
302
 
                        ),
303
 
                        'H' => array(
304
 
                                array(1,0,0,0,0,0,0,0,1),
305
 
                                array(1,0,0,0,0,0,0,0,1),
306
 
                                array(1,0,0,0,0,0,0,0,1),
307
 
                                array(1,0,0,0,0,0,0,0,1),
308
 
                                array(1,0,0,0,0,0,0,0,1),
309
 
                                array(1,0,0,0,0,0,0,0,1),
310
 
                                array(1,0,0,0,0,0,0,0,1),
311
 
                                array(1,1,1,1,1,1,1,1,1),
312
 
                                array(1,0,0,0,0,0,0,0,1),
313
 
                                array(1,0,0,0,0,0,0,0,1),
314
 
                                array(1,0,0,0,0,0,0,0,1),
315
 
                                array(1,0,0,0,0,0,0,0,1),
316
 
                                array(1,0,0,0,0,0,0,0,1),
317
 
                                array(1,0,0,0,0,0,0,0,1),
318
 
                                array(1,0,0,0,0,0,0,0,1),
319
 
                        ),
320
 
                        'I' => array(
321
 
                                array(1,1,1,1,1,1,1,1,1),
322
 
                                array(0,0,0,0,1,0,0,0,0),
323
 
                                array(0,0,0,0,1,0,0,0,0),
324
 
                                array(0,0,0,0,1,0,0,0,0),
325
 
                                array(0,0,0,0,1,0,0,0,0),
326
 
                                array(0,0,0,0,1,0,0,0,0),
327
 
                                array(0,0,0,0,1,0,0,0,0),
328
 
                                array(0,0,0,0,1,0,0,0,0),
329
 
                                array(0,0,0,0,1,0,0,0,0),
330
 
                                array(0,0,0,0,1,0,0,0,0),
331
 
                                array(0,0,0,0,1,0,0,0,0),
332
 
                                array(0,0,0,0,1,0,0,0,0),
333
 
                                array(0,0,0,0,1,0,0,0,0),
334
 
                                array(0,0,0,0,1,0,0,0,0),
335
 
                                array(1,1,1,1,1,1,1,1,1),
336
 
                        ),
337
 
                        'J' => array(
338
 
                                array(1,1,1,1,1,1,1,1,1),
339
 
                                array(0,0,0,0,0,1,0,0,0),
340
 
                                array(0,0,0,0,0,1,0,0,0),
341
 
                                array(0,0,0,0,0,1,0,0,0),
342
 
                                array(0,0,0,0,0,1,0,0,0),
343
 
                                array(0,0,0,0,0,1,0,0,0),
344
 
                                array(0,0,0,0,0,1,0,0,0),
345
 
                                array(0,0,0,0,0,1,0,0,0),
346
 
                                array(0,0,0,0,0,1,0,0,0),
347
 
                                array(0,0,0,0,0,1,0,0,0),
348
 
                                array(0,0,0,0,0,1,0,0,0),
349
 
                                array(1,0,0,0,0,1,0,0,0),
350
 
                                array(1,0,0,0,0,1,0,0,0),
351
 
                                array(0,1,0,0,1,0,0,0,0),
352
 
                                array(0,0,1,1,0,0,0,0,0),
353
 
                        ),
354
 
                        'K' => array(    // New 'K', supplied by NeoThermic
355
 
                                array(1,0,0,0,0,0,0,0,1),
356
 
                                array(1,0,0,0,0,0,0,1,0),
357
 
                                array(1,0,0,0,0,0,1,0,0),
358
 
                                array(1,0,0,0,0,1,0,0,0),
359
 
                                array(1,0,0,0,1,0,0,0,0),
360
 
                                array(1,0,0,1,0,0,0,0,0),
361
 
                                array(1,0,1,0,0,0,0,0,0),
362
 
                                array(1,1,0,0,0,0,0,0,0),
363
 
                                array(1,0,1,0,0,0,0,0,0),
364
 
                                array(1,0,0,1,0,0,0,0,0),
365
 
                                array(1,0,0,0,1,0,0,0,0),
366
 
                                array(1,0,0,0,0,1,0,0,0),
367
 
                                array(1,0,0,0,0,0,1,0,0),
368
 
                                array(1,0,0,0,0,0,0,1,0),
369
 
                                array(1,0,0,0,0,0,0,0,1),
370
 
                        ),
371
 
                        'L' => array(
372
 
                                array(0,0,0,0,0,0,0,0,0),
373
 
                                array(1,0,0,0,0,0,0,0,0),
374
 
                                array(1,0,0,0,0,0,0,0,0),
375
 
                                array(1,0,0,0,0,0,0,0,0),
376
 
                                array(1,0,0,0,0,0,0,0,0),
377
 
                                array(1,0,0,0,0,0,0,0,0),
378
 
                                array(1,0,0,0,0,0,0,0,0),
379
 
                                array(1,0,0,0,0,0,0,0,0),
380
 
                                array(1,0,0,0,0,0,0,0,0),
381
 
                                array(1,0,0,0,0,0,0,0,0),
382
 
                                array(1,0,0,0,0,0,0,0,0),
383
 
                                array(1,0,0,0,0,0,0,0,0),
384
 
                                array(1,0,0,0,0,0,0,0,0),
385
 
                                array(1,0,0,0,0,0,0,0,0),
386
 
                                array(1,1,1,1,1,1,1,1,1),
387
 
                        ),
388
 
                        'M' => array(
389
 
                                array(1,1,0,0,0,0,0,1,1),
390
 
                                array(1,1,0,0,0,0,0,1,1),
391
 
                                array(1,0,1,0,0,0,1,0,1),
392
 
                                array(1,0,1,0,0,0,1,0,1),
393
 
                                array(1,0,1,0,0,0,1,0,1),
394
 
                                array(1,0,0,1,0,1,0,0,1),
395
 
                                array(1,0,0,1,0,1,0,0,1),
396
 
                                array(1,0,0,1,0,1,0,0,1),
397
 
                                array(1,0,0,0,1,0,0,0,1),
398
 
                                array(1,0,0,0,1,0,0,0,1),
399
 
                                array(1,0,0,0,0,0,0,0,1),
400
 
                                array(1,0,0,0,0,0,0,0,1),
401
 
                                array(1,0,0,0,0,0,0,0,1),
402
 
                                array(1,0,0,0,0,0,0,0,1),
403
 
                                array(1,0,0,0,0,0,0,0,1),
404
 
                        ),
405
 
                        'N' => array(
406
 
                                array(1,1,0,0,0,0,0,0,1),
407
 
                                array(1,1,0,0,0,0,0,0,1),
408
 
                                array(1,0,1,0,0,0,0,0,1),
409
 
                                array(1,0,1,0,0,0,0,0,1),
410
 
                                array(1,0,0,1,0,0,0,0,1),
411
 
                                array(1,0,0,1,0,0,0,0,1),
412
 
                                array(1,0,0,0,1,0,0,0,1),
413
 
                                array(1,0,0,0,1,0,0,0,1),
414
 
                                array(1,0,0,0,1,0,0,0,1),
415
 
                                array(1,0,0,0,0,1,0,0,1),
416
 
                                array(1,0,0,0,0,1,0,0,1),
417
 
                                array(1,0,0,0,0,0,1,0,1),
418
 
                                array(1,0,0,0,0,0,1,0,1),
419
 
                                array(1,0,0,0,0,0,0,1,1),
420
 
                                array(1,0,0,0,0,0,0,1,1),
421
 
                        ),
422
 
                        'O' => array(
423
 
                                array(0,0,1,1,1,1,1,0,0),
424
 
                                array(0,1,0,0,0,0,0,1,0),
425
 
                                array(1,0,0,0,0,0,0,0,1),
426
 
                                array(1,0,0,0,0,0,0,0,1),
427
 
                                array(1,0,0,0,0,0,0,0,1),
428
 
                                array(1,0,0,0,0,0,0,0,1),
429
 
                                array(1,0,0,0,0,0,0,0,1),
430
 
                                array(1,0,0,0,0,0,0,0,1),
431
 
                                array(1,0,0,0,0,0,0,0,1),
432
 
                                array(1,0,0,0,0,0,0,0,1),
433
 
                                array(1,0,0,0,0,0,0,0,1),
434
 
                                array(1,0,0,0,0,0,0,0,1),
435
 
                                array(1,0,0,0,0,0,0,0,1),
436
 
                                array(0,1,0,0,0,0,0,1,0),
437
 
                                array(0,0,1,1,1,1,1,0,0),
438
 
                        ),
439
 
                        'P' => array(
440
 
                                array(1,1,1,1,1,1,1,0,0),
441
 
                                array(1,0,0,0,0,0,0,1,0),
442
 
                                array(1,0,0,0,0,0,0,0,1),
443
 
                                array(1,0,0,0,0,0,0,0,1),
444
 
                                array(1,0,0,0,0,0,0,0,1),
445
 
                                array(1,0,0,0,0,0,0,0,1),
446
 
                                array(1,0,0,0,0,0,0,1,0),
447
 
                                array(1,1,1,1,1,1,1,0,0),
448
 
                                array(1,0,0,0,0,0,0,0,0),
449
 
                                array(1,0,0,0,0,0,0,0,0),
450
 
                                array(1,0,0,0,0,0,0,0,0),
451
 
                                array(1,0,0,0,0,0,0,0,0),
452
 
                                array(1,0,0,0,0,0,0,0,0),
453
 
                                array(1,0,0,0,0,0,0,0,0),
454
 
                                array(1,0,0,0,0,0,0,0,0),
455
 
                        ),
456
 
                        'Q' => array(
457
 
                                array(0,0,1,1,1,1,1,0,0),
458
 
                                array(0,1,0,0,0,0,0,1,0),
459
 
                                array(1,0,0,0,0,0,0,0,1),
460
 
                                array(1,0,0,0,0,0,0,0,1),
461
 
                                array(1,0,0,0,0,0,0,0,1),
462
 
                                array(1,0,0,0,0,0,0,0,1),
463
 
                                array(1,0,0,0,0,0,0,0,1),
464
 
                                array(1,0,0,0,0,0,0,0,1),
465
 
                                array(1,0,0,0,0,0,0,0,1),
466
 
                                array(1,0,0,0,0,0,0,0,1),
467
 
                                array(1,0,0,0,0,0,0,0,1),
468
 
                                array(1,0,0,0,0,1,0,0,1),
469
 
                                array(1,0,0,0,0,0,1,0,1),
470
 
                                array(0,1,0,0,0,0,0,1,0),
471
 
                                array(0,0,1,1,1,1,1,0,1),
472
 
                        ),
473
 
                        'R' => array(
474
 
                                array(1,1,1,1,1,1,1,0,0),
475
 
                                array(1,0,0,0,0,0,0,1,0),
476
 
                                array(1,0,0,0,0,0,0,0,1),
477
 
                                array(1,0,0,0,0,0,0,0,1),
478
 
                                array(1,0,0,0,0,0,0,0,1),
479
 
                                array(1,0,0,0,0,0,0,0,1),
480
 
                                array(1,0,0,0,0,0,0,1,0),
481
 
                                array(1,1,1,1,1,1,1,0,0),
482
 
                                array(1,1,1,0,0,0,0,0,0),
483
 
                                array(1,0,0,1,0,0,0,0,0),
484
 
                                array(1,0,0,0,1,0,0,0,0),
485
 
                                array(1,0,0,0,0,1,0,0,0),
486
 
                                array(1,0,0,0,0,0,1,0,0),
487
 
                                array(1,0,0,0,0,0,0,1,0),
488
 
                                array(1,0,0,0,0,0,0,0,1),
489
 
                        ),
490
 
                        'S' => array(
491
 
                                array(0,0,1,1,1,1,1,0,0),
492
 
                                array(0,1,0,0,0,0,0,1,0),
493
 
                                array(1,0,0,0,0,0,0,0,1),
494
 
                                array(1,0,0,0,0,0,0,0,0),
495
 
                                array(1,0,0,0,0,0,0,0,0),
496
 
                                array(1,0,0,0,0,0,0,0,0),
497
 
                                array(0,1,0,0,0,0,0,0,0),
498
 
                                array(0,0,1,1,1,1,1,0,0),
499
 
                                array(0,0,0,0,0,0,0,1,0),
500
 
                                array(0,0,0,0,0,0,0,0,1),
501
 
                                array(0,0,0,0,0,0,0,0,1),
502
 
                                array(0,0,0,0,0,0,0,0,1),
503
 
                                array(1,0,0,0,0,0,0,0,1),
504
 
                                array(0,1,0,0,0,0,0,1,0),
505
 
                                array(0,0,1,1,1,1,1,0,0),
506
 
                        ),
507
 
                        'T' => array(
508
 
                                array(1,1,1,1,1,1,1,1,1),
509
 
                                array(0,0,0,0,1,0,0,0,0),
510
 
                                array(0,0,0,0,1,0,0,0,0),
511
 
                                array(0,0,0,0,1,0,0,0,0),
512
 
                                array(0,0,0,0,1,0,0,0,0),
513
 
                                array(0,0,0,0,1,0,0,0,0),
514
 
                                array(0,0,0,0,1,0,0,0,0),
515
 
                                array(0,0,0,0,1,0,0,0,0),
516
 
                                array(0,0,0,0,1,0,0,0,0),
517
 
                                array(0,0,0,0,1,0,0,0,0),
518
 
                                array(0,0,0,0,1,0,0,0,0),
519
 
                                array(0,0,0,0,1,0,0,0,0),
520
 
                                array(0,0,0,0,1,0,0,0,0),
521
 
                                array(0,0,0,0,1,0,0,0,0),
522
 
                                array(0,0,0,0,1,0,0,0,0),
523
 
                        ),
524
 
                        'U' => array(
525
 
                                array(1,0,0,0,0,0,0,0,1),
526
 
                                array(1,0,0,0,0,0,0,0,1),
527
 
                                array(1,0,0,0,0,0,0,0,1),
528
 
                                array(1,0,0,0,0,0,0,0,1),
529
 
                                array(1,0,0,0,0,0,0,0,1),
530
 
                                array(1,0,0,0,0,0,0,0,1),
531
 
                                array(1,0,0,0,0,0,0,0,1),
532
 
                                array(1,0,0,0,0,0,0,0,1),
533
 
                                array(1,0,0,0,0,0,0,0,1),
534
 
                                array(1,0,0,0,0,0,0,0,1),
535
 
                                array(1,0,0,0,0,0,0,0,1),
536
 
                                array(1,0,0,0,0,0,0,0,1),
537
 
                                array(1,0,0,0,0,0,0,0,1),
538
 
                                array(0,1,0,0,0,0,0,1,0),
539
 
                                array(0,0,1,1,1,1,1,0,0),
540
 
                        ),
541
 
                        'V' => array(
542
 
                                array(1,0,0,0,0,0,0,0,1),
543
 
                                array(1,0,0,0,0,0,0,0,1),
544
 
                                array(1,0,0,0,0,0,0,0,1),
545
 
                                array(0,1,0,0,0,0,0,1,0),
546
 
                                array(0,1,0,0,0,0,0,1,0),
547
 
                                array(0,1,0,0,0,0,0,1,0),
548
 
                                array(0,0,1,0,0,0,1,0,0),
549
 
                                array(0,0,1,0,0,0,1,0,0),
550
 
                                array(0,0,1,0,0,0,1,0,0),
551
 
                                array(0,0,1,0,0,0,1,0,0),
552
 
                                array(0,0,0,1,0,1,0,0,0),
553
 
                                array(0,0,0,1,0,1,0,0,0),
554
 
                                array(0,0,0,1,0,1,0,0,0),
555
 
                                array(0,0,0,0,1,0,0,0,0),
556
 
                                array(0,0,0,0,1,0,0,0,0),
557
 
                        ),
558
 
                        'W' => array(    // New 'W', supplied by MHobbit
559
 
                                array(1,0,0,0,0,0,0,0,1),
560
 
                                array(1,0,0,0,0,0,0,0,1),
561
 
                                array(1,0,0,0,0,0,0,0,1),
562
 
                                array(1,0,0,0,0,0,0,0,1),
563
 
                                array(1,0,0,0,0,0,0,0,1),
564
 
                                array(1,0,0,0,1,0,0,0,1),
565
 
                                array(1,0,0,0,1,0,0,0,1),
566
 
                                array(1,0,0,1,0,1,0,0,1),
567
 
                                array(1,0,0,1,0,1,0,0,1),
568
 
                                array(1,0,0,1,0,1,0,0,1),
569
 
                                array(1,0,1,0,0,0,1,0,1),
570
 
                                array(1,0,1,0,0,0,1,0,1),
571
 
                                array(1,0,1,0,0,0,1,0,1),
572
 
                                array(1,1,0,0,0,0,0,1,1),
573
 
                                array(1,1,0,0,0,0,0,1,1),
574
 
                        ),
575
 
                        'X' => array(
576
 
                                array(1,0,0,0,0,0,0,0,1),
577
 
                                array(1,0,0,0,0,0,0,0,1),
578
 
                                array(0,1,0,0,0,0,0,1,0),
579
 
                                array(0,1,0,0,0,0,0,1,0),
580
 
                                array(0,0,1,0,0,0,1,0,0),
581
 
                                array(0,0,0,1,0,1,0,0,0),
582
 
                                array(0,0,0,1,0,1,0,0,0),
583
 
                                array(0,0,0,0,1,0,0,0,0),
584
 
                                array(0,0,0,1,0,1,0,0,0),
585
 
                                array(0,0,0,1,0,1,0,0,0),
586
 
                                array(0,0,1,0,0,0,1,0,0),
587
 
                                array(0,1,0,0,0,0,1,0,0),
588
 
                                array(0,1,0,0,0,0,0,1,0),
589
 
                                array(1,0,0,0,0,0,0,0,1),
590
 
                                array(1,0,0,0,0,0,0,0,1),
591
 
                        ),
592
 
                        'Y' => array(
593
 
                                array(1,0,0,0,0,0,0,0,1),
594
 
                                array(1,0,0,0,0,0,0,0,1),
595
 
                                array(0,1,0,0,0,0,0,1,0),
596
 
                                array(0,1,0,0,0,0,0,1,0),
597
 
                                array(0,0,1,0,0,0,1,0,0),
598
 
                                array(0,0,1,0,0,0,1,0,0),
599
 
                                array(0,0,0,1,0,1,0,0,0),
600
 
                                array(0,0,0,0,1,0,0,0,0),
601
 
                                array(0,0,0,0,1,0,0,0,0),
602
 
                                array(0,0,0,0,1,0,0,0,0),
603
 
                                array(0,0,0,0,1,0,0,0,0),
604
 
                                array(0,0,0,0,1,0,0,0,0),
605
 
                                array(0,0,0,0,1,0,0,0,0),
606
 
                                array(0,0,0,0,1,0,0,0,0),
607
 
                                array(0,0,0,0,1,0,0,0,0),
608
 
                        ),
609
 
                        'Z' => array(    // New 'Z' supplied by Anon
610
 
                                array(1,1,1,1,1,1,1,1,1),
611
 
                                array(1,0,0,0,0,0,0,0,1),
612
 
                                array(0,0,0,0,0,0,0,0,1),
613
 
                                array(0,0,0,0,0,0,0,1,0),
614
 
                                array(0,0,0,0,0,0,1,0,0),
615
 
                                array(0,0,0,0,0,1,0,0,0),
616
 
                                array(0,0,0,0,0,1,0,0,0),
617
 
                                array(0,0,0,0,1,0,0,0,0),
618
 
                                array(0,0,0,1,0,0,0,0,0),
619
 
                                array(0,0,0,1,0,0,0,0,0),
620
 
                                array(0,0,1,0,0,0,0,0,0),
621
 
                                array(0,1,0,0,0,0,0,0,0),
622
 
                                array(1,0,0,0,0,0,0,0,0),
623
 
                                array(1,0,0,0,0,0,0,0,1),
624
 
                                array(1,1,1,1,1,1,1,1,1),
625
 
                        ),
626
 
                        '1' => array(
627
 
                                array(0,0,0,1,1,0,0,0,0),
628
 
                                array(0,0,1,0,1,0,0,0,0),
629
 
                                array(0,1,0,0,1,0,0,0,0),
630
 
                                array(0,0,0,0,1,0,0,0,0),
631
 
                                array(0,0,0,0,1,0,0,0,0),
632
 
                                array(0,0,0,0,1,0,0,0,0),
633
 
                                array(0,0,0,0,1,0,0,0,0),
634
 
                                array(0,0,0,0,1,0,0,0,0),
635
 
                                array(0,0,0,0,1,0,0,0,0),
636
 
                                array(0,0,0,0,1,0,0,0,0),
637
 
                                array(0,0,0,0,1,0,0,0,0),
638
 
                                array(0,0,0,0,1,0,0,0,0),
639
 
                                array(0,0,0,0,1,0,0,0,0),
640
 
                                array(0,0,0,0,1,0,0,0,0),
641
 
                                array(0,1,1,1,1,1,1,1,0),
642
 
                        ),
643
 
                        '2' => array(    // New '2' supplied by Anon
644
 
                                array(0,0,0,1,1,1,0,0,0),
645
 
                                array(0,0,1,0,0,0,1,0,0),
646
 
                                array(0,1,0,0,0,0,1,1,0),
647
 
                                array(0,0,0,0,0,0,0,0,1),
648
 
                                array(0,0,0,0,0,0,0,0,1),
649
 
                                array(0,0,0,0,0,0,0,1,1),
650
 
                                array(0,0,0,0,0,0,0,1,0),
651
 
                                array(0,0,0,0,0,0,1,0,0),
652
 
                                array(0,0,0,0,0,1,0,0,0),
653
 
                                array(0,0,0,0,1,0,0,0,0),
654
 
                                array(0,0,0,1,0,0,0,0,0),
655
 
                                array(0,0,1,0,0,0,0,0,0),
656
 
                                array(0,1,0,0,0,0,0,0,0),
657
 
                                array(1,1,1,1,1,1,1,1,1),
658
 
                                array(0,0,0,0,0,0,0,0,0),
659
 
                        ),
660
 
                        '3' => array(
661
 
                                array(0,0,1,1,1,1,1,0,0),
662
 
                                array(0,1,0,0,0,0,0,1,0),
663
 
                                array(1,0,0,0,0,0,0,0,1),
664
 
                                array(0,0,0,0,0,0,0,0,1),
665
 
                                array(0,0,0,0,0,0,0,0,1),
666
 
                                array(0,0,0,0,0,0,0,0,1),
667
 
                                array(0,0,0,0,0,0,0,1,0),
668
 
                                array(0,0,0,0,0,1,1,0,0),
669
 
                                array(0,0,0,0,0,0,0,1,0),
670
 
                                array(0,0,0,0,0,0,0,0,1),
671
 
                                array(0,0,0,0,0,0,0,0,1),
672
 
                                array(0,0,0,0,0,0,0,0,1),
673
 
                                array(1,0,0,0,0,0,0,0,1),
674
 
                                array(0,1,0,0,0,0,0,1,0),
675
 
                                array(0,0,1,1,1,1,1,0,0),
676
 
                        ),
677
 
                        '4' => array(
678
 
                                array(0,0,0,0,0,0,1,1,0),
679
 
                                array(0,0,0,0,0,1,0,1,0),
680
 
                                array(0,0,0,0,1,0,0,1,0),
681
 
                                array(0,0,0,1,0,0,0,1,0),
682
 
                                array(0,0,1,0,0,0,0,1,0),
683
 
                                array(0,1,0,0,0,0,0,1,0),
684
 
                                array(1,0,0,0,0,0,0,1,0),
685
 
                                array(1,0,0,0,0,0,0,1,0),
686
 
                                array(1,1,1,1,1,1,1,1,1),
687
 
                                array(0,0,0,0,0,0,0,1,0),
688
 
                                array(0,0,0,0,0,0,0,1,0),
689
 
                                array(0,0,0,0,0,0,0,1,0),
690
 
                                array(0,0,0,0,0,0,0,1,0),
691
 
                                array(0,0,0,0,0,0,0,1,0),
692
 
                                array(0,0,0,0,0,0,0,1,0),
693
 
                        ),
694
 
                        '5' => array(
695
 
                                array(1,1,1,1,1,1,1,1,1),
696
 
                                array(1,0,0,0,0,0,0,0,0),
697
 
                                array(1,0,0,0,0,0,0,0,0),
698
 
                                array(1,0,0,0,0,0,0,0,0),
699
 
                                array(1,0,0,0,0,0,0,0,0),
700
 
                                array(0,1,0,0,0,0,0,0,0),
701
 
                                array(0,0,1,1,1,1,1,0,0),
702
 
                                array(0,0,0,0,0,0,0,1,0),
703
 
                                array(0,0,0,0,0,0,0,0,1),
704
 
                                array(0,0,0,0,0,0,0,0,1),
705
 
                                array(0,0,0,0,0,0,0,0,1),
706
 
                                array(0,0,0,0,0,0,0,0,1),
707
 
                                array(1,0,0,0,0,0,0,0,1),
708
 
                                array(0,1,0,0,0,0,0,1,0),
709
 
                                array(0,0,1,1,1,1,1,0,0),
710
 
                        ),
711
 
                        '6' => array(
712
 
                                array(0,0,1,1,1,1,1,0,0),
713
 
                                array(0,1,0,0,0,0,0,1,0),
714
 
                                array(1,0,0,0,0,0,0,0,1),
715
 
                                array(1,0,0,0,0,0,0,0,1),
716
 
                                array(1,0,0,0,0,0,0,0,0),
717
 
                                array(1,0,0,0,0,0,0,0,0),
718
 
                                array(1,0,0,1,1,1,1,0,0),
719
 
                                array(1,0,1,0,0,0,0,1,0),
720
 
                                array(1,1,0,0,0,0,0,0,1),
721
 
                                array(1,0,0,0,0,0,0,0,1),
722
 
                                array(1,0,0,0,0,0,0,0,1),
723
 
                                array(1,0,0,0,0,0,0,0,1),
724
 
                                array(1,0,0,0,0,0,0,0,1),
725
 
                                array(0,1,0,0,0,0,0,1,0),
726
 
                                array(0,0,1,1,1,1,1,0,0),
727
 
                        ),
728
 
                        '7' => array(
729
 
                                array(1,1,1,1,1,1,1,1,1),
730
 
                                array(0,0,0,0,0,0,0,0,1),
731
 
                                array(0,0,0,0,0,0,0,1,0),
732
 
                                array(0,0,0,0,0,0,0,1,0),
733
 
                                array(0,0,0,0,0,0,1,0,0),
734
 
                                array(0,0,0,0,0,1,0,0,0),
735
 
                                array(0,0,0,0,0,1,0,0,0),
736
 
                                array(0,0,0,0,1,0,0,0,0),
737
 
                                array(0,0,0,1,0,0,0,0,0),
738
 
                                array(0,0,0,1,0,0,0,0,0),
739
 
                                array(0,0,1,0,0,0,0,0,0),
740
 
                                array(0,1,0,0,0,0,0,0,0),
741
 
                                array(0,1,0,0,0,0,0,0,0),
742
 
                                array(1,0,0,0,0,0,0,0,0),
743
 
                                array(1,0,0,0,0,0,0,0,0),
744
 
                        ),
745
 
                        '8' => array(
746
 
                                array(0,0,1,1,1,1,1,0,0),
747
 
                                array(0,1,0,0,0,0,0,1,0),
748
 
                                array(1,0,0,0,0,0,0,0,1),
749
 
                                array(1,0,0,0,0,0,0,0,1),
750
 
                                array(1,0,0,0,0,0,0,0,1),
751
 
                                array(1,0,0,0,0,0,0,0,1),
752
 
                                array(0,1,0,0,0,0,0,1,0),
753
 
                                array(0,0,1,1,1,1,1,0,0),
754
 
                                array(0,1,0,0,0,0,0,1,0),
755
 
                                array(1,0,0,0,0,0,0,0,1),
756
 
                                array(1,0,0,0,0,0,0,0,1),
757
 
                                array(1,0,0,0,0,0,0,0,1),
758
 
                                array(1,0,0,0,0,0,0,0,1),
759
 
                                array(0,1,0,0,0,0,0,1,0),
760
 
                                array(0,0,1,1,1,1,1,0,0),
761
 
                        ),
762
 
                        '9' => array(
763
 
                                array(0,0,1,1,1,1,1,0,0),
764
 
                                array(0,1,0,0,0,0,0,1,0),
765
 
                                array(1,0,0,0,0,0,0,0,1),
766
 
                                array(1,0,0,0,0,0,0,0,1),
767
 
                                array(1,0,0,0,0,0,0,0,1),
768
 
                                array(1,0,0,0,0,0,0,0,1),
769
 
                                array(1,0,0,0,0,0,0,1,1),
770
 
                                array(0,1,0,0,0,0,1,0,1),
771
 
                                array(0,0,1,1,1,1,0,0,1),
772
 
                                array(0,0,0,0,0,0,0,0,1),
773
 
                                array(0,0,0,0,0,0,0,0,1),
774
 
                                array(1,0,0,0,0,0,0,0,1),
775
 
                                array(1,0,0,0,0,0,0,0,1),
776
 
                                array(0,1,0,0,0,0,0,1,0),
777
 
                                array(0,0,1,1,1,1,1,0,0),
778
 
                        ),
779
 
                        )
780
 
                );
781
 
        }
782
 
}
783
 
 
784
 
/**
785
 
* @package VC
786
 
*/
787
 
class char_cube3d
788
 
{
789
 
        var $bitmap;
790
 
        var $bitmap_width;
791
 
        var $bitmap_height;
792
 
 
793
 
        var $basis_matrix = array(array(1, 0, 0), array(0, 1, 0), array(0, 0, 1));
794
 
        var $abs_x = array(1, 0);
795
 
        var $abs_y = array(0, 1);
796
 
        var $x = 0;
797
 
        var $y = 1;
798
 
        var $z = 2;
799
 
        var $letter = '';
800
 
 
801
 
        /**
802
 
        */
803
 
        function char_cube3d(&$bitmaps, $letter)
804
 
        {
805
 
                $this->bitmap                   = $bitmaps['data'][$letter];
806
 
                $this->bitmap_width             = $bitmaps['width'];
807
 
                $this->bitmap_height    = $bitmaps['height'];
808
 
 
809
 
                $this->basis_matrix[0][0] = mt_rand(-600, 600);
810
 
                $this->basis_matrix[0][1] = mt_rand(-600, 600);
811
 
                $this->basis_matrix[0][2] = (mt_rand(0, 1) * 2000) - 1000;
812
 
                $this->basis_matrix[1][0] = mt_rand(-1000, 1000);
813
 
                $this->basis_matrix[1][1] = mt_rand(-1000, 1000);
814
 
                $this->basis_matrix[1][2] = mt_rand(-1000, 1000);
815
 
 
816
 
                $this->normalize($this->basis_matrix[0]);
817
 
                $this->normalize($this->basis_matrix[1]);
818
 
                $this->basis_matrix[2] = $this->cross_product($this->basis_matrix[0], $this->basis_matrix[1]);
819
 
                $this->normalize($this->basis_matrix[2]);
820
 
 
821
 
                // $this->basis_matrix[1] might not be (probably isn't) orthogonal to $basis_matrix[0]
822
 
                $this->basis_matrix[1] = $this->cross_product($this->basis_matrix[0], $this->basis_matrix[2]);
823
 
                $this->normalize($this->basis_matrix[1]);
824
 
 
825
 
                // Make sure our cube is facing into the canvas (assuming +z == in)
826
 
                for ($i = 0; $i < 3; ++$i)
827
 
                {
828
 
                        if ($this->basis_matrix[$i][2] < 0)
829
 
                        {
830
 
                                $this->basis_matrix[$i][0] *= -1;
831
 
                                $this->basis_matrix[$i][1] *= -1;
832
 
                                $this->basis_matrix[$i][2] *= -1;
833
 
                        }
834
 
                }
835
 
 
836
 
                // Force our "z" basis vector to be the one with greatest absolute z value
837
 
                $this->x = 0;
838
 
                $this->y = 1;
839
 
                $this->z = 2;
840
 
 
841
 
                // Swap "y" with "z"
842
 
                if ($this->basis_matrix[1][2] > $this->basis_matrix[2][2])
843
 
                {
844
 
                        $this->z = 1;
845
 
                        $this->y = 2;
846
 
                }
847
 
 
848
 
                // Swap "x" with "z"
849
 
                if ($this->basis_matrix[0][2] > $this->basis_matrix[$this->z][2])
850
 
                {
851
 
                        $this->x = $this->z;
852
 
                        $this->z = 0;
853
 
                }
854
 
 
855
 
                // Still need to determine which of $x,$y are which.
856
 
                // wrong orientation if y's y-component is less than it's x-component
857
 
                // likewise if x's x-component is less than it's y-component
858
 
                // if they disagree, go with the one with the greater weight difference.
859
 
                // rotate if positive
860
 
                $weight = (abs($this->basis_matrix[$this->x][1]) - abs($this->basis_matrix[$this->x][0])) + (abs($this->basis_matrix[$this->y][0]) - abs($this->basis_matrix[$this->y][1]));
861
 
 
862
 
                // Swap "x" with "y"
863
 
                if ($weight > 0)
864
 
                {
865
 
                        list($this->x, $this->y) = array($this->y, $this->x);
866
 
                }
867
 
 
868
 
                $this->abs_x = array($this->basis_matrix[$this->x][0], $this->basis_matrix[$this->x][1]);
869
 
                $this->abs_y = array($this->basis_matrix[$this->y][0], $this->basis_matrix[$this->y][1]);
870
 
 
871
 
                if ($this->abs_x[0] < 0)
872
 
                {
873
 
                        $this->abs_x[0] *= -1;
874
 
                        $this->abs_x[1] *= -1;
875
 
                }
876
 
 
877
 
                if ($this->abs_y[1] > 0)
878
 
                {
879
 
                        $this->abs_y[0] *= -1;
880
 
                        $this->abs_y[1] *= -1;
881
 
                }
882
 
 
883
 
                $this->letter = $letter;
884
 
        }
885
 
 
886
 
        /**
887
 
        * Draw a character
888
 
        */
889
 
        function drawchar($scale, $xoff, $yoff, $img, $background, $colours)
890
 
        {
891
 
                $width  = $this->bitmap_width;
892
 
                $height = $this->bitmap_height;
893
 
                $bitmap = $this->bitmap;
894
 
 
895
 
                $colour1 = $colours[array_rand($colours)];
896
 
                $colour2 = $colours[array_rand($colours)];
897
 
 
898
 
                $swapx = ($this->basis_matrix[$this->x][0] > 0);
899
 
                $swapy = ($this->basis_matrix[$this->y][1] < 0);
900
 
 
901
 
                for ($y = 0; $y < $height; ++$y)
902
 
                {
903
 
                        for ($x = 0; $x < $width; ++$x)
904
 
                        {
905
 
                                $xp = ($swapx) ? ($width - $x - 1) : $x;
906
 
                                $yp = ($swapy) ? ($height - $y - 1) : $y;
907
 
 
908
 
                                if ($bitmap[$height - $yp - 1][$xp])
909
 
                                {
910
 
                                        $dx = $this->scale($this->abs_x, ($xp - ($swapx ? ($width / 2) : ($width / 2) - 1)) * $scale);
911
 
                                        $dy = $this->scale($this->abs_y, ($yp - ($swapy ? ($height / 2) : ($height / 2) - 1)) * $scale);
912
 
                                        $xo = $xoff + $dx[0] + $dy[0];
913
 
                                        $yo = $yoff + $dx[1] + $dy[1];
914
 
 
915
 
                                        $origin = array(0, 0, 0);
916
 
                                        $xvec = $this->scale($this->basis_matrix[$this->x], $scale);
917
 
                                        $yvec = $this->scale($this->basis_matrix[$this->y], $scale);
918
 
                                        $face_corner = $this->sum2($xvec, $yvec);
919
 
 
920
 
                                        $zvec = $this->scale($this->basis_matrix[$this->z], $scale);
921
 
                                        $x_corner = $this->sum2($xvec, $zvec);
922
 
                                        $y_corner = $this->sum2($yvec, $zvec);
923
 
 
924
 
                                        imagefilledpolygon($img, $this->gen_poly($xo, $yo, $origin, $xvec, $x_corner,$zvec), 4, $colour1);
925
 
                                        imagefilledpolygon($img, $this->gen_poly($xo, $yo, $origin, $yvec, $y_corner,$zvec), 4, $colour2);
926
 
 
927
 
                                        $face = $this->gen_poly($xo, $yo, $origin, $xvec, $face_corner, $yvec);
928
 
 
929
 
                                        imagefilledpolygon($img, $face, 4, $background);
930
 
                                        imagepolygon($img, $face, 4, $colour1);
931
 
                                }
932
 
                        }
933
 
                }
934
 
        }
935
 
 
936
 
        /*
937
 
        * return a roughly acceptable range of sizes for rendering with this texttype
938
 
        */
939
 
        function range()
940
 
        {
941
 
                return array(3, 4);
942
 
        }
943
 
 
944
 
        /**
945
 
        * Vector length
946
 
        */
947
 
        function vectorlen($vector)
948
 
        {
949
 
                return sqrt(pow($vector[0], 2) + pow($vector[1], 2) + pow($vector[2], 2));
950
 
        }
951
 
 
952
 
        /**
953
 
        * Normalize
954
 
        */
955
 
        function normalize(&$vector, $length = 1)
956
 
        {
957
 
                $length = (( $length < 1) ? 1 : $length);
958
 
                $length /= $this->vectorlen($vector);
959
 
                $vector[0] *= $length;
960
 
                $vector[1] *= $length;
961
 
                $vector[2] *= $length;
962
 
        }
963
 
 
964
 
        /**
965
 
        */
966
 
        function cross_product($vector1, $vector2)
967
 
        {
968
 
                $retval = array(0, 0, 0);
969
 
                $retval[0] =  (($vector1[1] * $vector2[2]) - ($vector1[2] * $vector2[1]));
970
 
                $retval[1] = -(($vector1[0] * $vector2[2]) - ($vector1[2] * $vector2[0]));
971
 
                $retval[2] =  (($vector1[0] * $vector2[1]) - ($vector1[1] * $vector2[0]));
972
 
 
973
 
                return $retval;
974
 
        }
975
 
 
976
 
        /**
977
 
        */
978
 
        function sum($vector1, $vector2)
979
 
        {
980
 
                return array($vector1[0] + $vector2[0], $vector1[1] + $vector2[1], $vector1[2] + $vector2[2]);
981
 
        }
982
 
 
983
 
        /**
984
 
        */
985
 
        function sum2($vector1, $vector2)
986
 
        {
987
 
                return array($vector1[0] + $vector2[0], $vector1[1] + $vector2[1]);
988
 
        }
989
 
 
990
 
        /**
991
 
        */
992
 
        function scale($vector, $length)
993
 
        {
994
 
                if (sizeof($vector) == 2)
995
 
                {
996
 
                        return array($vector[0] * $length, $vector[1] * $length);
997
 
                }
998
 
 
999
 
                return array($vector[0] * $length, $vector[1] * $length, $vector[2] * $length);
1000
 
        }
1001
 
 
1002
 
        /**
1003
 
        */
1004
 
        function gen_poly($xoff, $yoff, &$vec1, &$vec2, &$vec3, &$vec4)
1005
 
        {
1006
 
                $poly = array();
1007
 
                $poly[0] = $xoff + $vec1[0];
1008
 
                $poly[1] = $yoff + $vec1[1];
1009
 
                $poly[2] = $xoff + $vec2[0];
1010
 
                $poly[3] = $yoff + $vec2[1];
1011
 
                $poly[4] = $xoff + $vec3[0];
1012
 
                $poly[5] = $yoff + $vec3[1];
1013
 
                $poly[6] = $xoff + $vec4[0];
1014
 
                $poly[7] = $yoff + $vec4[1];
1015
 
 
1016
 
                return $poly;
1017
 
        }
1018
 
 
1019
 
        /**
1020
 
        * dimensions
1021
 
        */
1022
 
        function dimensions($size)
1023
 
        {
1024
 
                $xn = $this->scale($this->basis_matrix[$this->x], -($this->bitmap_width / 2) * $size);
1025
 
                $xp = $this->scale($this->basis_matrix[$this->x], ($this->bitmap_width / 2) * $size);
1026
 
                $yn = $this->scale($this->basis_matrix[$this->y], -($this->bitmap_height / 2) * $size);
1027
 
                $yp = $this->scale($this->basis_matrix[$this->y], ($this->bitmap_height / 2) * $size);
1028
 
 
1029
 
                $p = array();
1030
 
                $p[0] = $this->sum2($xn, $yn);
1031
 
                $p[1] = $this->sum2($xp, $yn);
1032
 
                $p[2] = $this->sum2($xp, $yp);
1033
 
                $p[3] = $this->sum2($xn, $yp);
1034
 
 
1035
 
                $min_x = $max_x = $p[0][0];
1036
 
                $min_y = $max_y = $p[0][1];
1037
 
 
1038
 
                for ($i = 1; $i < 4; ++$i)
1039
 
                {
1040
 
                        $min_x = ($min_x > $p[$i][0]) ? $p[$i][0] : $min_x;
1041
 
                        $min_y = ($min_y > $p[$i][1]) ? $p[$i][1] : $min_y;
1042
 
                        $max_x = ($max_x < $p[$i][0]) ? $p[$i][0] : $max_x;
1043
 
                        $max_y = ($max_y < $p[$i][1]) ? $p[$i][1] : $max_y;
1044
 
                }
1045
 
 
1046
 
                return array($min_x, $min_y, $max_x, $max_y);
1047
 
        }
1048
 
}
1049
 
 
1050
 
/**
1051
 
* @package VC
1052
 
*/
1053
 
class colour_manager
1054
 
{
1055
 
        var $img;
1056
 
        var $mode;
1057
 
        var $colours;
1058
 
        var $named_colours;
1059
 
 
1060
 
        /**
1061
 
        * Create the colour manager, link it to the image resource
1062
 
        */
1063
 
        function colour_manager($img, $background = false, $mode = 'ahsv')
1064
 
        {
1065
 
                $this->img = $img;
1066
 
                $this->mode = $mode;
1067
 
                $this->colours = array();
1068
 
                $this->named_colours = array();
1069
 
 
1070
 
                if ($background !== false)
1071
 
                {
1072
 
                        $bg = $this->allocate_named('background', $background);
1073
 
                        imagefill($this->img, 0, 0, $bg);
1074
 
                }
1075
 
        }
1076
 
 
1077
 
        /**
1078
 
        * Lookup a named colour resource
1079
 
        */
1080
 
        function get_resource($named_colour)
1081
 
        {
1082
 
                if (isset($this->named_colours[$named_colour]))
1083
 
                {
1084
 
                        return $this->named_colours[$named_colour];
1085
 
                }
1086
 
 
1087
 
                if (isset($this->named_rgb[$named_colour]))
1088
 
                {
1089
 
                        return $this->allocate_named($named_colour, $this->named_rgb[$named_colour], 'rgb');
1090
 
                }
1091
 
 
1092
 
                return false;
1093
 
        }
1094
 
 
1095
 
        /**
1096
 
        * Assign a name to a colour resource
1097
 
        */
1098
 
        function name_colour($name, $resource)
1099
 
        {
1100
 
                $this->named_colours[$name] = $resource;
1101
 
        }
1102
 
 
1103
 
        /**
1104
 
        * names and allocates a colour resource
1105
 
        */
1106
 
        function allocate_named($name, $colour, $mode = false)
1107
 
        {
1108
 
                $resource = $this->allocate($colour, $mode);
1109
 
 
1110
 
                if ($resource !== false)
1111
 
                {
1112
 
                        $this->name_colour($name, $resource);
1113
 
                }
1114
 
                return $resource;
1115
 
        }
1116
 
 
1117
 
        /**
1118
 
        * allocates a specified colour into the image
1119
 
        */
1120
 
        function allocate($colour, $mode = false)
1121
 
        {
1122
 
                if ($mode === false)
1123
 
                {
1124
 
                        $mode = $this->mode;
1125
 
                }
1126
 
                
1127
 
                if (!is_array($colour))
1128
 
                {
1129
 
                        if (isset($this->named_rgb[$colour]))
1130
 
                        {
1131
 
                                return $this->allocate_named($colour, $this->named_rgb[$colour], 'rgb');
1132
 
                        }
1133
 
 
1134
 
                        if (!is_int($colour))
1135
 
                        {
1136
 
                                return false;
1137
 
                        }
1138
 
 
1139
 
                        $mode = 'rgb';
1140
 
                        $colour = array(255 & ($colour >> 16), 255 & ($colour >>  8), 255 & $colour);
1141
 
                }
1142
 
 
1143
 
                if (isset($colour['mode']))
1144
 
                {
1145
 
                        $mode = $colour['mode'];
1146
 
                        unset($colour['mode']);
1147
 
                }
1148
 
 
1149
 
                if (isset($colour['random']))
1150
 
                {
1151
 
                        unset($colour['random']);
1152
 
                        // everything else is params
1153
 
                        return $this->random_colour($colour, $mode);
1154
 
                }
1155
 
 
1156
 
                $rgb            = colour_manager::model_convert($colour, $mode, 'rgb');
1157
 
                $store          = ($this->mode == 'rgb') ? $rgb : colour_manager::model_convert($colour, $mode, $this->mode);
1158
 
                $resource       = imagecolorallocate($this->img, $rgb[0], $rgb[1], $rgb[2]);
1159
 
                $this->colours[$resource] = $store;
1160
 
 
1161
 
                return $resource;
1162
 
        }
1163
 
 
1164
 
        /**
1165
 
        * randomly generates a colour, with optional params
1166
 
        */
1167
 
        function random_colour($params = array(), $mode = false)
1168
 
        {
1169
 
                if ($mode === false)
1170
 
                {
1171
 
                        $mode = $this->mode;
1172
 
                }
1173
 
 
1174
 
                switch ($mode)
1175
 
                {
1176
 
                        case 'rgb':
1177
 
                                // @TODO random rgb generation. do we intend to do this, or is it just too tedious?
1178
 
                        break;
1179
 
 
1180
 
                        case 'ahsv':
1181
 
                        case 'hsv':
1182
 
                        default:
1183
 
 
1184
 
                                $default_params = array(
1185
 
                                        'hue_bias'                      => false,       // degree / 'r'/'g'/'b'/'c'/'m'/'y'   /'o'
1186
 
                                        'hue_range'                     => false,       // if hue bias, then difference range +/- from bias
1187
 
                                        'min_saturation'        => 30,          // 0 - 100
1188
 
                                        'max_saturation'        => 80,          // 0 - 100
1189
 
                                        'min_value'                     => 30,          // 0 - 100
1190
 
                                        'max_value'                     => 80,          // 0 - 100
1191
 
                                );
1192
 
 
1193
 
                                $alt = ($mode == 'ahsv') ? true : false;
1194
 
                                $params = array_merge($default_params, $params);
1195
 
 
1196
 
                                $min_hue                = 0;
1197
 
                                $max_hue                = 359;
1198
 
                                $min_saturation = max(0, $params['min_saturation']);
1199
 
                                $max_saturation = min(100, $params['max_saturation']);
1200
 
                                $min_value              = max(0, $params['min_value']);
1201
 
                                $max_value              = min(100, $params['max_value']);
1202
 
 
1203
 
                                if ($params['hue_bias'] !== false)
1204
 
                                {
1205
 
                                        if (is_numeric($params['hue_bias']))
1206
 
                                        {
1207
 
                                                $h = intval($params['hue_bias']) % 360;
1208
 
                                        }
1209
 
                                        else
1210
 
                                        {
1211
 
                                                switch ($params['hue_bias'])
1212
 
                                                {
1213
 
                                                        case 'o':
1214
 
                                                                $h = $alt ?  60 :  30;
1215
 
                                                        break;
1216
 
 
1217
 
                                                        case 'y':
1218
 
                                                                $h = $alt ? 120 :  60;
1219
 
                                                        break;
1220
 
 
1221
 
                                                        case 'g':
1222
 
                                                                $h = $alt ? 180 : 120;
1223
 
                                                        break;
1224
 
 
1225
 
                                                        case 'c':
1226
 
                                                                $h = $alt ? 210 : 180;
1227
 
                                                        break;
1228
 
 
1229
 
                                                        case 'b':
1230
 
                                                                $h = 240;
1231
 
                                                        break;
1232
 
 
1233
 
                                                        case 'm':
1234
 
                                                                $h = 300;
1235
 
                                                        break;
1236
 
 
1237
 
                                                        case 'r':
1238
 
                                                        default:
1239
 
                                                                $h = 0;
1240
 
                                                        break;
1241
 
                                                }
1242
 
                                        }
1243
 
 
1244
 
                                        $min_hue = $h + 360;
1245
 
                                        $max_hue = $h + 360;
1246
 
 
1247
 
                                        if ($params['hue_range'])
1248
 
                                        {
1249
 
                                                $min_hue -= min(180, $params['hue_range']);
1250
 
                                                $max_hue += min(180, $params['hue_range']);
1251
 
                                        }
1252
 
                                }
1253
 
 
1254
 
                                $h = mt_rand($min_hue, $max_hue);
1255
 
                                $s = mt_rand($min_saturation, $max_saturation);
1256
 
                                $v = mt_rand($min_value, $max_value);
1257
 
 
1258
 
                                return $this->allocate(array($h, $s, $v), $mode);
1259
 
 
1260
 
                        break;
1261
 
                }
1262
 
        }
1263
 
 
1264
 
        /**
1265
 
        */
1266
 
        function colour_scheme($resource, $include_original = true)
1267
 
        {
1268
 
                $mode = 'hsv';
1269
 
 
1270
 
                if (($pre = $this->get_resource($resource)) !== false)
1271
 
                {
1272
 
                        $resource = $pre;
1273
 
                }
1274
 
 
1275
 
                $colour = colour_manager::model_convert($this->colours[$resource], $this->mode, $mode);
1276
 
                $results = ($include_original) ? array($resource) : array();
1277
 
                $colour2 = $colour3 = $colour4 = $colour;
1278
 
                $colour2[0] += 150;
1279
 
                $colour3[0] += 180;
1280
 
                $colour4[0] += 210;
1281
 
 
1282
 
 
1283
 
                $results[] = $this->allocate($colour2, $mode);
1284
 
                $results[] = $this->allocate($colour3, $mode);
1285
 
                $results[] = $this->allocate($colour4, $mode);
1286
 
 
1287
 
                return $results;
1288
 
        }
1289
 
 
1290
 
        /**
1291
 
        */
1292
 
        function mono_range($resource, $count = 5, $include_original = true)
1293
 
        {
1294
 
                if (is_array($resource))
1295
 
                {
1296
 
                        $results = array();
1297
 
                        for ($i = 0, $size = sizeof($resource); $i < $size; ++$i)
1298
 
                        {
1299
 
                                $results = array_merge($results, $this->mono_range($resource[$i], $count, $include_original));
1300
 
                        }
1301
 
                        return $results;
1302
 
                }
1303
 
 
1304
 
                $mode = (in_array($this->mode, array('hsv', 'ahsv'), true) ? $this->mode : 'ahsv');
1305
 
                if (($pre = $this->get_resource($resource)) !== false)
1306
 
                {
1307
 
                        $resource = $pre;
1308
 
                }
1309
 
 
1310
 
                $colour = colour_manager::model_convert($this->colours[$resource], $this->mode, $mode);
1311
 
 
1312
 
                $results = array();
1313
 
                if ($include_original)
1314
 
                {
1315
 
                        $results[] = $resource;
1316
 
                        $count--;
1317
 
                }
1318
 
 
1319
 
                // This is a hard problem. I chicken out and try to maintain readability at the cost of less randomness.
1320
 
                
1321
 
                while ($count > 0)
1322
 
                {
1323
 
                        $colour[1] = ($colour[1] + mt_rand(40,60)) % 99;
1324
 
                        $colour[2] = ($colour[2] + mt_rand(40,60));
1325
 
                        $results[] = $this->allocate($colour, $mode);
1326
 
                        $count--;
1327
 
                }
1328
 
                return $results;
1329
 
        }
1330
 
 
1331
 
        /**
1332
 
        * Convert from one colour model to another
1333
 
        */
1334
 
        function model_convert($colour, $from_model, $to_model)
1335
 
        {
1336
 
                if ($from_model == $to_model)
1337
 
                {
1338
 
                        return $colour;
1339
 
                }
1340
 
 
1341
 
                switch ($to_model)
1342
 
                {
1343
 
                        case 'hsv':
1344
 
 
1345
 
                                switch ($from_model)
1346
 
                                {
1347
 
                                        case 'ahsv':
1348
 
                                                return colour_manager::ah2h($colour);
1349
 
                                        break;
1350
 
 
1351
 
                                        case 'rgb':
1352
 
                                                return colour_manager::rgb2hsv($colour);
1353
 
                                        break;
1354
 
                                }
1355
 
                        break;
1356
 
 
1357
 
                        case 'ahsv':
1358
 
 
1359
 
                                switch ($from_model)
1360
 
                                {
1361
 
                                        case 'hsv':
1362
 
                                                return colour_manager::h2ah($colour);
1363
 
                                        break;
1364
 
 
1365
 
                                        case 'rgb':
1366
 
                                                return colour_manager::h2ah(colour_manager::rgb2hsv($colour));
1367
 
                                        break;
1368
 
                                }
1369
 
                        break;
1370
 
 
1371
 
                        case 'rgb':
1372
 
                                switch ($from_model)
1373
 
                                {
1374
 
                                        case 'hsv':
1375
 
                                                return colour_manager::hsv2rgb($colour);
1376
 
                                        break;
1377
 
 
1378
 
                                        case 'ahsv':
1379
 
                                                return colour_manager::hsv2rgb(colour_manager::ah2h($colour));
1380
 
                                        break;
1381
 
                                }
1382
 
                        break;
1383
 
                }
1384
 
                return false;
1385
 
        }
1386
 
 
1387
 
        /**
1388
 
        * Slightly altered from wikipedia's algorithm
1389
 
        */
1390
 
        function hsv2rgb($hsv)
1391
 
        {
1392
 
                colour_manager::normalize_hue($hsv[0]);
1393
 
 
1394
 
                $h = $hsv[0];
1395
 
                $s = min(1, max(0, $hsv[1] / 100));
1396
 
                $v = min(1, max(0, $hsv[2] / 100));
1397
 
 
1398
 
                // calculate hue sector
1399
 
                $hi = floor($hsv[0] / 60);
1400
 
 
1401
 
                // calculate opposite colour
1402
 
                $p = $v * (1 - $s);
1403
 
 
1404
 
                // calculate distance between hex vertices
1405
 
                $f = ($h / 60) - $hi;
1406
 
 
1407
 
                // coming in or going out?
1408
 
                if (!($hi & 1))
1409
 
                {
1410
 
                        $f = 1 - $f;
1411
 
                }
1412
 
 
1413
 
                // calculate adjacent colour
1414
 
                $q = $v * (1 - ($f * $s));
1415
 
 
1416
 
                switch ($hi)
1417
 
                {
1418
 
                        case 0:
1419
 
                                $rgb = array($v, $q, $p);
1420
 
                        break;
1421
 
 
1422
 
                        case 1:
1423
 
                                $rgb = array($q, $v, $p);
1424
 
                        break;
1425
 
 
1426
 
                        case 2:
1427
 
                                $rgb = array($p, $v, $q);
1428
 
                        break;
1429
 
 
1430
 
                        case 3:
1431
 
                                $rgb = array($p, $q, $v);
1432
 
                        break;
1433
 
 
1434
 
                        case 4:
1435
 
                                $rgb = array($q, $p, $v);
1436
 
                        break;
1437
 
 
1438
 
                        case 5:
1439
 
                                $rgb = array($v, $p, $q);
1440
 
                        break;
1441
 
 
1442
 
                        default:
1443
 
                                return array(0, 0, 0);
1444
 
                        break;
1445
 
                }
1446
 
 
1447
 
                return array(255 * $rgb[0], 255 * $rgb[1], 255 * $rgb[2]);
1448
 
        }
1449
 
 
1450
 
        /**
1451
 
        * (more than) Slightly altered from wikipedia's algorithm
1452
 
        */
1453
 
        function rgb2hsv($rgb)
1454
 
        {
1455
 
                $r = min(255, max(0, $rgb[0]));
1456
 
                $g = min(255, max(0, $rgb[1]));
1457
 
                $b = min(255, max(0, $rgb[2]));
1458
 
                $max = max($r, $g, $b);
1459
 
                $min = min($r, $g, $b);
1460
 
 
1461
 
                $v = $max / 255;
1462
 
                $s = (!$max) ? 0 : 1 - ($min / $max);
1463
 
 
1464
 
                // if max - min is 0, we want hue to be 0 anyway.
1465
 
                $h = $max - $min;
1466
 
 
1467
 
                if ($h)
1468
 
                {
1469
 
                        switch ($max)
1470
 
                        {
1471
 
                                case $g:
1472
 
                                        $h = 120 + (60 * ($b - $r) / $h);
1473
 
                                break;
1474
 
 
1475
 
                                case $b:
1476
 
                                        $h = 240 + (60 * ($r - $g) / $h);
1477
 
                                break;
1478
 
 
1479
 
                                case $r:
1480
 
                                        $h = 360 + (60 * ($g - $b) / $h);
1481
 
                                break;
1482
 
                        }
1483
 
                }
1484
 
                colour_manager::normalize_hue($h);
1485
 
 
1486
 
                return array($h, $s * 100, $v * 100);
1487
 
        }
1488
 
 
1489
 
        /**
1490
 
        */
1491
 
        function normalize_hue(&$hue)
1492
 
        {
1493
 
                $hue %= 360;
1494
 
 
1495
 
                if ($hue < 0)
1496
 
                {
1497
 
                        $hue += 360;
1498
 
                }
1499
 
        }
1500
 
 
1501
 
        /**
1502
 
        * Alternate hue to hue
1503
 
        */
1504
 
        function ah2h($ahue)
1505
 
        {
1506
 
                if (is_array($ahue))
1507
 
                {
1508
 
                        $ahue[0] = colour_manager::ah2h($ahue[0]);
1509
 
                        return $ahue;
1510
 
                }
1511
 
                colour_manager::normalize_hue($ahue);
1512
 
 
1513
 
                // blue through red is already ok
1514
 
                if ($ahue >= 240)
1515
 
                {
1516
 
                        return $ahue;
1517
 
                }
1518
 
 
1519
 
                // ahue green is at 180
1520
 
                if ($ahue >= 180)
1521
 
                {
1522
 
                        // return (240 - (2 * (240 - $ahue)));
1523
 
                        return (2 * $ahue) - 240; // equivalent
1524
 
                }
1525
 
 
1526
 
                // ahue yellow is at 120   (RYB rather than RGB)
1527
 
                if ($ahue >= 120)
1528
 
                {
1529
 
                        return $ahue - 60;
1530
 
                }
1531
 
 
1532
 
                return $ahue / 2;
1533
 
        }
1534
 
 
1535
 
        /**
1536
 
        * hue to Alternate hue
1537
 
        */
1538
 
        function h2ah($hue)
1539
 
        {
1540
 
                if (is_array($hue))
1541
 
                {
1542
 
                        $hue[0] = colour_manager::h2ah($hue[0]);
1543
 
                        return $hue;
1544
 
                }
1545
 
                colour_manager::normalize_hue($hue);
1546
 
 
1547
 
                // blue through red is already ok
1548
 
                if ($hue >= 240)
1549
 
                {
1550
 
                        return $hue;
1551
 
                }
1552
 
                else if ($hue <= 60)
1553
 
                {
1554
 
                        return $hue * 2;
1555
 
                }
1556
 
                else if ($hue <= 120)
1557
 
                {
1558
 
                        return $hue + 60;
1559
 
                }
1560
 
                else
1561
 
                {
1562
 
                        return ($hue + 240) / 2;
1563
 
                }
1564
 
        }
1565
 
}
1566
 
 
1567
 
?>
 
 
b'\\ No newline at end of file'