PageRenderTime 80ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/includes/captcha/captcha_gd_wave.php

http://github.com/MightyGorgon/icy_phoenix
PHP | 853 lines | 731 code | 51 blank | 71 comment | 16 complexity | 90cc05e65d386665d63212a1bd6aaef4 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. /**
  17. * Wave3D CAPTCHA
  18. *
  19. * @author Robert Hetzler
  20. * @package VC
  21. */
  22. class captcha
  23. {
  24. var $width = 360;
  25. var $height = 96;
  26. function execute($code, $seed)
  27. {
  28. global $starttime;
  29. // seed the random generator
  30. mt_srand($seed);
  31. // set height and width
  32. $img_x = $this->width;
  33. $img_y = $this->height;
  34. // Generate image
  35. $img = imagecreatetruecolor($img_x, $img_y);
  36. $x_grid = mt_rand(6, 10);
  37. $y_grid = mt_rand(6, 10);
  38. // Ok, so lets cut to the chase. We could accurately represent this in 3d and
  39. // do all the appropriate linear transforms. my questions is... why bother?
  40. // The computational overhead is unnecessary when you consider the simple fact:
  41. // we're not here to accurately represent a model, but to just show off some random-ish
  42. // polygons
  43. // Conceive of 3 spaces.
  44. // 1) planar-space (discrete "pixel" grid)
  45. // 2) 3-space. (planar-space with z/height aspect)
  46. // 3) image space (pixels on the screen)
  47. // resolution of the planar-space we're embedding the text code in
  48. $plane_x = 100;
  49. $plane_y = 30;
  50. $subdivision_factor = 3;
  51. // $box is the 4 points in img_space that correspond to the corners of the plane in 3-space
  52. $box = array(
  53. 'upper_left' => array(
  54. 'x' => mt_rand(5, 15),
  55. 'y' => mt_rand(10, 15)
  56. ),
  57. 'upper_right' => array(
  58. 'x' => mt_rand($img_x - 35, $img_x - 19),
  59. 'y' => mt_rand(10, 17)
  60. ),
  61. 'lower_left' => array(
  62. 'x' => mt_rand($img_x - 5, $img_x - 45),
  63. 'y' => mt_rand($img_y - 0, $img_y - 15)
  64. ),
  65. );
  66. $box['lower_right'] = array(
  67. 'x' => $box['lower_left']['x'] + $box['upper_left']['x'] - $box['upper_right']['x'],
  68. 'y' => $box['lower_left']['y'] + $box['upper_left']['y'] - $box['upper_right']['y'],
  69. );
  70. // TODO
  71. $background = imagecolorallocate($img, mt_rand(155, 255), mt_rand(155, 255), mt_rand(155, 255));
  72. imagefill($img, 0, 0, $background);
  73. $black = imagecolorallocate($img, 0, 0, 0);
  74. $random = array();
  75. $fontcolors = array();
  76. for ($i = 0; $i < 15; ++$i)
  77. {
  78. $random[$i] = imagecolorallocate($img, mt_rand(120, 255), mt_rand(120, 255), mt_rand(120, 255));
  79. }
  80. $fontcolors[0] = imagecolorallocate($img, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120));
  81. $colors = array();
  82. $minr = mt_rand(20, 30);
  83. $ming = mt_rand(20, 30);
  84. $minb = mt_rand(20, 30);
  85. $maxr = mt_rand(150, 230);
  86. $maxg = mt_rand(150, 230);
  87. $maxb = mt_rand(150, 230);
  88. for ($i = -30; $i <= 30; ++$i)
  89. {
  90. $coeff1 = ($i + 12) / 45;
  91. $coeff2 = 1 - $coeff1;
  92. $colors[$i] = imagecolorallocate($img, ($coeff2 * $maxr) + ($coeff1 * $minr), ($coeff2 * $maxg) + ($coeff1 * $ming), ($coeff2 * $maxb) + ($coeff1 * $minb));
  93. }
  94. // $img_buffer is the last row of 3-space positions (converted to img-space), cached
  95. // (using this means we don't need to recalculate all 4 positions for each new polygon,
  96. // merely the newest point that we're adding, which is then cached.
  97. $img_buffer = array(array(), array());
  98. // In image-space, the x- and y-offset necessary to move one unit in the x-direction in planar-space
  99. $dxx = ($box['upper_right']['x'] - $box['upper_left']['x']) / ($subdivision_factor * $plane_x);
  100. $dxy = ($box['upper_right']['y'] - $box['upper_left']['y']) / ($subdivision_factor * $plane_x);
  101. // In image-space, the x- and y-offset necessary to move one unit in the y-direction in planar-space
  102. $dyx = ($box['lower_right']['x'] - $box['upper_left']['x']) / ($subdivision_factor * $plane_y);
  103. $dyy = ($box['lower_right']['y'] - $box['upper_left']['y']) / ($subdivision_factor * $plane_y);
  104. // Initial captcha-letter offset in planar-space
  105. $plane_offset_x = mt_rand(3, 8);
  106. $plane_offset_y = mt_rand( 12, 15);
  107. // character map
  108. $map = $this->captcha_bitmaps();
  109. // matrix
  110. $plane = array();
  111. // for each character, we'll silkscreen it into our boolean pixel plane
  112. for ($c = 0, $code_num = strlen($code); $c < $code_num; ++$c)
  113. {
  114. $letter = $code[$c];
  115. for ($x = $map['width'] - 1; $x >= 0; --$x)
  116. {
  117. for ($y = $map['height'] - 1; $y >= 0; --$y)
  118. {
  119. if ($map['data'][$letter][$y][$x])
  120. {
  121. $plane[$y + $plane_offset_y + (($c & 1) ? 1 : -1)][$x + $plane_offset_x] = true;
  122. }
  123. }
  124. }
  125. $plane_offset_x += 11;
  126. }
  127. // calculate our first buffer, we can't actually draw polys with these yet
  128. // img_pos_prev == screen x,y location to our immediate left.
  129. // img_pos_cur == current screen x,y location
  130. // we calculate screen position of our
  131. // current cell based on the difference from the previous cell
  132. // rather than recalculating from absolute coordinates
  133. // What we cache into the $img_buffer contains the raised text coordinates.
  134. $img_pos_prev = $img_buffer[0][0] = array($box['upper_left']['x'], $box['upper_left']['y']);
  135. $cur_height = $prev_height = $this->wave_height(0, 0, $subdivision_factor);
  136. $full_x = $plane_x * $subdivision_factor;
  137. $full_y = $plane_y * $subdivision_factor;
  138. for ($x = 1; $x <= $full_x; ++$x)
  139. {
  140. $cur_height = $this->wave_height($x, 0, $subdivision_factor);
  141. $offset = $cur_height - $prev_height;
  142. $img_pos_cur = array($img_pos_prev[0] + $dxx, $img_pos_prev[1] + $dxy + $offset);
  143. $img_buffer[0][$x] = $img_pos_cur;
  144. $img_pos_prev = $img_pos_cur;
  145. $prev_height = $cur_height;
  146. }
  147. for ($y = 1; $y <= $full_y; ++$y)
  148. {
  149. // swap buffers
  150. $buffer_cur = $y & 1;
  151. $buffer_prev = 1 - $buffer_cur;
  152. $prev_height = $this->wave_height(0, $y, $subdivision_factor);
  153. $offset = $prev_height - $this->wave_height(0, $y - 1, $subdivision_factor);
  154. $img_pos_cur = array($img_buffer[$buffer_prev][0][0] + $dyx, min($img_buffer[$buffer_prev][0][1] + $dyy + $offset, $img_y - 1));
  155. // make sure we don't try to write off the page
  156. $img_pos_prev = $img_pos_cur;
  157. $img_buffer[$buffer_cur][0] = $img_pos_cur;
  158. for ($x = 1; $x <= $full_x; ++$x)
  159. {
  160. $cur_height = $this->wave_height($x, $y, $subdivision_factor) + $this->grid_height($x, $y, 1, $x_grid, $y_grid);
  161. // height is a z-factor, not a y-factor
  162. $offset = $cur_height - $prev_height;
  163. $img_pos_cur = array($img_pos_prev[0] + $dxx, $img_pos_prev[1] + $dxy + $offset);
  164. // height is float, index it to an int, get closest color
  165. $color = $colors[intval($cur_height)];
  166. $img_pos_prev = $img_pos_cur;
  167. $prev_height = $cur_height;
  168. $y_index_old = intval(($y - 1) / $subdivision_factor);
  169. $y_index_new = intval($y / $subdivision_factor);
  170. $x_index_old = intval(($x - 1) / $subdivision_factor);
  171. $x_index_new = intval($x / $subdivision_factor);
  172. if (!empty($plane[$y_index_new][$x_index_new]))
  173. {
  174. $img_pos_cur[1] += $this->wave_height($x, $y, $subdivision_factor, 1) - 30 - $cur_height;
  175. $color = $colors[20];
  176. }
  177. $img_pos_cur[1] = min($img_pos_cur[1], $img_y - 1);
  178. $img_buffer[$buffer_cur][$x] = $img_pos_cur;
  179. // Smooth the edges as much as possible by having not more than one low<->high traingle per square
  180. // Otherwise, just
  181. $diag_down = (empty($plane[$y_index_old][$x_index_old]) == empty($plane[$y_index_new][$x_index_new]));
  182. $diag_up = (empty($plane[$y_index_old][$x_index_new]) == empty($plane[$y_index_new][$x_index_old]));
  183. // natural switching
  184. $mode = ($x + $y) & 1;
  185. // override if it requires it
  186. if ($diag_down != $diag_up)
  187. {
  188. $mode = $diag_up;
  189. }
  190. if ($mode)
  191. {
  192. // +-/ /
  193. // 1 |/ 2 /|
  194. // / /-+
  195. $poly1 = array_merge($img_buffer[$buffer_cur][$x - 1], $img_buffer[$buffer_prev][$x - 1], $img_buffer[$buffer_prev][$x]);
  196. $poly2 = array_merge($img_buffer[$buffer_cur][$x - 1], $img_buffer[$buffer_cur][$x], $img_buffer[$buffer_prev][$x]);
  197. }
  198. else
  199. {
  200. // \ \-+
  201. // 1 |\ 2 \|
  202. // +-\ \
  203. $poly1 = array_merge($img_buffer[$buffer_cur][$x - 1], $img_buffer[$buffer_prev][$x - 1], $img_buffer[$buffer_cur][$x]);
  204. $poly2 = array_merge($img_buffer[$buffer_prev][$x - 1], $img_buffer[$buffer_prev][$x], $img_buffer[$buffer_cur][$x]);
  205. }
  206. imagefilledpolygon($img, $poly1, 3, $color);
  207. imagefilledpolygon($img, $poly2, 3, $color);
  208. }
  209. }
  210. // Output image
  211. header('Content-Type: image/png');
  212. header('Cache-control: no-cache, no-store');
  213. //$mtime = explode(' ', microtime());
  214. //$totaltime = $mtime[0] + $mtime[1] - $starttime;
  215. //echo $totaltime . "<br />\n";
  216. //echo memory_get_usage() - $tmp;
  217. imagepng($img);
  218. imagedestroy($img);
  219. }
  220. function wave_height($x, $y, $factor = 1, $tweak = 0.7)
  221. {
  222. // stretch the wave. TODO: pretty it up
  223. $x = $x/5 + 180;
  224. $y = $y/4;
  225. return ((sin($x / (3 * $factor)) + sin($y / (3 * $factor))) * 10 * $tweak);
  226. }
  227. function grid_height($x, $y, $factor = 1, $x_grid, $y_grid)
  228. {
  229. return ((!($x % ($x_grid * $factor)) || !($y % ($y_grid * $factor))) ? 3 : 0);
  230. }
  231. function captcha_bitmaps()
  232. {
  233. return array(
  234. 'width' => 9,
  235. 'height' => 13,
  236. 'data' => array(
  237. 'A' => array(
  238. array(0,0,1,1,1,1,0,0,0),
  239. array(0,1,0,0,0,0,1,0,0),
  240. array(1,0,0,0,0,0,0,1,0),
  241. array(1,0,0,0,0,0,0,1,0),
  242. array(1,0,0,0,0,0,0,1,0),
  243. array(1,0,0,0,0,0,0,1,0),
  244. array(1,0,0,0,0,0,0,1,0),
  245. array(1,1,1,1,1,1,1,1,0),
  246. array(1,0,0,0,0,0,0,1,0),
  247. array(1,0,0,0,0,0,0,1,0),
  248. array(1,0,0,0,0,0,0,1,0),
  249. array(1,0,0,0,0,0,0,1,0),
  250. array(1,0,0,0,0,0,0,1,0),
  251. array(0,0,0,0,0,0,0,0,0),
  252. ),
  253. 'B' => array(
  254. array(1,1,1,1,1,1,0,0,0),
  255. array(1,0,0,0,0,0,1,0,0),
  256. array(1,0,0,0,0,0,0,1,0),
  257. array(1,0,0,0,0,0,0,1,0),
  258. array(1,0,0,0,0,0,0,1,0),
  259. array(1,0,0,0,0,0,1,0,0),
  260. array(1,1,1,1,1,1,0,0,0),
  261. array(1,0,0,0,0,0,1,0,0),
  262. array(1,0,0,0,0,0,0,1,0),
  263. array(1,0,0,0,0,0,0,1,0),
  264. array(1,0,0,0,0,0,0,1,0),
  265. array(1,0,0,0,0,0,1,0,0),
  266. array(1,1,1,1,1,1,0,0,0),
  267. array(0,0,0,0,0,0,0,0,0),
  268. ),
  269. 'C' => array(
  270. array(0,0,1,1,1,1,1,0,0),
  271. array(0,1,0,0,0,0,0,1,0),
  272. array(1,0,0,0,0,0,0,0,1),
  273. array(1,0,0,0,0,0,0,0,0),
  274. array(1,0,0,0,0,0,0,0,0),
  275. array(1,0,0,0,0,0,0,0,0),
  276. array(1,0,0,0,0,0,0,0,0),
  277. array(1,0,0,0,0,0,0,0,0),
  278. array(1,0,0,0,0,0,0,0,0),
  279. array(1,0,0,0,0,0,0,0,1),
  280. array(0,1,0,0,0,0,0,1,0),
  281. array(0,0,1,1,1,1,1,0,0),
  282. array(0,0,0,0,0,0,0,0,0),
  283. array(0,0,0,0,0,0,0,0,0),
  284. ),
  285. 'D' => array(
  286. array(1,1,1,1,1,1,1,0,0),
  287. array(1,0,0,0,0,0,0,1,0),
  288. array(1,0,0,0,0,0,0,0,1),
  289. array(1,0,0,0,0,0,0,0,1),
  290. array(1,0,0,0,0,0,0,0,1),
  291. array(1,0,0,0,0,0,0,0,1),
  292. array(1,0,0,0,0,0,0,0,1),
  293. array(1,0,0,0,0,0,0,0,1),
  294. array(1,0,0,0,0,0,0,0,1),
  295. array(1,0,0,0,0,0,0,1,0),
  296. array(1,1,1,1,1,1,1,0,0),
  297. array(0,0,0,0,0,0,0,0,0),
  298. array(0,0,0,0,0,0,0,0,0),
  299. array(0,0,0,0,0,0,0,0,0),
  300. ),
  301. 'E' => array(
  302. array(0,0,1,1,1,1,1,1,1),
  303. array(0,1,0,0,0,0,0,0,0),
  304. array(1,0,0,0,0,0,0,0,0),
  305. array(1,0,0,0,0,0,0,0,0),
  306. array(1,0,0,0,0,0,0,0,0),
  307. array(1,1,1,1,1,1,1,0,0),
  308. array(1,0,0,0,0,0,0,0,0),
  309. array(1,0,0,0,0,0,0,0,0),
  310. array(1,0,0,0,0,0,0,0,0),
  311. array(0,1,0,0,0,0,0,0,0),
  312. array(0,0,1,1,1,1,1,1,1),
  313. array(0,0,0,0,0,0,0,0,0),
  314. array(0,0,0,0,0,0,0,0,0),
  315. array(0,0,0,0,0,0,0,0,0),
  316. ),
  317. 'F' => array(
  318. array(0,0,1,1,1,1,1,1,0),
  319. array(0,1,0,0,0,0,0,0,0),
  320. array(1,0,0,0,0,0,0,0,0),
  321. array(1,0,0,0,0,0,0,0,0),
  322. array(1,0,0,0,0,0,0,0,0),
  323. array(1,1,1,1,1,1,0,0,0),
  324. array(1,0,0,0,0,0,0,0,0),
  325. array(1,0,0,0,0,0,0,0,0),
  326. array(1,0,0,0,0,0,0,0,0),
  327. array(1,0,0,0,0,0,0,0,0),
  328. array(1,0,0,0,0,0,0,0,0),
  329. array(1,0,0,0,0,0,0,0,0),
  330. array(0,0,0,0,0,0,0,0,0),
  331. array(0,0,0,0,0,0,0,0,0),
  332. ),
  333. 'G' => array(
  334. array(0,0,1,1,1,1,1,0,0),
  335. array(0,1,0,0,0,0,0,1,0),
  336. array(1,0,0,0,0,0,0,0,1),
  337. array(1,0,0,0,0,0,0,0,1),
  338. array(1,0,0,0,0,0,0,0,0),
  339. array(1,0,0,0,0,0,0,0,0),
  340. array(1,0,0,0,0,0,0,0,0),
  341. array(1,0,0,0,0,0,0,1,1),
  342. array(1,0,0,0,0,0,0,0,1),
  343. array(1,0,0,0,0,0,0,0,1),
  344. array(0,1,0,0,0,0,0,1,0),
  345. array(0,0,1,1,1,1,1,0,0),
  346. array(0,0,0,0,0,0,0,0,0),
  347. array(0,0,0,0,0,0,0,0,0),
  348. ),
  349. 'H' => array(
  350. array(1,0,0,0,0,0,1,0,0),
  351. array(1,0,0,0,0,0,1,0,0),
  352. array(1,0,0,0,0,0,1,0,0),
  353. array(1,0,0,0,0,0,1,0,0),
  354. array(1,0,0,0,0,0,1,0,0),
  355. array(1,1,1,1,1,1,1,0,0),
  356. array(1,0,0,0,0,0,1,0,0),
  357. array(1,0,0,0,0,0,1,0,0),
  358. array(1,0,0,0,0,0,1,0,0),
  359. array(1,0,0,0,0,0,1,0,0),
  360. array(1,0,0,0,0,0,1,0,0),
  361. array(0,0,0,0,0,0,0,0,0),
  362. array(0,0,0,0,0,0,0,0,0),
  363. array(0,0,0,0,0,0,0,0,0),
  364. ),
  365. 'I' => array(
  366. array(0,1,1,1,1,1,1,1,0),
  367. array(0,0,0,0,1,0,0,0,0),
  368. array(0,0,0,0,1,0,0,0,0),
  369. array(0,0,0,0,1,0,0,0,0),
  370. array(0,0,0,0,1,0,0,0,0),
  371. array(0,0,0,0,1,0,0,0,0),
  372. array(0,0,0,0,1,0,0,0,0),
  373. array(0,0,0,0,1,0,0,0,0),
  374. array(0,0,0,0,1,0,0,0,0),
  375. array(0,1,1,1,1,1,1,1,0),
  376. array(0,0,0,0,0,0,0,0,0),
  377. array(0,0,0,0,0,0,0,0,0),
  378. array(0,0,0,0,0,0,0,0,0),
  379. array(0,0,0,0,0,0,0,0,0),
  380. ),
  381. 'J' => array(
  382. array(0,0,0,0,0,0,1,1,1),
  383. array(0,0,0,0,0,0,0,0,1),
  384. array(0,0,0,0,0,0,0,0,1),
  385. array(0,0,0,0,0,0,0,0,1),
  386. array(0,0,0,0,0,0,0,0,1),
  387. array(0,0,0,0,0,0,0,0,1),
  388. array(0,0,0,0,0,0,0,0,1),
  389. array(0,1,0,0,0,0,0,0,1),
  390. array(0,1,0,0,0,0,0,0,1),
  391. array(0,0,1,0,0,0,0,1,0),
  392. array(0,0,0,1,1,1,1,0,0),
  393. array(0,0,0,0,0,0,0,0,0),
  394. array(0,0,0,0,0,0,0,0,0),
  395. array(0,0,0,0,0,0,0,0,0),
  396. ),
  397. 'K' => array(
  398. array(1,0,0,0,0,0,1,0,0),
  399. array(1,0,0,0,0,1,0,0,0),
  400. array(1,0,0,0,1,0,0,0,0),
  401. array(1,0,0,1,0,0,0,0,0),
  402. array(1,0,1,0,0,0,0,0,0),
  403. array(1,1,0,0,0,0,0,0,0),
  404. array(1,0,1,0,0,0,0,0,0),
  405. array(1,0,0,1,0,0,0,0,0),
  406. array(1,0,0,0,1,0,0,0,0),
  407. array(1,0,0,0,0,1,0,0,0),
  408. array(1,0,0,0,0,0,1,0,0),
  409. array(0,0,0,0,0,0,0,0,0),
  410. array(0,0,0,0,0,0,0,0,0),
  411. array(0,0,0,0,0,0,0,0,0),
  412. ),
  413. 'L' => array(
  414. array(1,0,0,0,0,0,0,0,0),
  415. array(1,0,0,0,0,0,0,0,0),
  416. array(1,0,0,0,0,0,0,0,0),
  417. array(1,0,0,0,0,0,0,0,0),
  418. array(1,0,0,0,0,0,0,0,0),
  419. array(1,0,0,0,0,0,0,0,0),
  420. array(1,0,0,0,0,0,0,0,0),
  421. array(1,0,0,0,0,0,0,0,0),
  422. array(1,0,0,0,0,0,0,0,0),
  423. array(0,1,0,0,0,0,0,0,0),
  424. array(0,0,1,1,1,1,0,0,0),
  425. array(0,0,0,0,0,0,0,0,0),
  426. array(0,0,0,0,0,0,0,0,0),
  427. array(0,0,0,0,0,0,0,0,0),
  428. ),
  429. 'M' => array(
  430. array(0,1,0,0,0,0,0,1,0),
  431. array(0,1,1,0,0,0,1,1,0),
  432. array(0,1,0,1,0,1,0,1,0),
  433. array(0,1,0,0,1,0,0,1,0),
  434. array(0,1,0,0,0,0,0,1,0),
  435. array(0,1,0,0,0,0,0,1,0),
  436. array(0,1,0,0,0,0,0,1,0),
  437. array(0,1,0,0,0,0,0,1,0),
  438. array(0,1,0,0,0,0,0,1,0),
  439. array(0,0,0,0,0,0,0,0,0),
  440. array(0,0,0,0,0,0,0,0,0),
  441. array(0,0,0,0,0,0,0,0,0),
  442. array(0,0,0,0,0,0,0,0,0),
  443. array(0,0,0,0,0,0,0,0,0),
  444. ),
  445. 'N' => array(
  446. array(1,0,0,0,0,0,0,0,1),
  447. array(1,1,0,0,0,0,0,0,1),
  448. array(1,0,1,0,0,0,0,0,1),
  449. array(1,0,0,1,0,0,0,0,1),
  450. array(1,0,0,0,1,0,0,0,1),
  451. array(1,0,0,0,0,1,0,0,1),
  452. array(1,0,0,0,0,0,1,0,1),
  453. array(1,0,0,0,0,0,0,1,1),
  454. array(1,0,0,0,0,0,0,0,1),
  455. array(0,0,0,0,0,0,0,0,0),
  456. array(0,0,0,0,0,0,0,0,0),
  457. array(0,0,0,0,0,0,0,0,0),
  458. array(0,0,0,0,0,0,0,0,0),
  459. array(0,0,0,0,0,0,0,0,0),
  460. ),
  461. 'O' => array(
  462. array(0,0,0,1,1,1,0,0,0),
  463. array(0,0,1,0,0,0,1,0,0),
  464. array(0,1,0,0,0,0,0,1,0),
  465. array(1,0,0,0,0,0,0,0,1),
  466. array(1,0,0,0,0,0,0,0,1),
  467. array(1,0,0,0,0,0,0,0,1),
  468. array(1,0,0,0,0,0,0,0,1),
  469. array(1,0,0,0,0,0,0,0,1),
  470. array(0,1,0,0,0,0,0,1,0),
  471. array(0,0,1,0,0,0,1,0,0),
  472. array(0,0,0,1,1,1,0,0,0),
  473. array(0,0,0,0,0,0,0,0,0),
  474. array(0,0,0,0,0,0,0,0,0),
  475. array(0,0,0,0,0,0,0,0,0),
  476. ),
  477. 'P' => array(
  478. array(1,1,1,1,1,1,0,0,0),
  479. array(1,0,0,0,0,0,1,0,0),
  480. array(1,0,0,0,0,0,0,1,0),
  481. array(1,0,0,0,0,0,0,1,0),
  482. array(1,0,0,0,0,0,0,1,0),
  483. array(1,0,0,0,0,0,0,1,0),
  484. array(1,0,0,0,0,0,1,0,0),
  485. array(1,1,1,1,1,1,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,0,0,0,0,0,0,0,0),
  490. array(1,0,0,0,0,0,0,0,0),
  491. array(0,0,0,0,0,0,0,0,0),
  492. ),
  493. 'Q' => array(
  494. array(0,0,1,1,1,1,0,0,0),
  495. array(0,1,0,0,0,0,1,0,0),
  496. array(1,0,0,0,0,0,0,1,0),
  497. array(1,0,0,0,0,0,0,1,0),
  498. array(1,0,0,0,0,0,0,1,0),
  499. array(1,0,0,0,0,0,0,1,0),
  500. array(1,0,0,0,1,0,0,1,0),
  501. array(1,0,0,0,0,1,0,1,0),
  502. array(0,1,0,0,0,0,1,0,0),
  503. array(0,0,1,1,1,1,0,1,0),
  504. array(0,0,0,0,0,0,0,0,1),
  505. array(0,0,0,0,0,0,0,0,0),
  506. array(0,0,0,0,0,0,0,0,0),
  507. array(0,0,0,0,0,0,0,0,0),
  508. ),
  509. 'R' => array(
  510. array(1,1,1,1,1,1,0,0,0),
  511. array(1,0,0,0,0,0,1,0,0),
  512. array(1,0,0,0,0,0,0,1,0),
  513. array(1,0,0,0,0,0,0,1,0),
  514. array(1,0,0,0,0,0,0,1,0),
  515. array(1,0,0,0,0,0,1,0,0),
  516. array(1,1,1,1,1,1,0,0,0),
  517. array(1,0,1,0,0,0,0,0,0),
  518. array(1,0,0,1,0,0,0,0,0),
  519. array(1,0,0,0,1,0,0,0,0),
  520. array(1,0,0,0,0,1,0,0,0),
  521. array(1,0,0,0,0,0,1,0,0),
  522. array(0,0,0,0,0,0,0,0,0),
  523. array(0,0,0,0,0,0,0,0,0),
  524. ),
  525. 'S' => array(
  526. array(0,0,1,1,1,1,1,1,1),
  527. array(0,1,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(0,1,0,0,0,0,0,0,0),
  532. array(0,0,1,1,1,1,1,0,0),
  533. array(0,0,0,0,0,0,0,1,0),
  534. array(0,0,0,0,0,0,0,0,1),
  535. array(0,0,0,0,0,0,0,0,1),
  536. array(0,0,0,0,0,0,0,1,0),
  537. array(1,1,1,1,1,1,1,0,0),
  538. array(0,0,0,0,0,0,0,0,0),
  539. array(0,0,0,0,0,0,0,0,0),
  540. ),
  541. 'T' => array(
  542. array(1,1,1,1,1,1,1,1,1),
  543. array(0,0,0,0,1,0,0,0,0),
  544. array(0,0,0,0,1,0,0,0,0),
  545. array(0,0,0,0,1,0,0,0,0),
  546. array(0,0,0,0,1,0,0,0,0),
  547. array(0,0,0,0,1,0,0,0,0),
  548. array(0,0,0,0,1,0,0,0,0),
  549. array(0,0,0,0,1,0,0,0,0),
  550. array(0,0,0,0,1,0,0,0,0),
  551. array(0,0,0,0,1,0,0,0,0),
  552. array(0,0,0,0,1,0,0,0,0),
  553. array(0,0,0,0,0,0,0,0,0),
  554. array(0,0,0,0,0,0,0,0,0),
  555. array(0,0,0,0,0,0,0,0,0),
  556. ),
  557. 'U' => array(
  558. array(1,0,0,0,0,0,0,0,1),
  559. array(1,0,0,0,0,0,0,0,1),
  560. array(1,0,0,0,0,0,0,0,1),
  561. array(1,0,0,0,0,0,0,0,1),
  562. array(1,0,0,0,0,0,0,0,1),
  563. array(1,0,0,0,0,0,0,0,1),
  564. array(1,0,0,0,0,0,0,0,1),
  565. array(1,0,0,0,0,0,0,0,1),
  566. array(1,0,0,0,0,0,0,0,1),
  567. array(0,1,0,0,0,0,0,1,0),
  568. array(0,0,1,1,1,1,1,0,0),
  569. array(0,0,0,0,0,0,0,0,0),
  570. array(0,0,0,0,0,0,0,0,0),
  571. array(0,0,0,0,0,0,0,0,0),
  572. ),
  573. 'V' => array(
  574. array(1,0,0,0,0,0,0,0,1),
  575. array(1,0,0,0,0,0,0,0,1),
  576. array(1,0,0,0,0,0,0,0,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,0,0,0,1,0,0),
  583. array(0,0,0,1,0,1,0,0,0),
  584. array(0,0,0,0,1,0,0,0,0),
  585. array(0,0,0,0,0,0,0,0,0),
  586. array(0,0,0,0,0,0,0,0,0),
  587. array(0,0,0,0,0,0,0,0,0),
  588. ),
  589. 'W' => array(
  590. array(1,0,0,0,0,0,0,0,1),
  591. array(1,0,0,0,0,0,0,0,1),
  592. array(1,0,0,0,0,0,0,0,1),
  593. array(1,0,0,0,0,0,0,0,1),
  594. array(1,0,0,0,1,0,0,0,1),
  595. array(1,0,0,1,0,1,0,0,1),
  596. array(1,0,1,0,0,0,1,0,1),
  597. array(1,1,0,0,0,0,0,1,1),
  598. array(1,0,0,0,0,0,0,0,1),
  599. array(0,0,0,0,0,0,0,0,0),
  600. array(0,0,0,0,0,0,0,0,0),
  601. array(0,0,0,0,0,0,0,0,0),
  602. array(0,0,0,0,0,0,0,0,0),
  603. array(0,0,0,0,0,0,0,0,0),
  604. ),
  605. 'X' => array(
  606. array(1,0,0,0,0,0,0,0,1),
  607. array(1,0,0,0,0,0,0,0,1),
  608. array(0,1,0,0,0,0,0,1,0),
  609. array(0,0,1,0,0,0,1,0,0),
  610. array(0,0,0,1,0,1,0,0,0),
  611. array(0,0,0,0,1,0,0,0,0),
  612. array(0,0,0,1,0,1,0,0,0),
  613. array(0,0,1,0,0,0,1,0,0),
  614. array(0,1,0,0,0,0,0,1,0),
  615. array(1,0,0,0,0,0,0,0,1),
  616. array(1,0,0,0,0,0,0,0,1),
  617. array(0,0,0,0,0,0,0,0,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. 'Y' => array(
  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(0,1,0,0,0,0,0,1,0),
  626. array(0,0,1,0,0,0,1,0,0),
  627. array(0,0,0,1,0,1,0,0,0),
  628. array(0,0,0,0,1,0,0,0,0),
  629. array(0,0,0,0,1,0,0,0,0),
  630. array(0,0,0,0,1,0,0,0,0),
  631. array(0,0,0,0,1,0,0,0,0),
  632. array(0,0,0,0,1,0,0,0,0),
  633. array(0,0,0,0,0,0,0,0,0),
  634. array(0,0,0,0,0,0,0,0,0),
  635. array(0,0,0,0,0,0,0,0,0),
  636. ),
  637. 'Z' => array(
  638. array(1,1,1,1,1,1,1,1,1),
  639. array(1,0,0,0,0,0,0,0,1),
  640. array(0,0,0,0,0,0,0,1,0),
  641. array(0,0,0,0,0,0,1,0,0),
  642. array(0,0,0,0,0,1,0,0,0),
  643. array(0,0,0,0,1,0,0,0,0),
  644. array(0,0,0,1,0,0,0,0,0),
  645. array(0,0,1,0,0,0,0,0,0),
  646. array(0,1,0,0,0,0,0,0,0),
  647. array(1,0,0,0,0,0,0,0,1),
  648. array(1,1,1,1,1,1,1,1,1),
  649. array(0,0,0,0,0,0,0,0,0),
  650. array(0,0,0,0,0,0,0,0,0),
  651. array(0,0,0,0,0,0,0,0,0),
  652. ),
  653. '1' => array(
  654. array(0,0,0,0,1,0,0,0,0),
  655. array(0,0,0,1,1,0,0,0,0),
  656. array(0,0,1,0,1,0,0,0,0),
  657. array(0,1,0,0,1,0,0,0,0),
  658. array(0,0,0,0,1,0,0,0,0),
  659. array(0,0,0,0,1,0,0,0,0),
  660. array(0,0,0,0,1,0,0,0,0),
  661. array(0,0,0,0,1,0,0,0,0),
  662. array(0,0,0,0,1,0,0,0,0),
  663. array(0,0,0,0,1,0,0,0,0),
  664. array(0,0,0,0,1,0,0,0,0),
  665. array(0,1,1,1,1,1,1,1,0),
  666. array(0,0,0,0,0,0,0,0,0),
  667. array(0,0,0,0,0,0,0,0,0),
  668. ),
  669. '2' => array(
  670. array(0,0,0,1,1,1,0,0,0),
  671. array(0,0,1,0,0,0,1,0,0),
  672. array(0,1,0,0,0,0,0,1,0),
  673. array(0,0,0,0,0,0,0,0,1),
  674. array(0,0,0,0,0,0,0,0,1),
  675. array(0,0,0,0,0,0,0,0,1),
  676. array(0,0,0,0,0,0,0,1,0),
  677. array(0,0,0,0,0,0,1,0,0),
  678. array(0,0,0,0,0,1,0,0,0),
  679. array(0,0,0,0,1,0,0,0,0),
  680. array(0,0,0,1,0,0,0,0,0),
  681. array(0,0,1,0,0,0,0,0,0),
  682. array(0,1,1,1,1,1,1,1,1),
  683. array(0,0,0,0,0,0,0,0,0),
  684. ),
  685. '3' => array(
  686. array(0,0,0,1,1,1,1,0,0),
  687. array(0,0,1,0,0,0,0,1,0),
  688. array(0,1,0,0,0,0,0,0,1),
  689. array(0,0,0,0,0,0,0,0,1),
  690. array(0,0,0,0,0,0,0,0,1),
  691. array(0,0,0,0,0,0,0,1,0),
  692. array(0,0,0,0,0,1,1,0,0),
  693. array(0,0,0,0,0,0,0,1,0),
  694. array(0,0,0,0,0,0,0,0,1),
  695. array(0,0,0,0,0,0,0,0,1),
  696. array(0,1,0,0,0,0,0,0,1),
  697. array(0,0,1,0,0,0,0,1,0),
  698. array(0,0,0,1,1,1,1,0,0),
  699. array(0,0,0,0,0,0,0,0,0),
  700. ),
  701. '4' => array(
  702. array(0,0,0,0,0,0,0,1,0),
  703. array(0,0,0,0,0,0,1,1,0),
  704. array(0,0,0,0,0,1,0,1,0),
  705. array(0,0,0,0,1,0,0,1,0),
  706. array(0,0,0,1,0,0,0,1,0),
  707. array(0,0,1,0,0,0,0,1,0),
  708. array(0,1,1,1,1,1,1,1,1),
  709. array(0,0,0,0,0,0,0,1,0),
  710. array(0,0,0,0,0,0,0,1,0),
  711. array(0,0,0,0,0,0,0,1,0),
  712. array(0,0,0,0,0,0,0,1,0),
  713. array(0,0,0,0,0,0,0,0,0),
  714. array(0,0,0,0,0,0,0,0,0),
  715. array(0,0,0,0,0,0,0,0,0),
  716. ),
  717. '5' => array(
  718. array(1,1,1,1,1,1,1,1,1),
  719. array(1,0,0,0,0,0,0,0,0),
  720. array(1,0,0,0,0,0,0,0,0),
  721. array(1,0,0,0,0,0,0,0,0),
  722. array(0,1,0,0,0,0,0,0,0),
  723. array(0,0,1,1,1,1,1,0,0),
  724. array(0,0,0,0,0,0,0,1,0),
  725. array(0,0,0,0,0,0,0,0,1),
  726. array(1,0,0,0,0,0,0,0,1),
  727. array(0,1,0,0,0,0,0,1,0),
  728. array(0,0,1,1,1,1,1,0,0),
  729. array(0,0,0,0,0,0,0,0,0),
  730. array(0,0,0,0,0,0,0,0,0),
  731. array(0,0,0,0,0,0,0,0,0),
  732. ),
  733. '6' => array(
  734. array(0,0,1,1,1,1,1,0,0),
  735. array(0,1,0,0,0,0,0,1,0),
  736. array(1,0,0,0,0,0,0,0,1),
  737. array(1,0,0,0,0,0,0,0,0),
  738. array(1,0,0,0,0,0,0,0,0),
  739. array(1,0,0,1,1,1,1,0,0),
  740. array(1,0,1,0,0,0,0,1,0),
  741. array(1,1,0,0,0,0,0,0,1),
  742. array(1,0,0,0,0,0,0,0,1),
  743. array(1,0,0,0,0,0,0,0,1),
  744. array(0,1,0,0,0,0,0,1,0),
  745. array(0,0,1,1,1,1,1,0,0),
  746. array(0,0,0,0,0,0,0,0,0),
  747. array(0,0,0,0,0,0,0,0,0),
  748. array(0,0,0,0,0,0,0,0,0),
  749. ),
  750. '7' => array(
  751. array(1,1,1,1,1,1,1,1,1),
  752. array(1,0,0,0,0,0,0,0,1),
  753. array(0,0,0,0,0,0,0,1,0),
  754. array(0,0,0,0,0,0,1,0,0),
  755. array(0,0,0,0,0,1,0,0,0),
  756. array(0,0,0,0,1,0,0,0,0),
  757. array(0,0,0,0,1,0,0,0,0),
  758. array(0,0,0,0,1,0,0,0,0),
  759. array(0,0,0,0,1,0,0,0,0),
  760. array(0,0,0,0,1,0,0,0,0),
  761. array(0,0,0,0,1,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. ),
  766. '8' => array(
  767. array(0,0,1,1,1,1,1,0,0),
  768. array(0,1,0,0,0,0,0,1,0),
  769. array(1,0,0,0,0,0,0,0,1),
  770. array(1,0,0,0,0,0,0,0,1),
  771. array(1,0,0,0,0,0,0,0,1),
  772. array(0,1,0,0,0,0,0,1,0),
  773. array(0,0,1,1,1,1,1,0,0),
  774. array(0,1,0,0,0,0,0,1,0),
  775. array(1,0,0,0,0,0,0,0,1),
  776. array(1,0,0,0,0,0,0,0,1),
  777. array(1,0,0,0,0,0,0,0,1),
  778. array(0,1,0,0,0,0,0,1,0),
  779. array(0,0,1,1,1,1,1,0,0),
  780. array(0,0,0,0,0,0,0,0,0),
  781. ),
  782. '9' => array(
  783. array(0,0,0,1,1,1,1,0,0),
  784. array(0,0,1,0,0,0,0,1,0),
  785. array(0,1,0,0,0,0,0,0,1),
  786. array(0,1,0,0,0,0,0,0,1),
  787. array(0,1,0,0,0,0,0,0,1),
  788. array(0,1,0,0,0,0,0,1,1),
  789. array(0,0,1,1,1,1,1,0,1),
  790. array(0,0,0,0,0,0,0,0,1),
  791. array(0,0,0,0,0,0,0,0,1),
  792. array(0,1,0,0,0,0,0,0,1),
  793. array(0,0,1,0,0,0,0,1,0),
  794. array(0,0,0,1,1,1,1,0,0),
  795. array(0,0,0,0,0,0,0,0,0),
  796. array(0,0,0,0,0,0,0,0,0),
  797. ),
  798. )
  799. );
  800. }
  801. }
  802. ?>