PageRenderTime 65ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/forum/includes/captcha/captcha_gd.php

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