PageRenderTime 63ms CodeModel.GetById 9ms RepoModel.GetById 0ms app.codeStats 1ms

/includes/captcha/captcha_gd.php

http://github.com/MightyGorgon/icy_phoenix
PHP | 2644 lines | 2336 code | 173 blank | 135 comment | 80 complexity | 16d61ae97d6138af25238f0295edc912 MD5 | raw file
Possible License(s): AGPL-1.0
  1. <?php
  2. /**
  3. *
  4. * @package Icy Phoenix
  5. * @version $Id$
  6. * @copyright (c) 2008 Icy Phoenix
  7. * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  8. *
  9. */
  10. /**
  11. *
  12. * @Icy Phoenix is based on phpBB
  13. * @copyright (c) 2008 phpBB Group
  14. *
  15. */
  16. if (!defined('IN_ICYPHOENIX'))
  17. {
  18. die('Hacking attempt');
  19. }
  20. /**
  21. * Original Author - Xore (Robert Hetzler)
  22. * With contributions from Neothermic
  23. *
  24. * @package VC
  25. */
  26. class captcha
  27. {
  28. var $width = 360;
  29. var $height = 96;
  30. /**
  31. * Create the image containing $code with a seed of $seed
  32. */
  33. function execute($code, $seed)
  34. {
  35. global $config;
  36. mt_srand($seed);
  37. // Create image
  38. $img = imagecreatetruecolor($this->width, $this->height);
  39. // Generate colours
  40. $colour = new colour_manager($img, array(
  41. 'random' => true,
  42. 'min_value' => 60,
  43. ), 'hsv');
  44. $scheme = $colour->colour_scheme('background', false);
  45. $scheme = $colour->mono_range($scheme, 10, false);
  46. shuffle($scheme);
  47. $bg_colours = array_splice($scheme, mt_rand(6, 12));
  48. // Generate code characters
  49. $characters = $sizes = $bounding_boxes = $noise = array();
  50. $width_avail = $this->width - 15;
  51. $code_len = strlen($code);
  52. $captcha_bitmaps = $this->captcha_bitmaps();
  53. for ($i = 0; $i < $code_len; ++$i)
  54. {
  55. $characters[$i] = new char_cube3d($captcha_bitmaps, $code[$i]);
  56. list($min, $max) = $characters[$i]->range();
  57. $sizes[$i] = mt_rand($min, $max);
  58. $box = $characters[$i]->dimensions($sizes[$i]);
  59. $width_avail -= ($box[2] - $box[0]);
  60. $bounding_boxes[$i] = $box;
  61. }
  62. // Redistribute leftover x-space
  63. $offset = array();
  64. for ($i = 0; $i < $code_len; ++$i)
  65. {
  66. $denom = ($code_len - $i);
  67. $denom = max(1.3, $denom);
  68. $offset[$i] = mt_rand(0, (1.5 * $width_avail) / $denom);
  69. $width_avail -= $offset[$i];
  70. }
  71. if ($config['captcha_gd_x_grid'])
  72. {
  73. $grid = (int) $config['captcha_gd_x_grid'];
  74. for ($y = 0; $y < $this->height; $y += mt_rand($grid - 2, $grid + 2))
  75. {
  76. $current_colour = $scheme[array_rand($scheme)];
  77. 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);
  78. }
  79. }
  80. if ($config['captcha_gd_y_grid'])
  81. {
  82. $grid = (int) $config['captcha_gd_y_grid'];
  83. for ($x = 0; $x < $this->width; $x += mt_rand($grid - 2, $grid + 2))
  84. {
  85. $current_colour = $scheme[array_rand($scheme)];
  86. 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);
  87. }
  88. }
  89. if ($config['captcha_gd_wave'] && ($config['captcha_gd_y_grid'] || $config['captcha_gd_y_grid']))
  90. {
  91. $this->wave($img);
  92. }
  93. if ($config['captcha_gd_3d_noise'])
  94. {
  95. $xoffset = mt_rand(0,9);
  96. $noise_bitmaps = $this->captcha_noise_bg_bitmaps();
  97. for ($i = 0; $i < $code_len; ++$i)
  98. {
  99. $noise[$i] = new char_cube3d($noise_bitmaps, mt_rand(1, count($noise_bitmaps['data'])));
  100. list($min, $max) = $noise[$i]->range();
  101. //$box = $noise[$i]->dimensions($sizes[$i]);
  102. }
  103. $xoffset = 0;
  104. for ($i = 0; $i < $code_len; ++$i)
  105. {
  106. $dimm = $bounding_boxes[$i];
  107. $xoffset += ($offset[$i] - $dimm[0]);
  108. $yoffset = mt_rand(-$dimm[1], $this->height - $dimm[3]);
  109. $noise[$i]->drawchar($sizes[$i], $xoffset, $yoffset, $img, $colour->get_resource('background'), $scheme);
  110. $xoffset += $dimm[2];
  111. }
  112. }
  113. $xoffset = 5;
  114. for ($i = 0; $i < $code_len; ++$i)
  115. {
  116. $dimm = $bounding_boxes[$i];
  117. $xoffset += ($offset[$i] - $dimm[0]);
  118. $yoffset = mt_rand(-$dimm[1], $this->height - $dimm[3]);
  119. $characters[$i]->drawchar($sizes[$i], $xoffset, $yoffset, $img, $colour->get_resource('background'), $scheme);
  120. $xoffset += $dimm[2];
  121. }
  122. if ($config['captcha_gd_wave'])
  123. {
  124. $this->wave($img);
  125. }
  126. if ($config['captcha_gd_foreground_noise'])
  127. {
  128. $this->noise_line($img, 0, 0, $this->width, $this->height, $colour->get_resource('background'), $scheme, $bg_colours);
  129. }
  130. // Send image
  131. header('Content-Type: image/png');
  132. header('Cache-control: no-cache, no-store');
  133. imagepng($img);
  134. imagedestroy($img);
  135. }
  136. /**
  137. * Sinus
  138. */
  139. function wave($img)
  140. {
  141. global $config;
  142. $period_x = mt_rand(12, 18);
  143. $period_y = mt_rand(7, 14);
  144. $amp_x = mt_rand(5, 10);
  145. $amp_y = mt_rand(2, 4);
  146. $socket = mt_rand(0, 100);
  147. $dampen_x = mt_rand($this->width / 5, $this->width / 2);
  148. $dampen_y = mt_rand($this->height / 5, $this->height / 2);
  149. $direction_x = (mt_rand (0, 1));
  150. $direction_y = (mt_rand (0, 1));
  151. for ($i = 0; $i < $this->width; $i++)
  152. {
  153. $dir = ($direction_x) ? $i : ($this->width - $i);
  154. imagecopy($img, $img, $i - 1, sin($socket+ $i/($period_x + $dir/$dampen_x)) * $amp_x, $i, 0, 1, $this->height);
  155. }
  156. $socket = mt_rand(0, 100);
  157. for ($i = 0; $i < $this->height; $i++)
  158. {
  159. $dir = ($direction_y) ? $i : ($this->height - $i);
  160. imagecopy($img, $img, sin($socket + $i/($period_y + ($dir)/$dampen_y)) * $amp_y, $i - 1, 0, $i, $this->width, 1);
  161. }
  162. return $img;
  163. }
  164. /**
  165. * Noise line
  166. */
  167. function noise_line($img, $min_x, $min_y, $max_x, $max_y, $bg, $font, $non_font)
  168. {
  169. imagesetthickness($img, 2);
  170. $x1 = $min_x;
  171. $x2 = $max_x;
  172. $y1 = $min_y;
  173. $y2 = $min_y;
  174. do
  175. {
  176. $line = array_merge(
  177. array_fill(0, mt_rand(30, 60), $non_font[array_rand($non_font)]),
  178. array_fill(0, mt_rand(30, 60), $bg)
  179. );
  180. imagesetstyle($img, $line);
  181. imageline($img, $x1, $y1, $x2, $y2, IMG_COLOR_STYLED);
  182. $y1 += mt_rand(12, 35);
  183. $y2 += mt_rand(12, 35);
  184. }
  185. while ($y1 < $max_y && $y2 < $max_y);
  186. $x1 = $min_x;
  187. $x2 = $min_x;
  188. $y1 = $min_y;
  189. $y2 = $max_y;
  190. do
  191. {
  192. $line = array_merge(
  193. array_fill(0, mt_rand(30, 60), $non_font[array_rand($non_font)]),
  194. array_fill(0, mt_rand(30, 60), $bg)
  195. );
  196. imagesetstyle($img, $line);
  197. imageline($img, $x1, $y1, $x2, $y2, IMG_COLOR_STYLED);
  198. $x1 += mt_rand(20, 35);
  199. $x2 += mt_rand(20, 35);
  200. }
  201. while ($x1 < $max_x && $x2 < $max_x);
  202. imagesetthickness($img, 1);
  203. }
  204. function captcha_noise_bg_bitmaps()
  205. {
  206. return array(
  207. 'width' => 15,
  208. 'height' => 5,
  209. 'data' => array(
  210. 1 => array(
  211. array(1,0,0,0,1,0,0,0,0,0,0,0,0,0,0),
  212. array(1,0,0,0,0,1,0,0,0,0,0,0,0,0,0),
  213. array(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
  214. array(1,0,0,0,0,1,0,0,0,0,0,0,1,0,0),
  215. array(1,0,0,0,0,0,1,0,0,0,0,1,0,0,0),
  216. ),
  217. 2 => array(
  218. array(1,1,mt_rand(0,1),1,0,1,1,1,1,0,0,0,0,0,0),
  219. array(0,0,0,0,0,0,0,1,0,0,0,0,0,0,0),
  220. array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
  221. array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
  222. array(0,0,0,0,0,0,0,0,0,1,1,0,1,1,1),
  223. ),
  224. 3 => array(
  225. array(1,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
  226. array(1,0,0,0,0,0,0,0,0,0,0,0,0,1,0),
  227. array(0,0,0,0,1,0,0,0,0,0,0,0,0,0,1),
  228. array(1,0,0,0,0,0,0,0,0,0,0,0,0,1,0),
  229. array(1,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
  230. ),
  231. 4 => array(
  232. array(1,0,1,0,1,0,0,1,1,0,0,0,0,0,0),
  233. array(0,0,0,0,0,0,0,1,0,0,0,0,0,0,0),
  234. array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
  235. array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
  236. array(1,0,1,0,0,0,0,0,0,0,0,0,0,0,0),
  237. ),
  238. 5 => array(
  239. array(1,1,1,1,0,0,0,1,1,1,0,0,1,0,1),
  240. array(0,0,0,0,0,0,0,1,0,0,0,0,0,0,0),
  241. array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
  242. array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
  243. array(1,0,1,0,0,0,0,0,0,0,0,0,0,0,0),
  244. ),
  245. 6 => array(
  246. array(mt_rand(0,1),mt_rand(0,1),mt_rand(0,1),mt_rand(0,1),mt_rand(0,1),0,mt_rand(0,1),mt_rand(0,1),mt_rand(0,1),mt_rand(0,1),mt_rand(0,1),0,mt_rand(0,1),mt_rand(0,1),mt_rand(0,1)),
  247. array(0,0,0,0,0,0,0,mt_rand(0,1),0,0,0,0,0,0,0),
  248. array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
  249. array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
  250. array(mt_rand(0,1),0,mt_rand(0,1),0,0,0,0,0,0,0,0,0,0,0,0),
  251. ),
  252. 7 => array(
  253. array(0,0,0,0,0,0,0,0,0,0,1,1,0,1,1),
  254. array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
  255. array(0,0,1,1,0,0,0,1,0,0,0,0,0,0,0),
  256. array(0,1,0,0,0,1,0,0,0,0,0,0,0,0,0),
  257. array(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
  258. ),
  259. ));
  260. }
  261. /**
  262. * Return bitmaps
  263. */
  264. function captcha_bitmaps()
  265. {
  266. global $config;
  267. $chars = array(
  268. 'A' => array(
  269. array(
  270. array(0,0,0,0,1,0,0,0,0),
  271. array(0,0,0,1,0,1,0,0,0),
  272. array(0,0,0,1,0,1,0,0,0),
  273. array(0,0,0,1,0,1,0,0,0),
  274. array(0,0,1,0,0,0,1,0,0),
  275. array(0,0,1,0,0,0,1,0,0),
  276. array(0,0,1,0,0,0,1,0,0),
  277. array(0,1,0,0,0,0,0,1,0),
  278. array(0,1,0,0,0,0,0,1,0),
  279. array(0,1,1,1,1,1,1,1,0),
  280. array(0,1,0,0,0,0,0,1,0),
  281. array(1,0,0,0,0,0,0,0,1),
  282. array(1,0,0,0,0,0,0,0,1),
  283. array(1,0,0,0,0,0,0,0,1),
  284. array(1,0,0,0,0,0,0,0,1),
  285. ),
  286. array(
  287. array(0,0,0,0,0,0,0,0,0),
  288. array(0,0,0,0,0,0,0,0,0),
  289. array(0,0,0,0,1,0,0,0,0),
  290. array(0,0,0,1,0,1,0,0,0),
  291. array(0,0,1,1,0,1,1,0,0),
  292. array(0,0,1,0,0,0,1,0,0),
  293. array(0,1,0,0,0,0,0,1,0),
  294. array(0,1,0,0,0,0,0,1,0),
  295. array(0,1,1,1,1,1,1,1,0),
  296. array(0,1,0,0,0,0,0,1,0),
  297. array(0,1,0,0,0,0,0,1,0),
  298. array(0,1,0,0,0,0,0,1,0),
  299. array(0,1,0,0,0,0,0,1,0),
  300. array(0,1,0,0,0,0,0,1,0),
  301. array(1,1,1,0,0,0,1,1,1),
  302. ),
  303. array(
  304. array(0,0,0,0,0,0,0,0,0),
  305. array(0,0,0,0,0,0,0,0,0),
  306. array(0,0,0,0,0,0,0,0,0),
  307. array(0,0,0,0,0,0,0,0,0),
  308. array(0,0,1,1,1,1,1,0,0),
  309. array(0,1,1,0,0,0,1,1,0),
  310. array(1,1,0,0,0,0,0,1,1),
  311. array(1,0,0,0,0,0,0,0,1),
  312. array(0,0,0,0,0,0,0,1,1),
  313. array(0,0,0,0,0,1,1,1,1),
  314. array(0,0,0,1,1,1,0,0,1),
  315. array(0,1,1,1,0,0,0,0,1),
  316. array(1,0,0,0,0,0,0,0,1),
  317. array(1,1,0,0,0,0,1,1,1),
  318. array(0,1,1,1,1,1,1,0,1),
  319. ),
  320. ),
  321. 'B' => array(
  322. array(
  323. array(1,1,1,1,1,1,1,0,0),
  324. array(1,0,0,0,0,0,0,1,0),
  325. array(1,0,0,0,0,0,0,0,1),
  326. array(1,0,0,0,0,0,0,0,1),
  327. array(1,0,0,0,0,0,0,0,1),
  328. array(1,0,0,0,0,0,0,0,1),
  329. array(1,0,0,0,0,0,0,1,0),
  330. array(1,1,1,1,1,1,1,0,0),
  331. array(1,0,0,0,0,0,0,1,0),
  332. array(1,0,0,0,0,0,0,0,1),
  333. array(1,0,0,0,0,0,0,0,1),
  334. array(1,0,0,0,0,0,0,0,1),
  335. array(1,0,0,0,0,0,0,0,1),
  336. array(1,0,0,0,0,0,0,1,0),
  337. array(1,1,1,1,1,1,1,0,0),
  338. ),
  339. array(
  340. array(1,1,1,1,1,1,1,0,0),
  341. array(0,1,0,0,0,0,0,1,0),
  342. array(0,1,0,0,0,0,0,0,1),
  343. array(0,1,0,0,0,0,0,0,1),
  344. array(0,1,0,0,0,0,0,0,1),
  345. array(0,1,0,0,0,0,0,0,1),
  346. array(0,1,0,0,0,0,0,1,0),
  347. array(0,1,1,1,1,1,1,0,0),
  348. array(0,1,0,0,0,0,0,1,0),
  349. array(0,1,0,0,0,0,0,0,1),
  350. array(0,1,0,0,0,0,0,0,1),
  351. array(0,1,0,0,0,0,0,0,1),
  352. array(0,1,0,0,0,0,0,0,1),
  353. array(0,1,0,0,0,0,0,1,0),
  354. array(1,1,1,1,1,1,1,0,0),
  355. ),
  356. array(
  357. array(0,1,0,0,0,0,0,0,0),
  358. array(0,1,0,0,0,0,0,0,0),
  359. array(0,1,0,0,0,0,0,0,0),
  360. array(0,1,0,0,0,0,0,0,0),
  361. array(0,1,0,0,0,0,0,0,0),
  362. array(0,1,0,0,0,0,0,0,0),
  363. array(0,1,0,0,0,0,0,0,0),
  364. array(0,1,1,1,1,1,1,0,0),
  365. array(0,1,0,0,0,0,0,1,0),
  366. array(0,1,0,0,0,0,0,0,1),
  367. array(0,1,0,0,0,0,0,0,1),
  368. array(0,1,0,0,0,0,0,0,1),
  369. array(0,1,0,0,0,0,0,0,1),
  370. array(0,1,0,0,0,0,0,1,0),
  371. array(0,1,1,1,1,1,1,0,0),
  372. ),
  373. ),
  374. 'C' => array(
  375. array(
  376. array(0,0,1,1,1,1,1,0,0),
  377. array(0,1,0,0,0,0,0,1,0),
  378. array(1,0,0,0,0,0,0,0,1),
  379. array(1,0,0,0,0,0,0,0,1),
  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,0,0,0,0,0,0,0,0),
  387. array(1,0,0,0,0,0,0,0,1),
  388. array(1,0,0,0,0,0,0,0,1),
  389. array(0,1,0,0,0,0,0,1,0),
  390. array(0,0,1,1,1,1,1,0,0),
  391. ),
  392. array(
  393. array(0,0,1,1,1,1,1,0,1),
  394. array(0,1,0,0,0,0,0,1,1),
  395. array(1,0,0,0,0,0,0,0,1),
  396. array(1,0,0,0,0,0,0,0,1),
  397. array(1,0,0,0,0,0,0,0,0),
  398. array(1,0,0,0,0,0,0,0,0),
  399. array(1,0,0,0,0,0,0,0,0),
  400. array(1,0,0,0,0,0,0,0,0),
  401. array(1,0,0,0,0,0,0,0,0),
  402. array(1,0,0,0,0,0,0,0,0),
  403. array(1,0,0,0,0,0,0,0,0),
  404. array(1,0,0,0,0,0,0,0,1),
  405. array(1,0,0,0,0,0,0,0,1),
  406. array(0,1,0,0,0,0,0,1,1),
  407. array(0,0,1,1,1,1,1,0,1),
  408. ),
  409. ),
  410. 'D' => array(
  411. array(
  412. array(1,1,1,1,1,1,1,0,0),
  413. array(1,0,0,0,0,0,0,1,0),
  414. array(1,0,0,0,0,0,0,0,1),
  415. array(1,0,0,0,0,0,0,0,1),
  416. array(1,0,0,0,0,0,0,0,1),
  417. array(1,0,0,0,0,0,0,0,1),
  418. array(1,0,0,0,0,0,0,0,1),
  419. array(1,0,0,0,0,0,0,0,1),
  420. array(1,0,0,0,0,0,0,0,1),
  421. array(1,0,0,0,0,0,0,0,1),
  422. array(1,0,0,0,0,0,0,0,1),
  423. array(1,0,0,0,0,0,0,0,1),
  424. array(1,0,0,0,0,0,0,0,1),
  425. array(1,0,0,0,0,0,0,1,0),
  426. array(1,1,1,1,1,1,1,0,0),
  427. ),
  428. array(
  429. array(1,1,1,1,1,1,1,0,0),
  430. array(0,1,0,0,0,0,0,1,0),
  431. array(0,1,0,0,0,0,0,0,1),
  432. array(0,1,0,0,0,0,0,0,1),
  433. array(0,1,0,0,0,0,0,0,1),
  434. array(0,1,0,0,0,0,0,0,1),
  435. array(0,1,0,0,0,0,0,0,1),
  436. array(0,1,0,0,0,0,0,0,1),
  437. array(0,1,0,0,0,0,0,0,1),
  438. array(0,1,0,0,0,0,0,0,1),
  439. array(0,1,0,0,0,0,0,0,1),
  440. array(0,1,0,0,0,0,0,0,1),
  441. array(0,1,0,0,0,0,0,0,1),
  442. array(0,1,0,0,0,0,0,1,0),
  443. array(1,1,1,1,1,1,1,0,0),
  444. ),
  445. array(
  446. array(0,0,0,0,0,0,0,0,1),
  447. array(0,0,0,0,0,0,0,0,1),
  448. array(0,0,0,0,0,0,0,0,1),
  449. array(0,0,0,0,0,0,0,0,1),
  450. array(0,0,0,0,0,0,0,0,1),
  451. array(0,0,0,0,0,0,0,0,1),
  452. array(0,0,0,0,0,0,0,0,1),
  453. array(0,0,1,1,1,1,1,0,1),
  454. array(0,1,1,0,0,0,1,1,1),
  455. array(0,1,0,0,0,0,0,0,1),
  456. array(0,1,0,0,0,0,0,0,1),
  457. array(0,1,0,0,0,0,0,0,1),
  458. array(0,1,0,0,0,0,0,0,1),
  459. array(0,1,1,0,0,0,1,1,1),
  460. array(0,0,1,1,1,1,1,0,1),
  461. ),
  462. ),
  463. 'E' => array(
  464. array(
  465. array(1,1,1,1,1,1,1,1,1),
  466. array(1,0,0,0,0,0,0,0,0),
  467. array(1,0,0,0,0,0,0,0,0),
  468. array(1,0,0,0,0,0,0,0,0),
  469. array(1,0,0,0,0,0,0,0,0),
  470. array(1,0,0,0,0,0,0,0,0),
  471. array(1,0,0,0,0,0,0,0,0),
  472. array(1,1,1,1,1,1,1,1,0),
  473. array(1,0,0,0,0,0,0,0,0),
  474. array(1,0,0,0,0,0,0,0,0),
  475. array(1,0,0,0,0,0,0,0,0),
  476. array(1,0,0,0,0,0,0,0,0),
  477. array(1,0,0,0,0,0,0,0,0),
  478. array(1,0,0,0,0,0,0,0,0),
  479. array(1,1,1,1,1,1,1,1,1),
  480. ),
  481. array(
  482. array(1,1,1,1,1,1,1,1,1),
  483. array(1,0,0,0,0,0,0,0,1),
  484. array(1,0,0,0,0,0,0,0,0),
  485. array(1,0,0,0,0,0,0,0,0),
  486. array(1,0,0,0,0,0,0,0,0),
  487. array(1,0,0,0,0,0,0,0,0),
  488. array(1,0,0,0,0,0,0,0,0),
  489. array(1,1,1,1,1,1,1,0,0),
  490. array(1,0,0,0,0,0,0,0,0),
  491. array(1,0,0,0,0,0,0,0,0),
  492. array(1,0,0,0,0,0,0,0,0),
  493. array(1,0,0,0,0,0,0,0,0),
  494. array(1,0,0,0,0,0,0,0,0),
  495. array(1,0,0,0,0,0,0,0,1),
  496. array(1,1,1,1,1,1,1,1,1),
  497. ),
  498. array(
  499. array(0,0,0,0,0,0,0,0,0),
  500. array(0,0,0,0,0,0,0,0,0),
  501. array(0,0,0,0,0,0,0,0,0),
  502. array(0,0,0,0,0,0,0,0,0),
  503. array(0,0,0,0,0,0,0,0,0),
  504. array(0,0,0,0,0,0,0,0,0),
  505. array(0,0,0,0,0,0,0,0,0),
  506. array(0,0,1,1,1,1,1,0,0),
  507. array(0,1,1,0,0,0,1,1,0),
  508. array(1,1,0,0,0,0,0,1,1),
  509. array(1,1,1,1,1,1,1,1,1),
  510. array(1,0,0,0,0,0,0,0,0),
  511. array(1,0,0,0,0,0,0,0,1),
  512. array(1,1,0,0,0,0,0,1,1),
  513. array(0,1,1,1,1,1,1,1,0),
  514. ),
  515. ),
  516. 'F' => array(
  517. array(
  518. array(1,1,1,1,1,1,1,1,1),
  519. array(1,0,0,0,0,0,0,0,0),
  520. array(1,0,0,0,0,0,0,0,0),
  521. array(1,0,0,0,0,0,0,0,0),
  522. array(1,0,0,0,0,0,0,0,0),
  523. array(1,0,0,0,0,0,0,0,0),
  524. array(1,0,0,0,0,0,0,0,0),
  525. array(1,1,1,1,1,1,1,0,0),
  526. array(1,0,0,0,0,0,0,0,0),
  527. array(1,0,0,0,0,0,0,0,0),
  528. array(1,0,0,0,0,0,0,0,0),
  529. array(1,0,0,0,0,0,0,0,0),
  530. array(1,0,0,0,0,0,0,0,0),
  531. array(1,0,0,0,0,0,0,0,0),
  532. array(1,0,0,0,0,0,0,0,0),
  533. ),
  534. array(
  535. array(0,1,1,1,1,1,1,1,1),
  536. array(0,1,0,0,0,0,0,0,1),
  537. array(0,1,0,0,0,0,0,0,0),
  538. array(0,1,0,0,0,0,0,0,0),
  539. array(0,1,0,0,0,0,0,0,0),
  540. array(0,1,0,0,0,0,0,0,0),
  541. array(0,1,0,0,0,0,0,0,0),
  542. array(0,1,1,1,1,1,1,0,0),
  543. array(0,1,0,0,0,0,0,0,0),
  544. array(0,1,0,0,0,0,0,0,0),
  545. array(0,1,0,0,0,0,0,0,0),
  546. array(0,1,0,0,0,0,0,0,0),
  547. array(0,1,0,0,0,0,0,0,0),
  548. array(0,1,0,0,0,0,0,0,0),
  549. array(1,1,1,0,0,0,0,0,0),
  550. ),
  551. array(
  552. array(0,0,0,1,1,0,0,0,0),
  553. array(0,0,1,1,0,0,0,0,0),
  554. array(0,1,1,0,0,0,0,0,0),
  555. array(0,1,0,0,0,0,0,0,0),
  556. array(0,1,0,0,0,0,0,0,0),
  557. array(1,1,1,1,0,0,0,0,0),
  558. array(0,1,0,0,0,0,0,0,0),
  559. array(0,1,0,0,0,0,0,0,0),
  560. array(0,1,0,0,0,0,0,0,0),
  561. array(0,1,0,0,0,0,0,0,0),
  562. array(0,1,0,0,0,0,0,0,0),
  563. array(0,1,0,0,0,0,0,0,0),
  564. array(0,1,0,0,0,0,0,0,0),
  565. array(0,1,0,0,0,0,0,0,0),
  566. array(0,1,0,0,0,0,0,0,0),
  567. ),
  568. ),
  569. 'G' => array(
  570. array(
  571. array(0,0,1,1,1,1,1,0,0),
  572. array(0,1,0,0,0,0,0,1,0),
  573. array(1,0,0,0,0,0,0,0,1),
  574. array(1,0,0,0,0,0,0,0,0),
  575. array(1,0,0,0,0,0,0,0,0),
  576. array(1,0,0,0,0,0,0,0,0),
  577. array(1,0,0,0,0,0,0,0,0),
  578. array(1,0,0,0,0,0,0,0,0),
  579. array(1,0,0,0,0,0,1,1,1),
  580. array(1,0,0,0,0,0,0,0,1),
  581. array(1,0,0,0,0,0,0,0,1),
  582. array(1,0,0,0,0,0,0,0,1),
  583. array(1,0,0,0,0,0,0,0,1),
  584. array(0,1,0,0,0,0,0,1,0),
  585. array(0,0,1,1,1,1,1,0,0),
  586. ),
  587. array(
  588. array(0,0,1,1,1,1,1,0,1),
  589. array(0,1,0,0,0,0,0,1,1),
  590. array(1,0,0,0,0,0,0,0,1),
  591. array(1,0,0,0,0,0,0,0,0),
  592. array(1,0,0,0,0,0,0,0,0),
  593. array(1,0,0,0,0,0,0,0,0),
  594. array(1,0,0,0,0,0,0,0,0),
  595. array(1,0,0,0,0,0,0,0,0),
  596. array(1,0,0,0,1,1,1,1,1),
  597. array(1,0,0,0,1,0,0,0,1),
  598. array(1,0,0,0,1,0,0,0,1),
  599. array(1,0,0,0,0,0,0,0,1),
  600. array(1,0,0,0,0,0,0,0,1),
  601. array(0,1,0,0,0,0,0,1,1),
  602. array(0,0,1,1,1,1,1,0,1),
  603. ),
  604. array(
  605. array(0,0,1,1,1,1,1,0,1),
  606. array(0,1,1,0,0,0,0,1,1),
  607. array(1,1,0,0,0,0,0,1,1),
  608. array(1,0,0,0,0,0,0,0,1),
  609. array(1,0,0,0,0,0,0,0,1),
  610. array(1,1,1,0,0,0,0,0,1),
  611. array(0,0,1,1,1,1,1,1,1),
  612. array(0,0,0,0,0,0,0,0,1),
  613. array(0,0,0,0,0,0,0,0,1),
  614. array(0,0,0,0,0,0,0,0,1),
  615. array(0,0,0,0,0,0,0,0,1),
  616. array(0,0,0,0,0,0,0,1,1),
  617. array(1,1,1,1,1,1,1,1,0),
  618. array(0,0,0,0,0,0,0,0,0),
  619. array(0,0,0,0,0,0,0,0,0),
  620. ),
  621. ),
  622. 'H' => array(
  623. array(
  624. array(1,0,0,0,0,0,0,0,1),
  625. array(1,0,0,0,0,0,0,0,1),
  626. array(1,0,0,0,0,0,0,0,1),
  627. array(1,0,0,0,0,0,0,0,1),
  628. array(1,0,0,0,0,0,0,0,1),
  629. array(1,0,0,0,0,0,0,0,1),
  630. array(1,0,0,0,0,0,0,0,1),
  631. array(1,1,1,1,1,1,1,1,1),
  632. array(1,0,0,0,0,0,0,0,1),
  633. array(1,0,0,0,0,0,0,0,1),
  634. array(1,0,0,0,0,0,0,0,1),
  635. array(1,0,0,0,0,0,0,0,1),
  636. array(1,0,0,0,0,0,0,0,1),
  637. array(1,0,0,0,0,0,0,0,1),
  638. array(1,0,0,0,0,0,0,0,1),
  639. ),
  640. array(
  641. array(1,1,1,0,0,0,1,1,1),
  642. array(0,1,0,0,0,0,0,1,0),
  643. array(0,1,0,0,0,0,0,1,0),
  644. array(0,1,0,0,0,0,0,1,0),
  645. array(0,1,0,0,0,0,0,1,0),
  646. array(0,1,0,0,0,0,0,1,0),
  647. array(0,1,0,0,0,0,0,1,0),
  648. array(0,1,1,1,1,1,1,1,0),
  649. array(0,1,0,0,0,0,0,1,0),
  650. array(0,1,0,0,0,0,0,1,0),
  651. array(0,1,0,0,0,0,0,1,0),
  652. array(0,1,0,0,0,0,0,1,0),
  653. array(0,1,0,0,0,0,0,1,0),
  654. array(0,1,0,0,0,0,0,1,0),
  655. array(1,1,1,0,0,0,1,1,1),
  656. ),
  657. array(
  658. array(1,0,0,0,0,0,0,0,0),
  659. array(1,0,0,0,0,0,0,0,0),
  660. array(1,0,0,0,0,0,0,0,0),
  661. array(1,0,0,0,0,0,0,0,0),
  662. array(1,0,0,0,0,0,0,0,0),
  663. array(1,0,0,0,0,0,0,0,0),
  664. array(1,0,0,0,0,0,0,0,0),
  665. array(1,0,0,1,1,1,0,0,0),
  666. array(1,1,1,1,0,1,1,0,0),
  667. array(1,0,0,0,0,0,1,0,0),
  668. array(1,0,0,0,0,0,1,0,0),
  669. array(1,0,0,0,0,0,1,0,0),
  670. array(1,0,0,0,0,0,1,0,0),
  671. array(1,0,0,0,0,0,1,0,0),
  672. array(1,0,0,0,0,0,1,0,0),
  673. ),
  674. ),
  675. 'I' => array(
  676. array(
  677. array(1,1,1,1,1,1,1,1,1),
  678. array(0,0,0,0,1,0,0,0,0),
  679. array(0,0,0,0,1,0,0,0,0),
  680. array(0,0,0,0,1,0,0,0,0),
  681. array(0,0,0,0,1,0,0,0,0),
  682. array(0,0,0,0,1,0,0,0,0),
  683. array(0,0,0,0,1,0,0,0,0),
  684. array(0,0,0,0,1,0,0,0,0),
  685. array(0,0,0,0,1,0,0,0,0),
  686. array(0,0,0,0,1,0,0,0,0),
  687. array(0,0,0,0,1,0,0,0,0),
  688. array(0,0,0,0,1,0,0,0,0),
  689. array(0,0,0,0,1,0,0,0,0),
  690. array(0,0,0,0,1,0,0,0,0),
  691. array(1,1,1,1,1,1,1,1,1),
  692. ),
  693. array(
  694. array(0,0,0,1,1,1,0,0,0),
  695. array(0,0,0,0,1,0,0,0,0),
  696. array(0,0,0,0,1,0,0,0,0),
  697. array(0,0,0,0,1,0,0,0,0),
  698. array(0,0,0,0,1,0,0,0,0),
  699. array(0,0,0,0,1,0,0,0,0),
  700. array(0,0,0,0,1,0,0,0,0),
  701. array(0,0,0,0,1,0,0,0,0),
  702. array(0,0,0,0,1,0,0,0,0),
  703. array(0,0,0,0,1,0,0,0,0),
  704. array(0,0,0,0,1,0,0,0,0),
  705. array(0,0,0,0,1,0,0,0,0),
  706. array(0,0,0,0,1,0,0,0,0),
  707. array(0,0,0,0,1,0,0,0,0),
  708. array(0,0,0,1,1,1,0,0,0),
  709. ),
  710. array(
  711. array(0,0,0,0,0,0,0,0,0),
  712. array(0,0,0,0,0,0,0,0,0),
  713. array(0,0,0,0,0,0,0,0,0),
  714. array(0,0,0,0,1,0,0,0,0),
  715. array(0,0,0,1,1,1,0,0,0),
  716. array(0,0,0,0,1,0,0,0,0),
  717. array(0,0,0,0,0,0,0,0,0),
  718. array(0,0,0,0,1,0,0,0,0),
  719. array(0,0,0,0,1,0,0,0,0),
  720. array(0,0,0,0,1,0,0,0,0),
  721. array(0,0,0,0,1,0,0,0,0),
  722. array(0,0,0,0,1,0,0,0,0),
  723. array(0,0,0,0,1,0,0,0,0),
  724. array(0,0,0,0,1,0,0,0,0),
  725. array(0,0,0,1,1,1,0,0,0),
  726. ),
  727. ),
  728. 'J' => array(
  729. array(
  730. array(1,1,1,1,1,1,1,1,1),
  731. array(0,0,0,0,0,1,0,0,0),
  732. array(0,0,0,0,0,1,0,0,0),
  733. array(0,0,0,0,0,1,0,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,0,1,0,0,0),
  737. array(0,0,0,0,0,1,0,0,0),
  738. array(0,0,0,0,0,1,0,0,0),
  739. array(0,0,0,0,0,1,0,0,0),
  740. array(0,0,0,0,0,1,0,0,0),
  741. array(1,0,0,0,0,1,0,0,0),
  742. array(1,0,0,0,0,1,0,0,0),
  743. array(0,1,0,0,1,0,0,0,0),
  744. array(0,0,1,1,0,0,0,0,0),
  745. ),
  746. array(
  747. array(1,1,1,1,1,1,1,1,1),
  748. array(0,0,0,0,0,1,0,0,0),
  749. array(0,0,0,0,0,1,0,0,0),
  750. array(0,0,0,0,0,1,0,0,0),
  751. array(0,0,0,0,0,1,0,0,0),
  752. array(0,0,0,0,0,1,0,0,0),
  753. array(0,0,0,0,0,1,0,0,0),
  754. array(0,0,0,0,0,1,0,0,0),
  755. array(0,0,0,0,0,1,0,0,0),
  756. array(0,0,0,0,0,1,0,0,0),
  757. array(0,0,0,0,0,1,0,0,0),
  758. array(1,0,0,0,0,1,0,0,0),
  759. array(1,0,0,0,0,1,0,0,0),
  760. array(1,1,0,0,1,0,0,0,0),
  761. array(1,0,1,1,0,0,0,0,0),
  762. ),
  763. array(
  764. array(0,0,0,0,0,0,0,0,0),
  765. array(0,0,0,0,0,0,0,0,0),
  766. array(0,0,0,0,0,0,0,0,0),
  767. array(0,0,0,0,0,0,0,0,0),
  768. array(0,0,0,0,0,1,0,0,0),
  769. array(0,0,0,0,0,0,0,0,0),
  770. array(0,0,0,0,0,1,0,0,0),
  771. array(0,0,0,0,0,1,0,0,0),
  772. array(0,0,0,0,0,1,0,0,0),
  773. array(0,0,0,0,0,1,0,0,0),
  774. array(0,0,0,0,0,1,0,0,0),
  775. array(1,0,0,0,0,1,0,0,0),
  776. array(1,0,0,0,0,1,0,0,0),
  777. array(0,1,0,0,1,0,0,0,0),
  778. array(0,0,1,1,0,0,0,0,0),
  779. ),
  780. ),
  781. 'K' => array(
  782. array( // New 'K', supplied by NeoThermic
  783. array(1,0,0,0,0,0,0,0,1),
  784. array(1,0,0,0,0,0,0,1,0),
  785. array(1,0,0,0,0,0,1,0,0),
  786. array(1,0,0,0,0,1,0,0,0),
  787. array(1,0,0,0,1,0,0,0,0),
  788. array(1,0,0,1,0,0,0,0,0),
  789. array(1,0,1,0,0,0,0,0,0),
  790. array(1,1,0,0,0,0,0,0,0),
  791. array(1,0,1,0,0,0,0,0,0),
  792. array(1,0,0,1,0,0,0,0,0),
  793. array(1,0,0,0,1,0,0,0,0),
  794. array(1,0,0,0,0,1,0,0,0),
  795. array(1,0,0,0,0,0,1,0,0),
  796. array(1,0,0,0,0,0,0,1,0),
  797. array(1,0,0,0,0,0,0,0,1),
  798. ),
  799. array(
  800. array(0,1,0,0,0,0,0,0,1),
  801. array(0,1,0,0,0,0,0,1,0),
  802. array(0,1,0,0,0,0,1,0,0),
  803. array(0,1,0,0,0,1,0,0,0),
  804. array(0,1,0,0,1,0,0,0,0),
  805. array(0,1,0,1,0,0,0,0,0),
  806. array(0,1,1,0,0,0,0,0,0),
  807. array(0,1,0,0,0,0,0,0,0),
  808. array(0,1,1,0,0,0,0,0,0),
  809. array(0,1,0,1,0,0,0,0,0),
  810. array(0,1,0,0,1,0,0,0,0),
  811. array(0,1,0,0,0,1,0,0,0),
  812. array(0,1,0,0,0,0,1,0,0),
  813. array(0,1,0,0,0,0,0,1,0),
  814. array(1,1,1,0,0,0,1,1,1),
  815. ),
  816. array(
  817. array(0,0,0,0,0,0,0,0,0),
  818. array(0,1,0,0,0,0,0,0,0),
  819. array(0,1,0,0,0,0,0,0,0),
  820. array(0,1,0,0,0,1,0,0,0),
  821. array(0,1,0,0,1,0,0,0,0),
  822. array(0,1,0,1,0,0,0,0,0),
  823. array(0,1,1,0,0,0,0,0,0),
  824. array(0,1,0,0,0,0,0,0,0),
  825. array(0,1,1,0,0,0,0,0,0),
  826. array(0,1,0,1,0,0,0,0,0),
  827. array(0,1,0,0,1,0,0,0,0),
  828. array(0,1,0,0,0,1,0,0,0),
  829. array(0,1,0,0,0,0,1,0,0),
  830. array(0,1,0,0,0,0,0,1,0),
  831. array(0,1,0,0,0,0,0,1,0),
  832. ),
  833. ),
  834. 'L' => array(
  835. array(
  836. array(0,0,0,0,0,0,0,0,0),
  837. array(1,0,0,0,0,0,0,0,0),
  838. array(1,0,0,0,0,0,0,0,0),
  839. array(1,0,0,0,0,0,0,0,0),
  840. array(1,0,0,0,0,0,0,0,0),
  841. array(1,0,0,0,0,0,0,0,0),
  842. array(1,0,0,0,0,0,0,0,0),
  843. array(1,0,0,0,0,0,0,0,0),
  844. array(1,0,0,0,0,0,0,0,0),
  845. array(1,0,0,0,0,0,0,0,0),
  846. array(1,0,0,0,0,0,0,0,0),
  847. array(1,0,0,0,0,0,0,0,0),
  848. array(1,0,0,0,0,0,0,0,0),
  849. array(1,0,0,0,0,0,0,0,0),
  850. array(1,1,1,1,1,1,1,1,1),
  851. ),
  852. array(
  853. array(0,0,0,0,0,0,0,0,0),
  854. array(0,1,0,0,0,0,0,0,0),
  855. array(0,1,0,0,0,0,0,0,0),
  856. array(0,1,0,0,0,0,0,0,0),
  857. array(0,1,0,0,0,0,0,0,0),
  858. array(0,1,0,0,0,0,0,0,0),
  859. array(0,1,0,0,0,0,0,0,0),
  860. array(0,1,0,0,0,0,0,0,0),
  861. array(0,1,0,0,0,0,0,0,0),
  862. array(0,1,0,0,0,0,0,0,0),
  863. array(0,1,0,0,0,0,0,0,0),
  864. array(0,1,0,0,0,0,0,0,0),
  865. array(0,1,0,0,0,0,0,0,0),
  866. array(0,1,0,0,0,0,0,0,1),
  867. array(1,1,1,1,1,1,1,1,1),
  868. ),
  869. array(
  870. array(0,0,0,0,0,0,0,0,0),
  871. array(0,1,0,0,0,0,0,0,0),
  872. array(0,1,0,0,0,0,0,0,0),
  873. array(0,1,0,0,0,0,0,0,0),
  874. array(0,1,0,0,0,0,0,0,0),
  875. array(0,1,0,0,0,0,0,0,0),
  876. array(0,1,0,0,0,0,0,0,0),
  877. array(0,1,0,0,0,0,0,0,0),
  878. array(0,1,0,0,0,0,0,0,0),
  879. array(0,1,0,0,0,0,0,0,0),
  880. array(0,1,0,0,0,0,0,0,0),
  881. array(0,1,0,0,0,0,0,0,0),
  882. array(0,1,0,0,0,0,0,0,0),
  883. array(0,1,1,0,0,0,0,0,0),
  884. array(0,0,1,1,1,0,0,0,0),
  885. ),
  886. ),
  887. 'M' => array(
  888. array(
  889. array(1,1,0,0,0,0,0,1,1),
  890. array(1,1,0,0,0,0,0,1,1),
  891. array(1,0,1,0,0,0,1,0,1),
  892. array(1,0,1,0,0,0,1,0,1),
  893. array(1,0,1,0,0,0,1,0,1),
  894. array(1,0,0,1,0,1,0,0,1),
  895. array(1,0,0,1,0,1,0,0,1),
  896. array(1,0,0,1,0,1,0,0,1),
  897. array(1,0,0,0,1,0,0,0,1),
  898. array(1,0,0,0,1,0,0,0,1),
  899. array(1,0,0,0,0,0,0,0,1),
  900. array(1,0,0,0,0,0,0,0,1),
  901. array(1,0,0,0,0,0,0,0,1),
  902. array(1,0,0,0,0,0,0,0,1),
  903. array(1,0,0,0,0,0,0,0,1),
  904. ),
  905. array(
  906. array(0,0,0,0,0,0,0,0,0),
  907. array(0,1,0,0,0,0,0,1,0),
  908. array(0,1,1,0,0,0,1,1,0),
  909. array(0,1,1,0,0,0,1,1,0),
  910. array(0,1,1,0,0,0,1,1,0),
  911. array(0,1,0,1,0,1,0,1,0),
  912. array(0,1,0,1,0,1,0,1,0),
  913. array(0,1,0,1,0,1,0,1,0),
  914. array(0,1,0,0,1,0,0,1,0),
  915. array(0,1,0,0,1,0,0,1,0),
  916. array(0,1,0,0,0,0,0,1,0),
  917. array(0,1,0,0,0,0,0,1,0),
  918. array(0,1,0,0,0,0,0,1,0),
  919. array(0,1,0,0,0,0,0,1,0),
  920. array(1,1,1,0,0,0,1,1,1),
  921. ),
  922. array(
  923. array(0,0,0,0,0,0,0,0,0),
  924. array(0,0,0,0,0,0,0,0,0),
  925. array(0,0,0,0,0,0,0,0,0),
  926. array(0,0,0,0,0,0,0,0,0),
  927. array(0,0,0,0,0,0,0,0,0),
  928. array(0,0,0,0,0,0,0,0,0),
  929. array(0,1,1,1,0,1,1,1,0),
  930. array(1,1,0,1,1,1,0,1,1),
  931. array(1,0,0,0,1,0,0,0,1),
  932. array(1,0,0,0,1,0,0,0,1),
  933. array(1,0,0,0,1,0,0,0,1),
  934. array(1,0,0,0,1,0,0,0,1),
  935. array(1,0,0,0,1,0,0,0,1),
  936. array(1,0,0,0,1,0,0,0,1),
  937. array(1,0,0,0,1,0,0,0,1),
  938. ),
  939. ),
  940. 'N' => array(
  941. array(
  942. array(1,1,0,0,0,0,0,0,1),
  943. array(1,1,0,0,0,0,0,0,1),
  944. array(1,0,1,0,0,0,0,0,1),
  945. array(1,0,1,0,0,0,0,0,1),
  946. array(1,0,0,1,0,0,0,0,1),
  947. array(1,0,0,1,0,0,0,0,1),
  948. array(1,0,0,0,1,0,0,0,1),
  949. array(1,0,0,0,1,0,0,0,1),
  950. array(1,0,0,0,1,0,0,0,1),
  951. array(1,0,0,0,0,1,0,0,1),
  952. array(1,0,0,0,0,1,0,0,1),
  953. array(1,0,0,0,0,0,1,0,1),
  954. array(1,0,0,0,0,0,1,0,1),
  955. array(1,0,0,0,0,0,0,1,1),
  956. array(1,0,0,0,0,0,0,1,1),
  957. ),
  958. array(
  959. array(0,0,0,0,0,0,0,0,0),
  960. array(0,1,0,0,0,0,0,1,0),
  961. array(0,1,1,0,0,0,0,1,0),
  962. array(0,1,1,0,0,0,0,1,0),
  963. array(0,1,1,0,0,0,0,1,0),
  964. array(0,1,0,1,0,0,0,1,0),
  965. array(0,1,0,1,0,0,0,1,0),
  966. array(0,1,0,1,0,0,0,1,0),
  967. array(0,1,0,0,1,0,0,1,0),
  968. array(0,1,0,0,1,1,0,1,0),
  969. array(0,1,0,0,0,1,0,1,0),
  970. array(0,1,0,0,0,1,1,1,0),
  971. array(0,1,0,0,0,0,1,1,0),
  972. array(0,1,0,0,0,0,0,1,0),
  973. array(1,1,1,0,0,0,1,1,1),
  974. ),
  975. array(
  976. array(0,0,0,0,0,0,0,0,0),
  977. array(0,0,0,0,0,0,0,0,0),
  978. array(0,0,0,0,0,0,0,0,0),
  979. array(0,0,0,0,0,0,0,0,0),
  980. array(0,0,0,0,0,0,0,0,0),
  981. array(0,0,0,0,0,0,0,0,0),
  982. array(0,0,0,0,0,0,0,0,0),
  983. array(1,0,1,1,1,1,0,0,0),
  984. array(1,1,1,0,0,1,1,0,0),
  985. array(1,0,0,0,0,0,1,0,0),
  986. array(1,0,0,0,0,0,1,0,0),
  987. array(1,0,0,0,0,0,1,0,0),
  988. array(1,0,0,0,0,0,1,0,0),
  989. array(1,0,0,0,0,0,1,0,0),
  990. array(1,0,0,0,0,0,1,0,0),
  991. ),
  992. ),
  993. 'O' => array(
  994. array(
  995. array(0,0,1,1,1,1,1,0,0),
  996. array(0,1,0,0,0,0,0,1,0),
  997. array(1,0,0,0,0,0,0,0,1),
  998. array(1,0,0,0,0,0,0,0,1),
  999. array(1,0,0,0,0,0,0,0,1),
  1000. array(1,0,0,0,0,0,0,0,1),
  1001. array(1,0,0,0,0,0,0,0,1),
  1002. array(1,0,0,0,0,0,0,0,1),
  1003. array(1,0,0,0,0,0,0,0,1),
  1004. array(1,0,0,0,0,0,0,0,1),
  1005. array(1,0,0,0,0,0,0,0,1),
  1006. array(1,0,0,0,0,0,0,0,1),
  1007. array(1,0,0,0,0,0,0,0,1),
  1008. array(0,1,0,0,0,0,0,1,0),
  1009. array(0,0,1,1,1,1,1,0,0),
  1010. ),
  1011. array(
  1012. array(0,0,1,1,1,1,1,0,0),
  1013. array(0,1,0,0,0,0,0,1,0),
  1014. array(1,1,0,0,0,0,0,1,1),
  1015. array(1,1,0,0,0,0,0,1,1),
  1016. array(1,1,0,0,0,0,0,1,1),
  1017. array(1,1,0,0,0,0,0,1,1),
  1018. array(1,1,0,0,0,0,0,1,1),
  1019. array(1,1,0,0,0,0,0,1,1),
  1020. array(1,1,0,0,0,0,0,1,1),
  1021. array(1,1,0,0,0,0,0,1,1),
  1022. array(1,1,0,0,0,0,0,1,1),
  1023. array(1,1,0,0,0,0,0,1,1),
  1024. array(1,1,0,0,0,0,0,1,1),
  1025. array(0,1,0,0,0,0,0,1,0),
  1026. array(0,0,1,1,1,1,1,0,0),
  1027. ),
  1028. array(
  1029. array(0,0,0,0,0,0,0,0,0),
  1030. array(0,0,0,0,0,0,0,0,0),
  1031. array(0,0,0,0,0,0,0,0,0),
  1032. array(0,0,0,0,0,0,0,0,0),
  1033. array(0,0,0,0,0,0,0,0,0),
  1034. array(0,0,0,0,0,0,0,0,0),
  1035. array(0,0,0,0,0,0,0,0,0),
  1036. array(0,1,1,1,1,1,0,0,0),
  1037. array(1,1,1,0,0,1,1,0,0),
  1038. array(1,0,0,0,0,0,1,0,0),
  1039. array(1,0,0,0,0,0,1,0,0),
  1040. array(1,0,0,0,0,0,1,0,0),
  1041. array(1,0,0,0,0,0,1,0,0),
  1042. array(1,1,0,0,0,1,1,0,0),
  1043. array(0,1,1,1,1,1,0,0,0),
  1044. ),
  1045. ),
  1046. 'P' => array(
  1047. array(
  1048. array(1,1,1,1,1,1,1,0,0),
  1049. array(1,0,0,0,0,0,0,1,0),
  1050. array(1,0,0,0,0,0,0,0,1),
  1051. array(1,0,0,0,0,0,0,0,1),
  1052. array(1,0,0,0,0,0,0,0,1),
  1053. array(1,0,0,0,0,0,0,0,1),
  1054. array(1,0,0,0,0,0,0,1,0),
  1055. array(1,1,1,1,1,1,1,0,0),
  1056. array(1,0,0,0,0,0,0,0,0),
  1057. array(1,0,0,0,0,0,0,0,0),
  1058. array(1,0,0,0,0,0,0,0,0),
  1059. array(1,0,0,0,0,0,0,0,0),
  1060. array(1,0,0,0,0,0,0,0,0),
  1061. array(1,0,0,0,0,0,0,0,0),
  1062. array(1,0,0,0,0,0,0,0,0),
  1063. ),
  1064. array(
  1065. array(1,1,1,1,1,1,1,0,0),
  1066. array(0,1,0,0,0,0,0,1,0),
  1067. array(0,1,0,0,0,0,0,0,1),
  1068. array(0,1,0,0,0,0,0,0,1),
  1069. array(0,1,0,0,0,0,0,0,1),
  1070. array(0,1,0,0,0,0,0,0,1),
  1071. array(0,1,0,0,0,0,0,1,0),
  1072. array(1,1,1,1,1,1,1,0,0),
  1073. array(0,1,0,0,0,0,0,0,0),
  1074. array(0,1,0,0,0,0,0,0,0),
  1075. array(0,1,0,0,0,0,0,0,0),
  1076. array(0,1,0,0,0,0,0,0,0),
  1077. array(0,1,0,0,0,0,0,0,0),
  1078. array(0,1,0,0,0,0,0,0,0),
  1079. array(1,1,1,0,0,0,0,0,0),
  1080. ),
  1081. array(
  1082. array(0,0,0,0,0,0,0,0,0),
  1083. array(0,0,0,0,0,0,0,0,0),
  1084. array(1,0,0,0,0,0,0,0,0),
  1085. array(1,0,1,1,0,0,0,0,0),
  1086. array(1,1,0,1,1,0,0,0,0),
  1087. array(1,0,0,0,1,0,0,0,0),
  1088. array(1,0,0,0,1,0,0,0,0),
  1089. array(1,0,0,1,1,0,0,0,0),
  1090. array(1,1,1,1,0,0,0,0,0),
  1091. array(1,0,0,0,0,0,0,0,0),
  1092. array(1,0,0,0,0,0,0,0,0),
  1093. array(1,0,0,0,0,0,0,0,0),
  1094. array(1,0,0,0,0,0,0,0,0),
  1095. array(1,0,0,0,0,0,0,0,0),
  1096. array(1,0,0,0,0,0,0,0,0),
  1097. ),
  1098. ),
  1099. 'Q' => array(
  1100. array(
  1101. array(0,0,1,1,1,1,1,0,0),
  1102. array(0,1,0,0,0,0,0,1,0),
  1103. array(1,0,0,0,0,0,0,0,1),
  1104. array(1,0,0,0,0,0,0,0,1),
  1105. array(1,0,0,0,0,0,0,0,1),
  1106. array(1,0,0,0,0,0,0,0,1),
  1107. array(1,0,0,0,0,0,0,0,1),
  1108. array(1,0,0,0,0,0,0,0,1),
  1109. array(1,0,0,0,0,0,0,0,1),
  1110. array(1,0,0,0,0,0,0,0,1),
  1111. array(1,0,0,0,0,0,0,0,1),
  1112. array(1,0,0,0,0,1,0,0,1),
  1113. array(1,0,0,0,0,0,1,0,1),
  1114. array(0,1,0,0,0,0,0,1,0),
  1115. array(0,0,1,1,1,1,1,0,1),
  1116. ),
  1117. array(
  1118. array(0,0,1,1,1,1,1,0,0),
  1119. array(0,1,0,0,0,0,0,1,0),
  1120. array(1,0,0,0,0,0,0,0,1),
  1121. array(1,0,0,0,0,0,0,0,1),
  1122. array(1,0,0,0,0,0,0,0,1),
  1123. array(1,0,0,0,0,0,0,0,1),
  1124. array(1,0,0,0,0,0,0,0,1),
  1125. array(1,0,0,0,0,0,0,0,1),
  1126. array(1,0,0,0,0,0,0,0,1),
  1127. array(1,0,0,0,1,0,0,0,1),
  1128. array(1,1,0,0,1,1,0,1,1),
  1129. array(0,1,1,1,1,1,1,1,0),
  1130. array(0,0,0,0,0,0,1,1,0),
  1131. array(0,0,0,0,0,0,0,1,1),
  1132. array(0,0,0,0,0,0,0,0,1),
  1133. ),
  1134. array(
  1135. array(0,0,0,0,0,0,0,0,0),
  1136. array(0,0,0,0,0,0,0,0,0),
  1137. array(0,0,0,0,0,0,0,0,0),
  1138. array(0,0,0,0,0,1,1,1,1),
  1139. array(0,0,0,0,1,1,0,0,1),
  1140. array(0,0,0,0,1,0,0,0,1),
  1141. array(0,0,0,0,1,0,0,0,1),
  1142. array(0,0,0,0,1,1,0,1,1),
  1143. array(0,0,0,0,0,1,1,0,1),
  1144. array(0,0,0,0,0,0,0,0,1),
  1145. array(0,0,0,0,0,0,0,0,1),
  1146. array(0,0,0,0,0,0,0,0,1),
  1147. array(0,0,0,0,0,0,0,0,1),
  1148. array(0,0,0,0,0,0,0,0,1),
  1149. array(0,0,0,0,0,0,0,0,1),
  1150. ),
  1151. ),
  1152. 'R' => array(
  1153. array(
  1154. array(1,1,1,1,1,1,1,0,0),
  1155. array(1,0,0,0,0,0,0,1,0),
  1156. array(1,0,0,0,0,0,0,0,1),
  1157. array(1,0,0,0,0,0,0,0,1),
  1158. array(1,0,0,0,0,0,0,0,1),
  1159. array(1,0,0,0,0,0,0,0,1),
  1160. array(1,0,0,0,0,0,0,1,0),
  1161. array(1,1,1,1,1,1,1,0,0),
  1162. array(1,1,1,0,0,0,0,0,0),
  1163. array(1,0,0,1,0,0,0,0,0),
  1164. array(1,0,0,0,1,0,0,0,0),
  1165. array(1,0,0,0,0,1,0,0,0),
  1166. array(1,0,0,0,0,0,1,0,0),
  1167. array(1,0,0,0,0,0,0,1,0),
  1168. array(1,0,0,0,0,0,0,0,1),
  1169. ),
  1170. array(
  1171. array(1,1,1,1,1,1,1,0,0),
  1172. array(0,1,0,0,0,0,0,1,0),
  1173. array(0,1,0,0,0,0,0,0,1),
  1174. array(0,1,0,0,0,0,0,0,1),
  1175. array(0,1,0,0,0,0,0,0,1),
  1176. array(0,1,0,0,0,0,0,0,1),
  1177. array(0,1,0,0,0,0,0,1,0),
  1178. array(1,1,1,1,1,1,1,0,0),
  1179. array(0,1,1,0,0,0,0,0,0),
  1180. array(0,1,1,1,0,0,0,0,0),
  1181. array(0,1,0,1,1,0,0,0,0),
  1182. array(0,1,0,0,1,1,0,0,0),
  1183. array(0,1,0,0,0,1,1,0,0),
  1184. array(0,1,0,0,0,0,1,1,0),
  1185. array(1,1,1,0,0,0,1,1,1),
  1186. ),
  1187. array(
  1188. array(0,0,0,0,0,0,0,0,0),
  1189. array(0,0,0,0,0,0,0,0,0),
  1190. array(0,0,0,0,0,0,0,0,0),
  1191. array(0,0,0,0,0,0,0,0,0),
  1192. array(0,0,0,0,0,0,0,0,0),
  1193. array(0,0,0,0,0,0,0,0,0),
  1194. array(1,0,0,0,0,0,0,0,0),
  1195. array(1,1,1,1,1,0,0,0,0),
  1196. array(1,1,0,0,1,1,0,0,0),
  1197. array(1,0,0,0,0,0,0,0,0),
  1198. array(1,0,0,0,0,0,0,0,0),
  1199. array(1,0,0,0,0,0,0,0,0),
  1200. array(1,0,0,0,0,0,0,0,0),
  1201. array(1,0,0,0,0,0,0,0,0),
  1202. array(1,0,0,0,0,0,0,0,0),
  1203. ),
  1204. ),
  1205. 'S' => array(
  1206. array(
  1207. array(0,0,1,1,1,1,1,0,0),
  1208. array(0,1,0,0,0,0,0,1,0),
  1209. array(1,0,0,0,0,0,0,0,1),
  1210. array(1,0,0,0,0,0,0,0,0),
  1211. array(1,0,0,0,0,0,0,0,0),
  1212. array(1,0,0,0,0,0,0,0,0),
  1213. array(0,1,0,0,0,0,0,0,0),
  1214. array(0,0,1,1,1,1,1,0,0),
  1215. array(0,0,0,0,0,0,0,1,0),
  1216. array(0,0,0,0,0,0,0,0,1),
  1217. array(0,0,0,0,0,0,0,0,1),
  1218. array(0,0,0,0,0,0,0,0,1),
  1219. array(1,0,0,0,0,0,0,0,1),
  1220. array(0,1,0,0,0,0,0,1,0),
  1221. array(0,0,1,1,1,1,1,0,0),
  1222. ),
  1223. array(
  1224. array(0,0,1,1,1,1,1,0,1),
  1225. array(0,1,0,0,0,0,0,1,1),
  1226. array(1,0,0,0,0,0,0,0,1),
  1227. array(1,0,0,0,0,0,0,0,1),
  1228. array(1,0,0,0,0,0,0,0,0),
  1229. array(1,0,0,0,0,0,0,0,0),
  1230. array(0,1,0,0,0,0,0,0,0),
  1231. array(0,0,1,1,1,1,1,0,0),
  1232. array(0,0,0,0,0,0,0,1,0),
  1233. array(0,0,0,0,0,0,0,0,1),
  1234. array(1,0,0,0,0,0,0,0,1),
  1235. array(1,0,0,0,0,0,0,0,1),
  1236. array(1,0,0,0,0,0,0,0,1),
  1237. array(1,1,0,0,0,0,0,1,0),
  1238. array(1,0,1,1,1,1,1,0,0),
  1239. ),
  1240. array(
  1241. array(0,0,0,0,0,0,0,0,0),
  1242. array(0,0,0,0,0,0,0,0,0),
  1243. array(0,0,0,0,0,0,0,0,0),
  1244. array(0,0,0,0,0,0,0,0,0),
  1245. array(0,0,0,0,0,0,0,0,0),
  1246. array(0,0,0,0,0,0,0,0,0),
  1247. array(0,0,0,0,0,0,0,0,0),
  1248. array(0,1,1,1,1,0,0,0,0),
  1249. array(1,0,0,0,0,1,0,0,0),
  1250. array(1,0,0,0,0,0,0,0,0),
  1251. array(1,1,0,0,0,0,0,0,0),
  1252. array(0,1,1,1,1,0,0,0,0),
  1253. array(0,0,0,0,0,1,0,0,0),
  1254. array(1,0,0,0,1,1,0,0,0),
  1255. array(0,1,1,1,1,0,0,0,0),
  1256. ),
  1257. ),
  1258. 'T' => array(
  1259. array(
  1260. array(1,1,1,1,1,1,1,1,1),
  1261. array(0,0,0,0,1,0,0,0,0),
  1262. array(0,0,0,0,1,0,0,0,0),
  1263. array(0,0,0,0,1,0,0,0,0),
  1264. array(0,0,0,0,1,0,0,0,0),
  1265. array(0,0,0,0,1,0,0,0,0),
  1266. array(0,0,0,0,1,0,0,0,0),
  1267. array(0,0,0,0,1,0,0,0,0),
  1268. array(0,0,0,0,1,0,0,0,0),
  1269. array(0,0,0,0,1,0,0,0,0),
  1270. array(0,0,0,0,1,0,0,0,0),
  1271. array(0,0,0,0,1,0,0,0,0),
  1272. array(0,0,0,0,1,0,0,0,0),
  1273. array(0,0,0,0,1,0,0,0,0),
  1274. array(0,0,0,0,1,0,0,0,0),
  1275. ),
  1276. array(
  1277. array(1,1,1,1,1,1,1,1,1),
  1278. array(1,0,0,0,1,0,0,0,1),
  1279. array(0,0,0,0,1,0,0,0,0),
  1280. array(0,0,0,0,1,0,0,0,0),
  1281. array(0,0,0,0,1,0,0,0,0),
  1282. array(0,0,0,0,1,0,0,0,0),
  1283. array(0,0,0,0,1,0,0,0,0),
  1284. array(0,0,0,0,1,0,0,0,0),
  1285. array(0,0,0,0,1,0,0,0,0),
  1286. array(0,0,0,0,1,0,0,0,0),
  1287. array(0,0,0,0,1,0,0,0,0),
  1288. array(0,0,0,0,1,0,0,0,0),
  1289. array(0,0,0,0,1,0,0,0,0),
  1290. array(0,0,0,0,1,0,0,0,0),
  1291. array(0,0,0,1,1,1,0,0,0),
  1292. ),
  1293. array(
  1294. array(0,0,0,0,1,0,0,0,0),
  1295. array(0,0,0,0,1,0,0,0,0),
  1296. array(0,0,0,0,1,0,0,0,0),
  1297. array(0,0,1,1,1,1,1,1,0),
  1298. array(0,0,0,0,1,0,0,0,0),
  1299. array(0,0,0,0,1,0,0,0,0),
  1300. array(0,0,0,0,1,0,0,0,0),
  1301. array(0,0,0,0,1,0,0,0,0),
  1302. array(0,0,0,0,1,0,0,0,0),
  1303. array(0,0,0,0,1,0,0,0,0),
  1304. array(0,0,0,0,1,0,0,0,0),
  1305. array(0,0,0,0,1,0,0,0,0),
  1306. array(0,0,0,0,1,0,0,0,0),
  1307. array(0,0,0,0,1,1,0,0,0),
  1308. array(0,0,0,0,0,1,1,1,0),
  1309. ),
  1310. ),
  1311. 'U' => array(
  1312. array(
  1313. array(1,0,0,0,0,0,0,0,1),
  1314. array(1,0,0,0,0,0,0,0,1),
  1315. array(1,0,0,0,0,0,0,0,1),
  1316. array(1,0,0,0,0,0,0,0,1),
  1317. array(1,0,0,0,0,0,0,0,1),
  1318. array(1,0,0,0,0,0,0,0,1),
  1319. array(1,0,0,0,0,0,0,0,1),
  1320. array(1,0,0,0,0,0,0,0,1),
  1321. array(1,0,0,0,0,0,0,0,1),
  1322. array(1,0,0,0,0,0,0,0,1),
  1323. array(1,0,0,0,0,0,0,0,1),
  1324. array(1,0,0,0,0,0,0,0,1),
  1325. array(1,0,0,0,0,0,0,0,1),
  1326. array(0,1,0,0,0,0,0,1,0),
  1327. array(0,0,1,1,1,1,1,0,0),
  1328. ),
  1329. array(
  1330. array(1,0,0,0,0,0,0,0,0),
  1331. array(1,1,1,0,0,0,1,1,1),
  1332. array(0,1,0,0,0,0,0,1,0),
  1333. array(0,1,0,0,0,0,0,1,0),
  1334. array(0,1,0,0,0,0,0,1,0),
  1335. array(0,1,0,0,0,0,0,1,0),
  1336. array(0,1,0,0,0,0,0,1,0),
  1337. array(0,1,0,0,0,0,0,1,0),
  1338. array(0,1,0,0,0,0,0,1,0),
  1339. array(0,1,0,0,0,0,0,1,0),
  1340. array(0,1,0,0,0,0,0,1,0),
  1341. array(0,1,0,0,0,0,0,1,0),
  1342. array(0,1,0,0,0,0,0,1,0),
  1343. array(0,1,1,0,0,0,1,1,0),
  1344. array(0,0,1,1,1,1,1,0,0),
  1345. ),
  1346. array(
  1347. array(0,0,0,0,0,0,0,0,0),
  1348. array(0,0,0,0,0,0,0,0,0),
  1349. array(0,0,0,0,0,0,0,0,0),
  1350. array(0,0,0,0,0,0,0,0,0),
  1351. array(0,0,0,0,0,0,0,0,0),
  1352. array(0,0,0,0,0,0,0,0,0),
  1353. array(0,0,0,0,0,0,0,0,0),
  1354. array(0,0,1,0,0,0,0,0,1),
  1355. array(0,0,1,0,0,0,0,0,1),
  1356. array(0,0,1,0,0,0,0,0,1),
  1357. array(0,0,1,0,0,0,0,0,1),
  1358. array(0,0,1,0,0,0,0,0,1),
  1359. array(0,0,1,0,0,0,0,1,1),
  1360. array(0,0,1,1,0,0,1,1,1),
  1361. array(0,0,0,1,1,1,1,0,1),
  1362. ),
  1363. ),
  1364. 'V' => array(
  1365. array(
  1366. array(1,0,0,0,0,0,0,0,1),
  1367. array(1,0,0,0,0,0,0,0,1),
  1368. array(1,0,0,0,0,0,0,0,1),
  1369. array(0,1,0,0,0,0,0,1,0),
  1370. array(0,1,0,0,0,0,0,1,0),
  1371. array(0,1,0,0,0,0,0,1,0),
  1372. array(0,0,1,0,0,0,1,0,0),
  1373. array(0,0,1,0,0,0,1,0,0),
  1374. array(0,0,1,0,0,0,1,0,0),
  1375. array(0,0,1,0,0,0,1,0,0),
  1376. array(0,0,0,1,0,1,0,0,0),
  1377. array(0,0,0,1,0,1,0,0,0),
  1378. array(0,0,0,1,0,1,0,0,0),
  1379. array(0,0,0,0,1,0,0,0,0),
  1380. array(0,0,0,0,1,0,0,0,0),
  1381. ),
  1382. array(
  1383. array(0,0,0,0,0,0,0,0,0),
  1384. array(0,0,0,0,0,0,0,0,0),
  1385. array(0,0,0,0,0,0,0,0,0),
  1386. array(1,1,1,0,0,0,1,1,1),
  1387. array(0,1,0,0,0,0,0,1,0),
  1388. array(0,1,0,0,0,0,0,1,0),
  1389. array(0,0,1,0,0,0,1,0,0),
  1390. array(0,0,1,0,0,0,1,0,0),
  1391. array(0,0,1,0,0,0,1,0,0),
  1392. array(0,0,1,0,0,0,1,0,0),
  1393. array(0,0,0,1,0,1,0,0,0),
  1394. array(0,0,0,1,0,1,0,0,0),
  1395. array(0,0,0,1,0,1,0,0,0),
  1396. array(0,0,0,0,1,0,0,0,0),
  1397. array(0,0,0,0,1,0,0,0,0),
  1398. ),
  1399. array(
  1400. array(0,0,0,0,0,0,0,0,0),
  1401. array(0,0,0,0,0,0,0,0,0),
  1402. array(0,0,0,0,0,0,0,0,0),
  1403. array(0,0,0,0,0,0,0,0,0),
  1404. array(0,0,0,0,0,0,0,0,0),
  1405. array(0,0,0,0,0,0,0,0,0),
  1406. array(0,0,1,0,0,0,1,0,0),
  1407. array(0,0,1,0,0,0,1,0,0),
  1408. array(0,0,1,0,0,0,1,0,0),
  1409. array(0,0,1,0,0,0,1,0,0),
  1410. array(0,0,0,1,0,1,0,0,0),
  1411. array(0,0,0,1,0,1,0,0,0),
  1412. array(0,0,0,1,0,1,0,0,0),
  1413. array(0,0,0,0,1,0,0,0,0),
  1414. array(0,0,0,0,1,0,0,0,0),
  1415. ),
  1416. ),
  1417. 'W' => array(
  1418. array(
  1419. array(1,0,0,0,0,0,0,0,1),
  1420. array(1,0,0,0,0,0,0,0,1),
  1421. array(1,0,0,0,0,0,0,0,1),
  1422. array(1,0,0,0,0,0,0,0,1),
  1423. array(1,0,0,0,0,0,0,0,1),
  1424. array(1,0,0,0,1,0,0,0,1),
  1425. array(1,0,0,0,1,0,0,0,1),
  1426. array(1,0,0,1,0,1,0,0,1),
  1427. array(1,0,0,1,0,1,0,0,1),
  1428. array(1,0,0,1,0,1,0,0,1),
  1429. array(1,0,1,0,0,0,1,0,1),
  1430. array(1,0,1,0,0,0,1,0,1),
  1431. array(1,0,1,0,0,0,1,0,1),
  1432. array(1,1,0,0,0,0,0,1,1),
  1433. array(1,1,0,0,0,0,0,1,1),
  1434. ),
  1435. array(
  1436. array(0,0,0,0,0,0,0,0,0),
  1437. array(0,0,0,0,0,0,0,0,0),
  1438. array(1,1,1,0,0,0,1,1,1),
  1439. array(0,1,0,0,0,0,0,1,0),
  1440. array(0,1,0,0,0,0,0,1,0),
  1441. array(0,1,0,0,0,0,0,1,0),
  1442. array(0,1,0,0,0,0,0,1,0),
  1443. array(0,1,0,0,1,0,0,1,0),
  1444. array(0,1,0,0,1,0,0,1,0),
  1445. array(0,1,0,1,1,1,0,1,0),
  1446. array(0,1,0,1,0,1,0,1,0),
  1447. array(0,1,1,1,0,1,1,1,0),
  1448. array(0,1,1,0,0,0,1,1,0),
  1449. array(0,1,0,0,0,0,0,1,0),
  1450. array(0,0,0,0,0,0,0,0,0),
  1451. ),
  1452. array(
  1453. array(0,0,0,0,0,0,0,0,0),
  1454. array(0,0,0,0,0,0,0,0,0),
  1455. array(0,0,0,0,0,0,0,0,0),
  1456. array(0,0,0,0,0,0,0,0,0),
  1457. array(0,0,0,0,0,0,0,0,0),
  1458. array(0,0,0,0,0,0,0,0,0),
  1459. array(0,1,0,0,0,0,0,1,0),
  1460. array(0,1,0,0,1,0,0,1,0),
  1461. array(0,1,0,0,1,0,0,1,0),
  1462. array(0,1,0,1,1,1,0,1,0),
  1463. array(0,1,0,1,0,1,0,1,0),
  1464. array(0,1,1,1,0,1,1,1,0),
  1465. array(0,1,1,0,0,0,1,1,0),
  1466. array(0,1,0,0,0,0,0,1,0),
  1467. array(0,0,0,0,0,0,0,0,0),
  1468. ),
  1469. ),
  1470. 'X' => array(
  1471. array(
  1472. array(1,0,0,0,0,0,0,0,1),
  1473. array(1,0,0,0,0,0,0,0,1),
  1474. array(0,1,0,0,0,0,0,1,0),
  1475. array(0,1,0,0,0,0,0,1,0),
  1476. array(0,0,1,0,0,0,1,0,0),
  1477. array(0,0,0,1,0,1,0,0,0),
  1478. array(0,0,0,1,0,1,0,0,0),
  1479. array(0,0,0,0,1,0,0,0,0),
  1480. array(0,0,0,1,0,1,0,0,0),
  1481. array(0,0,0,1,0,1,0,0,0),
  1482. array(0,0,1,0,0,0,1,0,0),
  1483. array(0,1,0,0,0,0,1,0,0),
  1484. array(0,1,0,0,0,0,0,1,0),
  1485. array(1,0,0,0,0,0,0,0,1),
  1486. array(1,0,0,0,0,0,0,0,1),
  1487. ),
  1488. array(
  1489. array(0,0,0,0,0,0,0,0,0),
  1490. array(1,1,1,0,0,0,1,1,1),
  1491. array(0,1,0,0,0,0,0,1,0),
  1492. array(0,1,0,0,0,0,0,1,0),
  1493. array(0,0,1,0,0,0,1,0,0),
  1494. array(0,0,0,1,0,1,0,0,0),
  1495. array(0,0,0,1,0,1,0,0,0),
  1496. array(0,0,0,0,1,0,0,0,0),
  1497. array(0,0,0,1,0,1,0,0,0),
  1498. array(0,0,0,1,0,1,0,0,0),
  1499. array(0,0,1,0,0,0,1,0,0),
  1500. array(0,1,0,0,0,0,1,0,0),
  1501. array(0,1,0,0,0,0,0,1,0),
  1502. array(1,1,1,0,0,0,1,1,1),
  1503. array(0,0,0,0,0,0,0,0,0),
  1504. ),
  1505. array(
  1506. array(0,0,0,0,0,0,0,0,0),
  1507. array(0,0,0,0,0,0,0,0,0),
  1508. array(0,0,0,0,0,0,0,0,0),
  1509. array(0,0,0,0,0,0,0,0,0),
  1510. array(0,0,0,0,0,0,0,0,0),
  1511. array(0,0,0,0,0,0,0,0,0),
  1512. array(0,0,0,0,0,0,0,0,0),
  1513. array(0,1,0,0,0,0,0,1,0),
  1514. array(0,1,1,0,0,0,1,1,0),
  1515. array(0,0,1,1,0,1,1,0,0),
  1516. array(0,0,0,1,1,1,0,0,0),
  1517. array(0,0,0,1,1,1,0,0,0),
  1518. array(0,0,1,1,0,1,1,0,0),
  1519. array(0,1,1,0,0,0,1,1,0),
  1520. array(0,0,0,0,0,0,0,0,0),
  1521. ),
  1522. ),
  1523. 'Y' => array(
  1524. array(
  1525. array(1,0,0,0,0,0,0,0,1),
  1526. array(1,0,0,0,0,0,0,0,1),
  1527. array(0,1,0,0,0,0,0,1,0),
  1528. array(0,1,0,0,0,0,0,1,0),
  1529. array(0,0,1,0,0,0,1,0,0),
  1530. array(0,0,1,0,0,0,1,0,0),
  1531. array(0,0,0,1,0,1,0,0,0),
  1532. array(0,0,0,0,1,0,0,0,0),
  1533. array(0,0,0,0,1,0,0,0,0),
  1534. array(0,0,0,0,1,0,0,0,0),
  1535. array(0,0,0,0,1,0,0,0,0),
  1536. array(0,0,0,0,1,0,0,0,0),
  1537. array(0,0,0,0,1,0,0,0,0),
  1538. array(0,0,0,0,1,0,0,0,0),
  1539. array(0,0,0,0,1,0,0,0,0),
  1540. ),
  1541. array(
  1542. array(0,0,0,0,0,0,0,0,0),
  1543. array(1,1,1,0,0,0,1,1,1),
  1544. array(0,1,0,0,0,0,0,1,0),
  1545. array(0,1,0,0,0,0,0,1,0),
  1546. array(0,0,1,0,0,0,1,0,0),
  1547. array(0,0,1,0,0,0,1,0,0),
  1548. array(0,0,0,1,0,1,0,0,0),
  1549. array(0,0,0,0,1,0,0,0,0),
  1550. array(0,0,0,0,1,0,0,0,0),
  1551. array(0,0,0,0,1,0,0,0,0),
  1552. array(0,0,0,0,1,0,0,0,0),
  1553. array(0,0,0,0,1,0,0,0,0),
  1554. array(0,0,0,0,1,0,0,0,0),
  1555. array(0,0,0,0,1,0,0,0,0),
  1556. array(0,0,0,1,1,1,0,0,0),
  1557. ),
  1558. array(
  1559. array(0,0,0,0,0,0,0,0,0),
  1560. array(0,0,0,0,0,0,0,0,0),
  1561. array(0,0,0,0,0,0,0,0,0),
  1562. array(0,0,0,0,0,0,0,0,0),
  1563. array(0,0,0,1,0,0,0,0,1),
  1564. array(0,0,0,1,1,0,0,0,1),
  1565. array(0,0,0,0,1,0,0,1,1),
  1566. array(0,0,0,0,1,1,0,1,0),
  1567. array(0,0,0,0,0,1,1,1,0),
  1568. array(0,0,0,0,0,0,1,0,0),
  1569. array(0,0,0,0,0,1,1,0,0),
  1570. array(0,0,0,0,0,1,0,0,0),
  1571. array(0,0,0,0,1,1,0,0,0),
  1572. array(0,0,1,1,1,0,0,0,0),
  1573. array(0,0,0,0,0,0,0,0,0),
  1574. ),
  1575. ),
  1576. 'Z' => array(
  1577. array(
  1578. array(1,1,1,1,1,1,1,1,1),
  1579. array(1,0,0,0,0,0,0,0,1),
  1580. array(0,0,0,0,0,0,0,0,1),
  1581. array(0,0,0,0,0,0,0,1,0),
  1582. array(0,0,0,0,0,0,1,0,0),
  1583. array(0,0,0,0,0,1,0,0,0),
  1584. array(0,0,0,0,0,1,0,0,0),
  1585. array(0,0,0,0,1,0,0,0,0),
  1586. array(0,0,0,1,0,0,0,0,0),
  1587. array(0,0,0,1,0,0,0,0,0),
  1588. array(0,0,1,0,0,0,0,0,0),
  1589. array(0,1,0,0,0,0,0,0,0),
  1590. array(1,0,0,0,0,0,0,0,0),
  1591. array(1,0,0,0,0,0,0,0,1),
  1592. array(1,1,1,1,1,1,1,1,1),
  1593. ),
  1594. array(
  1595. array(1,1,1,1,1,1,1,1,1),
  1596. array(0,0,0,0,0,0,0,0,1),
  1597. array(0,0,0,0,0,0,0,0,1),
  1598. array(0,0,0,0,0,0,0,1,0),
  1599. array(0,0,0,0,0,0,1,0,0),
  1600. array(0,0,0,0,0,1,0,0,0),
  1601. array(0,0,0,0,0,1,0,0,0),
  1602. array(0,0,1,1,1,1,1,0,0),
  1603. array(0,0,0,1,0,0,0,0,0),
  1604. array(0,0,0,1,0,0,0,0,0),
  1605. array(0,0,1,0,0,0,0,0,0),
  1606. array(0,1,0,0,0,0,0,0,0),
  1607. array(1,0,0,0,0,0,0,0,0),
  1608. array(1,0,0,0,0,0,0,0,0),
  1609. array(1,1,1,1,1,1,1,1,1),
  1610. ),
  1611. array(
  1612. array(0,0,0,0,0,0,0,0,0),
  1613. array(0,0,0,0,0,0,0,0,0),
  1614. array(0,0,0,0,0,0,0,0,0),
  1615. array(0,0,0,0,0,0,0,0,0),
  1616. array(0,0,0,0,0,0,0,0,0),
  1617. array(0,0,0,0,0,0,0,0,0),
  1618. array(0,0,0,0,0,0,0,0,0),
  1619. array(0,0,0,0,0,0,0,0,0),
  1620. array(0,1,1,1,1,1,1,1,0),
  1621. array(0,0,0,0,0,1,1,0,0),
  1622. array(0,0,0,0,1,1,0,0,0),
  1623. array(0,0,0,1,1,0,0,0,0),
  1624. array(0,0,1,1,0,0,0,0,0),
  1625. array(0,0,1,0,0,0,0,0,0),
  1626. array(0,1,1,1,1,1,1,1,0),
  1627. ),
  1628. ),
  1629. );
  1630. return array(
  1631. 'width' => 9,
  1632. 'height' => 15,
  1633. 'data' => array(
  1634. 'A' => $chars['A'][mt_rand(0, min(count($chars['A']), $config['captcha_gd_fonts']) -1)],
  1635. 'B' => $chars['B'][mt_rand(0, min(count($chars['B']), $config['captcha_gd_fonts']) -1)],
  1636. 'C' => $chars['C'][mt_rand(0, min(count($chars['C']), $config['captcha_gd_fonts']) -1)],
  1637. 'D' => $chars['D'][mt_rand(0, min(count($chars['D']), $config['captcha_gd_fonts']) -1)],
  1638. 'E' => $chars['E'][mt_rand(0, min(count($chars['E']), $config['captcha_gd_fonts']) -1)],
  1639. 'F' => $chars['F'][mt_rand(0, min(count($chars['F']), $config['captcha_gd_fonts']) -1)],
  1640. 'G' => $chars['G'][mt_rand(0, min(count($chars['G']), $config['captcha_gd_fonts']) -1)],
  1641. 'H' => $chars['H'][mt_rand(0, min(count($chars['H']), $config['captcha_gd_fonts']) -1)],
  1642. 'I' => $chars['I'][mt_rand(0, min(count($chars['I']), $config['captcha_gd_fonts']) -1)],
  1643. 'J' => $chars['J'][mt_rand(0, min(count($chars['J']), $config['captcha_gd_fonts']) -1)],
  1644. 'K' => $chars['K'][mt_rand(0, min(count($chars['K']), $config['captcha_gd_fonts']) -1)],
  1645. 'L' => $chars['L'][mt_rand(0, min(count($chars['L']), $config['captcha_gd_fonts']) -1)],
  1646. 'M' => $chars['M'][mt_rand(0, min(count($chars['M']), $config['captcha_gd_fonts']) -1)],
  1647. 'N' => $chars['N'][mt_rand(0, min(count($chars['N']), $config['captcha_gd_fonts']) -1)],
  1648. 'O' => $chars['O'][mt_rand(0, min(count($chars['O']), $config['captcha_gd_fonts']) -1)],
  1649. 'P' => $chars['P'][mt_rand(0, min(count($chars['P']), $config['captcha_gd_fonts']) -1)],
  1650. 'Q' => $chars['Q'][mt_rand(0, min(count($chars['Q']), $config['captcha_gd_fonts']) -1)],
  1651. 'R' => $chars['R'][mt_rand(0, min(count($chars['R']), $config['captcha_gd_fonts']) -1)],
  1652. 'S' => $chars['S'][mt_rand(0, min(count($chars['S']), $config['captcha_gd_fonts']) -1)],
  1653. 'T' => $chars['T'][mt_rand(0, min(count($chars['T']), $config['captcha_gd_fonts']) -1)],
  1654. 'U' => $chars['U'][mt_rand(0, min(count($chars['U']), $config['captcha_gd_fonts']) -1)],
  1655. 'V' => $chars['V'][mt_rand(0, min(count($chars['V']), $config['captcha_gd_fonts']) -1)],
  1656. 'W' => $chars['W'][mt_rand(0, min(count($chars['W']), $config['captcha_gd_fonts']) -1)],
  1657. 'X' => $chars['X'][mt_rand(0, min(count($chars['X']), $config['captcha_gd_fonts']) -1)],
  1658. 'Y' => $chars['Y'][mt_rand(0, min(count($chars['Y']), $config['captcha_gd_fonts']) -1)],
  1659. 'Z' => $chars['Z'][mt_rand(0, min(count($chars['Z']), $config['captcha_gd_fonts']) -1)],
  1660. '1' => array(
  1661. array(0,0,0,1,1,0,0,0,0),
  1662. array(0,0,1,0,1,0,0,0,0),
  1663. array(0,1,0,0,1,0,0,0,0),
  1664. array(0,0,0,0,1,0,0,0,0),
  1665. array(0,0,0,0,1,0,0,0,0),
  1666. array(0,0,0,0,1,0,0,0,0),
  1667. array(0,0,0,0,1,0,0,0,0),
  1668. array(0,0,0,0,1,0,0,0,0),
  1669. array(0,0,0,0,1,0,0,0,0),
  1670. array(0,0,0,0,1,0,0,0,0),
  1671. array(0,0,0,0,1,0,0,0,0),
  1672. array(0,0,0,0,1,0,0,0,0),
  1673. array(0,0,0,0,1,0,0,0,0),
  1674. array(0,0,0,0,1,0,0,0,0),
  1675. array(0,1,1,1,1,1,1,1,0),
  1676. ),
  1677. '2' => array( // New '2' supplied by Anon
  1678. array(0,0,0,1,1,1,0,0,0),
  1679. array(0,0,1,0,0,0,1,0,0),
  1680. array(0,1,0,0,0,0,1,1,0),
  1681. array(0,0,0,0,0,0,0,0,1),
  1682. array(0,0,0,0,0,0,0,0,1),
  1683. array(0,0,0,0,0,0,0,1,1),
  1684. array(0,0,0,0,0,0,0,1,0),
  1685. array(0,0,0,0,0,0,1,0,0),
  1686. array(0,0,0,0,0,1,0,0,0),
  1687. array(0,0,0,0,1,0,0,0,0),
  1688. array(0,0,0,1,0,0,0,0,0),
  1689. array(0,0,1,0,0,0,0,0,0),
  1690. array(0,1,0,0,0,0,0,0,0),
  1691. array(1,1,1,1,1,1,1,1,1),
  1692. array(0,0,0,0,0,0,0,0,0),
  1693. ),
  1694. '3' => array(
  1695. array(0,0,1,1,1,1,1,0,0),
  1696. array(0,1,0,0,0,0,0,1,0),
  1697. array(1,0,0,0,0,0,0,0,1),
  1698. array(0,0,0,0,0,0,0,0,1),
  1699. array(0,0,0,0,0,0,0,0,1),
  1700. array(0,0,0,0,0,0,0,0,1),
  1701. array(0,0,0,0,0,0,0,1,0),
  1702. array(0,0,0,0,0,1,1,0,0),
  1703. array(0,0,0,0,0,0,0,1,0),
  1704. array(0,0,0,0,0,0,0,0,1),
  1705. array(0,0,0,0,0,0,0,0,1),
  1706. array(0,0,0,0,0,0,0,0,1),
  1707. array(1,0,0,0,0,0,0,0,1),
  1708. array(0,1,0,0,0,0,0,1,0),
  1709. array(0,0,1,1,1,1,1,0,0),
  1710. ),
  1711. '4' => array(
  1712. array(0,0,0,0,0,0,1,1,0),
  1713. array(0,0,0,0,0,1,0,1,0),
  1714. array(0,0,0,0,1,0,0,1,0),
  1715. array(0,0,0,1,0,0,0,1,0),
  1716. array(0,0,1,0,0,0,0,1,0),
  1717. array(0,1,0,0,0,0,0,1,0),
  1718. array(1,0,0,0,0,0,0,1,0),
  1719. array(1,0,0,0,0,0,0,1,0),
  1720. array(1,1,1,1,1,1,1,1,1),
  1721. array(0,0,0,0,0,0,0,1,0),
  1722. array(0,0,0,0,0,0,0,1,0),
  1723. array(0,0,0,0,0,0,0,1,0),
  1724. array(0,0,0,0,0,0,0,1,0),
  1725. array(0,0,0,0,0,0,0,1,0),
  1726. array(0,0,0,0,0,0,0,1,0),
  1727. ),
  1728. '5' => array(
  1729. array(1,1,1,1,1,1,1,1,1),
  1730. array(1,0,0,0,0,0,0,0,0),
  1731. array(1,0,0,0,0,0,0,0,0),
  1732. array(1,0,0,0,0,0,0,0,0),
  1733. array(1,0,0,0,0,0,0,0,0),
  1734. array(0,1,0,0,0,0,0,0,0),
  1735. array(0,0,1,1,1,1,1,0,0),
  1736. array(0,0,0,0,0,0,0,1,0),
  1737. array(0,0,0,0,0,0,0,0,1),
  1738. array(0,0,0,0,0,0,0,0,1),
  1739. array(0,0,0,0,0,0,0,0,1),
  1740. array(0,0,0,0,0,0,0,0,1),
  1741. array(1,0,0,0,0,0,0,0,1),
  1742. array(0,1,0,0,0,0,0,1,0),
  1743. array(0,0,1,1,1,1,1,0,0),
  1744. ),
  1745. '6' => array(
  1746. array(0,0,1,1,1,1,1,0,0),
  1747. array(0,1,0,0,0,0,0,1,0),
  1748. array(1,0,0,0,0,0,0,0,1),
  1749. array(1,0,0,0,0,0,0,0,1),
  1750. array(1,0,0,0,0,0,0,0,0),
  1751. array(1,0,0,0,0,0,0,0,0),
  1752. array(1,0,0,1,1,1,1,0,0),
  1753. array(1,0,1,0,0,0,0,1,0),
  1754. array(1,1,0,0,0,0,0,0,1),
  1755. array(1,0,0,0,0,0,0,0,1),
  1756. array(1,0,0,0,0,0,0,0,1),
  1757. array(1,0,0,0,0,0,0,0,1),
  1758. array(1,0,0,0,0,0,0,0,1),
  1759. array(0,1,0,0,0,0,0,1,0),
  1760. array(0,0,1,1,1,1,1,0,0),
  1761. ),
  1762. '7' => array(
  1763. array(1,1,1,1,1,1,1,1,1),
  1764. array(0,0,0,0,0,0,0,0,1),
  1765. array(0,0,0,0,0,0,0,1,0),
  1766. array(0,0,0,0,0,0,0,1,0),
  1767. array(0,0,0,0,0,0,1,0,0),
  1768. array(0,0,0,0,0,1,0,0,0),
  1769. array(0,0,0,0,0,1,0,0,0),
  1770. array(0,0,0,0,1,0,0,0,0),
  1771. array(0,0,0,1,0,0,0,0,0),
  1772. array(0,0,0,1,0,0,0,0,0),
  1773. array(0,0,1,0,0,0,0,0,0),
  1774. array(0,1,0,0,0,0,0,0,0),
  1775. array(0,1,0,0,0,0,0,0,0),
  1776. array(1,0,0,0,0,0,0,0,0),
  1777. array(1,0,0,0,0,0,0,0,0),
  1778. ),
  1779. '8' => array(
  1780. array(0,0,1,1,1,1,1,0,0),
  1781. array(0,1,0,0,0,0,0,1,0),
  1782. array(1,0,0,0,0,0,0,0,1),
  1783. array(1,0,0,0,0,0,0,0,1),
  1784. array(1,0,0,0,0,0,0,0,1),
  1785. array(1,0,0,0,0,0,0,0,1),
  1786. array(0,1,0,0,0,0,0,1,0),
  1787. array(0,0,1,1,1,1,1,0,0),
  1788. array(0,1,0,0,0,0,0,1,0),
  1789. array(1,0,0,0,0,0,0,0,1),
  1790. array(1,0,0,0,0,0,0,0,1),
  1791. array(1,0,0,0,0,0,0,0,1),
  1792. array(1,0,0,0,0,0,0,0,1),
  1793. array(0,1,0,0,0,0,0,1,0),
  1794. array(0,0,1,1,1,1,1,0,0),
  1795. ),
  1796. '9' => array(
  1797. array(0,0,1,1,1,1,1,0,0),
  1798. array(0,1,0,0,0,0,0,1,0),
  1799. array(1,0,0,0,0,0,0,0,1),
  1800. array(1,0,0,0,0,0,0,0,1),
  1801. array(1,0,0,0,0,0,0,0,1),
  1802. array(1,0,0,0,0,0,0,0,1),
  1803. array(1,0,0,0,0,0,0,1,1),
  1804. array(0,1,0,0,0,0,1,0,1),
  1805. array(0,0,1,1,1,1,0,0,1),
  1806. array(0,0,0,0,0,0,0,0,1),
  1807. array(0,0,0,0,0,0,0,0,1),
  1808. array(1,0,0,0,0,0,0,0,1),
  1809. array(1,0,0,0,0,0,0,0,1),
  1810. array(0,1,0,0,0,0,0,1,0),
  1811. array(0,0,1,1,1,1,1,0,0),
  1812. ),
  1813. )
  1814. );
  1815. }
  1816. }
  1817. /**
  1818. * @package VC
  1819. */
  1820. class char_cube3d
  1821. {
  1822. var $bitmap;
  1823. var $bitmap_width;
  1824. var $bitmap_height;
  1825. var $basis_matrix = array(array(1, 0, 0), array(0, 1, 0), array(0, 0, 1));
  1826. var $abs_x = array(1, 0);
  1827. var $abs_y = array(0, 1);
  1828. var $x = 0;
  1829. var $y = 1;
  1830. var $z = 2;
  1831. var $letter = '';
  1832. /**
  1833. */
  1834. function __construct(&$bitmaps, $letter)
  1835. {
  1836. $this->bitmap = $bitmaps['data'][$letter];
  1837. $this->bitmap_width = $bitmaps['width'];
  1838. $this->bitmap_height = $bitmaps['height'];
  1839. $this->basis_matrix[0][0] = mt_rand(-600, 600);
  1840. $this->basis_matrix[0][1] = mt_rand(-600, 600);
  1841. $this->basis_matrix[0][2] = (mt_rand(0, 1) * 2000) - 1000;
  1842. $this->basis_matrix[1][0] = mt_rand(-1000, 1000);
  1843. $this->basis_matrix[1][1] = mt_rand(-1000, 1000);
  1844. $this->basis_matrix[1][2] = mt_rand(-1000, 1000);
  1845. $this->normalize($this->basis_matrix[0]);
  1846. $this->normalize($this->basis_matrix[1]);
  1847. $this->basis_matrix[2] = $this->cross_product($this->basis_matrix[0], $this->basis_matrix[1]);
  1848. $this->normalize($this->basis_matrix[2]);
  1849. // $this->basis_matrix[1] might not be (probably isn't) orthogonal to $basis_matrix[0]
  1850. $this->basis_matrix[1] = $this->cross_product($this->basis_matrix[0], $this->basis_matrix[2]);
  1851. $this->normalize($this->basis_matrix[1]);
  1852. // Make sure our cube is facing into the canvas (assuming +z == in)
  1853. for ($i = 0; $i < 3; ++$i)
  1854. {
  1855. if ($this->basis_matrix[$i][2] < 0)
  1856. {
  1857. $this->basis_matrix[$i][0] *= -1;
  1858. $this->basis_matrix[$i][1] *= -1;
  1859. $this->basis_matrix[$i][2] *= -1;
  1860. }
  1861. }
  1862. // Force our "z" basis vector to be the one with greatest absolute z value
  1863. $this->x = 0;
  1864. $this->y = 1;
  1865. $this->z = 2;
  1866. // Swap "y" with "z"
  1867. if ($this->basis_matrix[1][2] > $this->basis_matrix[2][2])
  1868. {
  1869. $this->z = 1;
  1870. $this->y = 2;
  1871. }
  1872. // Swap "x" with "z"
  1873. if ($this->basis_matrix[0][2] > $this->basis_matrix[$this->z][2])
  1874. {
  1875. $this->x = $this->z;
  1876. $this->z = 0;
  1877. }
  1878. // Still need to determine which of $x,$y are which.
  1879. // wrong orientation if y's y-component is less than it's x-component
  1880. // likewise if x's x-component is less than it's y-component
  1881. // if they disagree, go with the one with the greater weight difference.
  1882. // rotate if positive
  1883. $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]));
  1884. // Swap "x" with "y"
  1885. if ($weight > 0)
  1886. {
  1887. list($this->x, $this->y) = array($this->y, $this->x);
  1888. }
  1889. $this->abs_x = array($this->basis_matrix[$this->x][0], $this->basis_matrix[$this->x][1]);
  1890. $this->abs_y = array($this->basis_matrix[$this->y][0], $this->basis_matrix[$this->y][1]);
  1891. if ($this->abs_x[0] < 0)
  1892. {
  1893. $this->abs_x[0] *= -1;
  1894. $this->abs_x[1] *= -1;
  1895. }
  1896. if ($this->abs_y[1] > 0)
  1897. {
  1898. $this->abs_y[0] *= -1;
  1899. $this->abs_y[1] *= -1;
  1900. }
  1901. $this->letter = $letter;
  1902. }
  1903. /**
  1904. * Draw a character
  1905. */
  1906. function drawchar($scale, $xoff, $yoff, $img, $background, $colours)
  1907. {
  1908. $width = $this->bitmap_width;
  1909. $height = $this->bitmap_height;
  1910. $bitmap = $this->bitmap;
  1911. $colour1 = $colours[array_rand($colours)];
  1912. $colour2 = $colours[array_rand($colours)];
  1913. $swapx = ($this->basis_matrix[$this->x][0] > 0);
  1914. $swapy = ($this->basis_matrix[$this->y][1] < 0);
  1915. for ($y = 0; $y < $height; ++$y)
  1916. {
  1917. for ($x = 0; $x < $width; ++$x)
  1918. {
  1919. $xp = ($swapx) ? ($width - $x - 1) : $x;
  1920. $yp = ($swapy) ? ($height - $y - 1) : $y;
  1921. if ($bitmap[$height - $yp - 1][$xp])
  1922. {
  1923. $dx = $this->scale($this->abs_x, ($xp - ($swapx ? ($width / 2) : ($width / 2) - 1)) * $scale);
  1924. $dy = $this->scale($this->abs_y, ($yp - ($swapy ? ($height / 2) : ($height / 2) - 1)) * $scale);
  1925. $xo = $xoff + $dx[0] + $dy[0];
  1926. $yo = $yoff + $dx[1] + $dy[1];
  1927. $origin = array(0, 0, 0);
  1928. $xvec = $this->scale($this->basis_matrix[$this->x], $scale);
  1929. $yvec = $this->scale($this->basis_matrix[$this->y], $scale);
  1930. $face_corner = $this->sum2($xvec, $yvec);
  1931. $zvec = $this->scale($this->basis_matrix[$this->z], $scale);
  1932. $x_corner = $this->sum2($xvec, $zvec);
  1933. $y_corner = $this->sum2($yvec, $zvec);
  1934. imagefilledpolygon($img, $this->gen_poly($xo, $yo, $origin, $xvec, $x_corner,$zvec), 4, $colour1);
  1935. imagefilledpolygon($img, $this->gen_poly($xo, $yo, $origin, $yvec, $y_corner,$zvec), 4, $colour2);
  1936. $face = $this->gen_poly($xo, $yo, $origin, $xvec, $face_corner, $yvec);
  1937. imagefilledpolygon($img, $face, 4, $background);
  1938. imagepolygon($img, $face, 4, $colour1);
  1939. }
  1940. }
  1941. }
  1942. }
  1943. /*
  1944. * return a roughly acceptable range of sizes for rendering with this texttype
  1945. */
  1946. function range()
  1947. {
  1948. return array(3, 4);
  1949. }
  1950. /**
  1951. * Vector length
  1952. */
  1953. function vectorlen($vector)
  1954. {
  1955. return sqrt(pow($vector[0], 2) + pow($vector[1], 2) + pow($vector[2], 2));
  1956. }
  1957. /**
  1958. * Normalize
  1959. */
  1960. function normalize(&$vector, $length = 1)
  1961. {
  1962. $length = (( $length < 1) ? 1 : $length);
  1963. $length /= $this->vectorlen($vector);
  1964. $vector[0] *= $length;
  1965. $vector[1] *= $length;
  1966. $vector[2] *= $length;
  1967. }
  1968. /**
  1969. */
  1970. function cross_product($vector1, $vector2)
  1971. {
  1972. $retval = array(0, 0, 0);
  1973. $retval[0] = (($vector1[1] * $vector2[2]) - ($vector1[2] * $vector2[1]));
  1974. $retval[1] = -(($vector1[0] * $vector2[2]) - ($vector1[2] * $vector2[0]));
  1975. $retval[2] = (($vector1[0] * $vector2[1]) - ($vector1[1] * $vector2[0]));
  1976. return $retval;
  1977. }
  1978. /**
  1979. */
  1980. function sum($vector1, $vector2)
  1981. {
  1982. return array($vector1[0] + $vector2[0], $vector1[1] + $vector2[1], $vector1[2] + $vector2[2]);
  1983. }
  1984. /**
  1985. */
  1986. function sum2($vector1, $vector2)
  1987. {
  1988. return array($vector1[0] + $vector2[0], $vector1[1] + $vector2[1]);
  1989. }
  1990. /**
  1991. */
  1992. function scale($vector, $length)
  1993. {
  1994. if (sizeof($vector) == 2)
  1995. {
  1996. return array($vector[0] * $length, $vector[1] * $length);
  1997. }
  1998. return array($vector[0] * $length, $vector[1] * $length, $vector[2] * $length);
  1999. }
  2000. /**
  2001. */
  2002. function gen_poly($xoff, $yoff, &$vec1, &$vec2, &$vec3, &$vec4)
  2003. {
  2004. $poly = array();
  2005. $poly[0] = $xoff + $vec1[0];
  2006. $poly[1] = $yoff + $vec1[1];
  2007. $poly[2] = $xoff + $vec2[0];
  2008. $poly[3] = $yoff + $vec2[1];
  2009. $poly[4] = $xoff + $vec3[0];
  2010. $poly[5] = $yoff + $vec3[1];
  2011. $poly[6] = $xoff + $vec4[0];
  2012. $poly[7] = $yoff + $vec4[1];
  2013. return $poly;
  2014. }
  2015. /**
  2016. * dimensions
  2017. */
  2018. function dimensions($size)
  2019. {
  2020. $xn = $this->scale($this->basis_matrix[$this->x], -($this->bitmap_width / 2) * $size);
  2021. $xp = $this->scale($this->basis_matrix[$this->x], ($this->bitmap_width / 2) * $size);
  2022. $yn = $this->scale($this->basis_matrix[$this->y], -($this->bitmap_height / 2) * $size);
  2023. $yp = $this->scale($this->basis_matrix[$this->y], ($this->bitmap_height / 2) * $size);
  2024. $p = array();
  2025. $p[0] = $this->sum2($xn, $yn);
  2026. $p[1] = $this->sum2($xp, $yn);
  2027. $p[2] = $this->sum2($xp, $yp);
  2028. $p[3] = $this->sum2($xn, $yp);
  2029. $min_x = $max_x = $p[0][0];
  2030. $min_y = $max_y = $p[0][1];
  2031. for ($i = 1; $i < 4; ++$i)
  2032. {
  2033. $min_x = ($min_x > $p[$i][0]) ? $p[$i][0] : $min_x;
  2034. $min_y = ($min_y > $p[$i][1]) ? $p[$i][1] : $min_y;
  2035. $max_x = ($max_x < $p[$i][0]) ? $p[$i][0] : $max_x;
  2036. $max_y = ($max_y < $p[$i][1]) ? $p[$i][1] : $max_y;
  2037. }
  2038. return array($min_x, $min_y, $max_x, $max_y);
  2039. }
  2040. }
  2041. /**
  2042. * @package VC
  2043. */
  2044. class colour_manager
  2045. {
  2046. var $img;
  2047. var $mode;
  2048. var $colours;
  2049. var $named_colours;
  2050. /**
  2051. * Create the colour manager, link it to the image resource
  2052. */
  2053. function __construct($img, $background = false, $mode = 'ahsv')
  2054. {
  2055. $this->img = $img;
  2056. $this->mode = $mode;
  2057. $this->colours = array();
  2058. $this->named_colours = array();
  2059. if ($background !== false)
  2060. {
  2061. $bg = $this->allocate_named('background', $background);
  2062. imagefill($this->img, 0, 0, $bg);
  2063. }
  2064. }
  2065. /**
  2066. * Lookup a named colour resource
  2067. */
  2068. function get_resource($named_colour)
  2069. {
  2070. if (isset($this->named_colours[$named_colour]))
  2071. {
  2072. return $this->named_colours[$named_colour];
  2073. }
  2074. if (isset($this->named_rgb[$named_colour]))
  2075. {
  2076. return $this->allocate_named($named_colour, $this->named_rgb[$named_colour], 'rgb');
  2077. }
  2078. return false;
  2079. }
  2080. /**
  2081. * Assign a name to a colour resource
  2082. */
  2083. function name_colour($name, $resource)
  2084. {
  2085. $this->named_colours[$name] = $resource;
  2086. }
  2087. /**
  2088. * names and allocates a colour resource
  2089. */
  2090. function allocate_named($name, $colour, $mode = false)
  2091. {
  2092. $resource = $this->allocate($colour, $mode);
  2093. if ($resource !== false)
  2094. {
  2095. $this->name_colour($name, $resource);
  2096. }
  2097. return $resource;
  2098. }
  2099. /**
  2100. * allocates a specified colour into the image
  2101. */
  2102. function allocate($colour, $mode = false)
  2103. {
  2104. if ($mode === false)
  2105. {
  2106. $mode = $this->mode;
  2107. }
  2108. if (!is_array($colour))
  2109. {
  2110. if (isset($this->named_rgb[$colour]))
  2111. {
  2112. return $this->allocate_named($colour, $this->named_rgb[$colour], 'rgb');
  2113. }
  2114. if (!is_int($colour))
  2115. {
  2116. return false;
  2117. }
  2118. $mode = 'rgb';
  2119. $colour = array(255 & ($colour >> 16), 255 & ($colour >> 8), 255 & $colour);
  2120. }
  2121. if (isset($colour['mode']))
  2122. {
  2123. $mode = $colour['mode'];
  2124. unset($colour['mode']);
  2125. }
  2126. if (isset($colour['random']))
  2127. {
  2128. unset($colour['random']);
  2129. // everything else is params
  2130. return $this->random_colour($colour, $mode);
  2131. }
  2132. $rgb = colour_manager::model_convert($colour, $mode, 'rgb');
  2133. $store = ($this->mode == 'rgb') ? $rgb : colour_manager::model_convert($colour, $mode, $this->mode);
  2134. $resource = imagecolorallocate($this->img, $rgb[0], $rgb[1], $rgb[2]);
  2135. $this->colours[$resource] = $store;
  2136. return $resource;
  2137. }
  2138. /**
  2139. * randomly generates a colour, with optional params
  2140. */
  2141. function random_colour($params = array(), $mode = false)
  2142. {
  2143. if ($mode === false)
  2144. {
  2145. $mode = $this->mode;
  2146. }
  2147. switch ($mode)
  2148. {
  2149. case 'rgb':
  2150. // @TODO random rgb generation. do we intend to do this, or is it just too tedious?
  2151. break;
  2152. case 'ahsv':
  2153. case 'hsv':
  2154. default:
  2155. $default_params = array(
  2156. 'hue_bias' => false, // degree / 'r'/'g'/'b'/'c'/'m'/'y' /'o'
  2157. 'hue_range' => false, // if hue bias, then difference range +/- from bias
  2158. 'min_saturation' => 30, // 0 - 100
  2159. 'max_saturation' => 80, // 0 - 100
  2160. 'min_value' => 30, // 0 - 100
  2161. 'max_value' => 80, // 0 - 100
  2162. );
  2163. $alt = ($mode == 'ahsv') ? true : false;
  2164. $params = array_merge($default_params, $params);
  2165. $min_hue = 0;
  2166. $max_hue = 359;
  2167. $min_saturation = max(0, $params['min_saturation']);
  2168. $max_saturation = min(100, $params['max_saturation']);
  2169. $min_value = max(0, $params['min_value']);
  2170. $max_value = min(100, $params['max_value']);
  2171. if ($params['hue_bias'] !== false)
  2172. {
  2173. if (is_numeric($params['hue_bias']))
  2174. {
  2175. $h = intval($params['hue_bias']) % 360;
  2176. }
  2177. else
  2178. {
  2179. switch ($params['hue_bias'])
  2180. {
  2181. case 'o':
  2182. $h = $alt ? 60 : 30;
  2183. break;
  2184. case 'y':
  2185. $h = $alt ? 120 : 60;
  2186. break;
  2187. case 'g':
  2188. $h = $alt ? 180 : 120;
  2189. break;
  2190. case 'c':
  2191. $h = $alt ? 210 : 180;
  2192. break;
  2193. case 'b':
  2194. $h = 240;
  2195. break;
  2196. case 'm':
  2197. $h = 300;
  2198. break;
  2199. case 'r':
  2200. default:
  2201. $h = 0;
  2202. break;
  2203. }
  2204. }
  2205. $min_hue = $h + 360;
  2206. $max_hue = $h + 360;
  2207. if ($params['hue_range'])
  2208. {
  2209. $min_hue -= min(180, $params['hue_range']);
  2210. $max_hue += min(180, $params['hue_range']);
  2211. }
  2212. }
  2213. $h = mt_rand($min_hue, $max_hue);
  2214. $s = mt_rand($min_saturation, $max_saturation);
  2215. $v = mt_rand($min_value, $max_value);
  2216. return $this->allocate(array($h, $s, $v), $mode);
  2217. break;
  2218. }
  2219. }
  2220. /**
  2221. */
  2222. function colour_scheme($resource, $include_original = true)
  2223. {
  2224. $mode = 'hsv';
  2225. if (($pre = $this->get_resource($resource)) !== false)
  2226. {
  2227. $resource = $pre;
  2228. }
  2229. $colour = colour_manager::model_convert($this->colours[$resource], $this->mode, $mode);
  2230. $results = ($include_original) ? array($resource) : array();
  2231. $colour2 = $colour3 = $colour4 = $colour;
  2232. $colour2[0] += 150;
  2233. $colour3[0] += 180;
  2234. $colour4[0] += 210;
  2235. $results[] = $this->allocate($colour2, $mode);
  2236. $results[] = $this->allocate($colour3, $mode);
  2237. $results[] = $this->allocate($colour4, $mode);
  2238. return $results;
  2239. }
  2240. /**
  2241. */
  2242. function mono_range($resource, $count = 5, $include_original = true)
  2243. {
  2244. if (is_array($resource))
  2245. {
  2246. $results = array();
  2247. for ($i = 0, $size = sizeof($resource); $i < $size; ++$i)
  2248. {
  2249. $results = array_merge($results, $this->mono_range($resource[$i], $count, $include_original));
  2250. }
  2251. return $results;
  2252. }
  2253. $mode = (in_array($this->mode, array('hsv', 'ahsv'), true) ? $this->mode : 'ahsv');
  2254. if (($pre = $this->get_resource($resource)) !== false)
  2255. {
  2256. $resource = $pre;
  2257. }
  2258. $colour = colour_manager::model_convert($this->colours[$resource], $this->mode, $mode);
  2259. $results = array();
  2260. if ($include_original)
  2261. {
  2262. $results[] = $resource;
  2263. $count--;
  2264. }
  2265. // This is a hard problem. I chicken out and try to maintain readability at the cost of less randomness.
  2266. while ($count > 0)
  2267. {
  2268. $colour[1] = ($colour[1] + mt_rand(40,60)) % 99;
  2269. $colour[2] = ($colour[2] + mt_rand(40,60));
  2270. $results[] = $this->allocate($colour, $mode);
  2271. $count--;
  2272. }
  2273. return $results;
  2274. }
  2275. /**
  2276. * Convert from one colour model to another
  2277. */
  2278. function model_convert($colour, $from_model, $to_model)
  2279. {
  2280. if ($from_model == $to_model)
  2281. {
  2282. return $colour;
  2283. }
  2284. switch ($to_model)
  2285. {
  2286. case 'hsv':
  2287. switch ($from_model)
  2288. {
  2289. case 'ahsv':
  2290. return colour_manager::ah2h($colour);
  2291. break;
  2292. case 'rgb':
  2293. return colour_manager::rgb2hsv($colour);
  2294. break;
  2295. }
  2296. break;
  2297. case 'ahsv':
  2298. switch ($from_model)
  2299. {
  2300. case 'hsv':
  2301. return colour_manager::h2ah($colour);
  2302. break;
  2303. case 'rgb':
  2304. return colour_manager::h2ah(colour_manager::rgb2hsv($colour));
  2305. break;
  2306. }
  2307. break;
  2308. case 'rgb':
  2309. switch ($from_model)
  2310. {
  2311. case 'hsv':
  2312. return colour_manager::hsv2rgb($colour);
  2313. break;
  2314. case 'ahsv':
  2315. return colour_manager::hsv2rgb(colour_manager::ah2h($colour));
  2316. break;
  2317. }
  2318. break;
  2319. }
  2320. return false;
  2321. }
  2322. /**
  2323. * Slightly altered from wikipedia's algorithm
  2324. */
  2325. function hsv2rgb($hsv)
  2326. {
  2327. colour_manager::normalize_hue($hsv[0]);
  2328. $h = $hsv[0];
  2329. $s = min(1, max(0, $hsv[1] / 100));
  2330. $v = min(1, max(0, $hsv[2] / 100));
  2331. // calculate hue sector
  2332. $hi = floor($hsv[0] / 60);
  2333. // calculate opposite colour
  2334. $p = $v * (1 - $s);
  2335. // calculate distance between hex vertices
  2336. $f = ($h / 60) - $hi;
  2337. // coming in or going out?
  2338. if (!($hi & 1))
  2339. {
  2340. $f = 1 - $f;
  2341. }
  2342. // calculate adjacent colour
  2343. $q = $v * (1 - ($f * $s));
  2344. switch ($hi)
  2345. {
  2346. case 0:
  2347. $rgb = array($v, $q, $p);
  2348. break;
  2349. case 1:
  2350. $rgb = array($q, $v, $p);
  2351. break;
  2352. case 2:
  2353. $rgb = array($p, $v, $q);
  2354. break;
  2355. case 3:
  2356. $rgb = array($p, $q, $v);
  2357. break;
  2358. case 4:
  2359. $rgb = array($q, $p, $v);
  2360. break;
  2361. case 5:
  2362. $rgb = array($v, $p, $q);
  2363. break;
  2364. default:
  2365. return array(0, 0, 0);
  2366. break;
  2367. }
  2368. return array(255 * $rgb[0], 255 * $rgb[1], 255 * $rgb[2]);
  2369. }
  2370. /**
  2371. * (more than) Slightly altered from wikipedia's algorithm
  2372. */
  2373. function rgb2hsv($rgb)
  2374. {
  2375. $r = min(255, max(0, $rgb[0]));
  2376. $g = min(255, max(0, $rgb[1]));
  2377. $b = min(255, max(0, $rgb[2]));
  2378. $max = max($r, $g, $b);
  2379. $min = min($r, $g, $b);
  2380. $v = $max / 255;
  2381. $s = (!$max) ? 0 : 1 - ($min / $max);
  2382. // if max - min is 0, we want hue to be 0 anyway.
  2383. $h = $max - $min;
  2384. if ($h)
  2385. {
  2386. switch ($max)
  2387. {
  2388. case $g:
  2389. $h = 120 + (60 * ($b - $r) / $h);
  2390. break;
  2391. case $b:
  2392. $h = 240 + (60 * ($r - $g) / $h);
  2393. break;
  2394. case $r:
  2395. $h = 360 + (60 * ($g - $b) / $h);
  2396. break;
  2397. }
  2398. }
  2399. colour_manager::normalize_hue($h);
  2400. return array($h, $s * 100, $v * 100);
  2401. }
  2402. /**
  2403. */
  2404. function normalize_hue(&$hue)
  2405. {
  2406. $hue %= 360;
  2407. if ($hue < 0)
  2408. {
  2409. $hue += 360;
  2410. }
  2411. }
  2412. /**
  2413. * Alternate hue to hue
  2414. */
  2415. function ah2h($ahue)
  2416. {
  2417. if (is_array($ahue))
  2418. {
  2419. $ahue[0] = colour_manager::ah2h($ahue[0]);
  2420. return $ahue;
  2421. }
  2422. colour_manager::normalize_hue($ahue);
  2423. // blue through red is already ok
  2424. if ($ahue >= 240)
  2425. {
  2426. return $ahue;
  2427. }
  2428. // ahue green is at 180
  2429. if ($ahue >= 180)
  2430. {
  2431. // return (240 - (2 * (240 - $ahue)));
  2432. return (2 * $ahue) - 240; // equivalent
  2433. }
  2434. // ahue yellow is at 120 (RYB rather than RGB)
  2435. if ($ahue >= 120)
  2436. {
  2437. return $ahue - 60;
  2438. }
  2439. return $ahue / 2;
  2440. }
  2441. /**
  2442. * hue to Alternate hue
  2443. */
  2444. function h2ah($hue)
  2445. {
  2446. if (is_array($hue))
  2447. {
  2448. $hue[0] = colour_manager::h2ah($hue[0]);
  2449. return $hue;
  2450. }
  2451. colour_manager::normalize_hue($hue);
  2452. // blue through red is already ok
  2453. if ($hue >= 240)
  2454. {
  2455. return $hue;
  2456. }
  2457. else if ($hue <= 60)
  2458. {
  2459. return $hue * 2;
  2460. }
  2461. else if ($hue <= 120)
  2462. {
  2463. return $hue + 60;
  2464. }
  2465. else
  2466. {
  2467. return ($hue + 240) / 2;
  2468. }
  2469. }
  2470. }
  2471. ?>