home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 2002 April / pcpro0402.iso / essentials / graphics / Gimp / gimp-src-20001226.exe / src / gimp / plug-ins / common / AlienMap2.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-08-28  |  79.1 KB  |  1,852 lines

  1. /**********************************************************************
  2.  *  AlienMap2 (Co-)sine color transformation plug-in (Version 1.01)
  3.  *  Martin Weber (martweb@gmx.net)
  4.  **********************************************************************
  5.  *  Official Homepage: http://diverse.freepage.de/martin.weber
  6.  **********************************************************************
  7.  *  Most code taken from AlienMap by Daniel Cotting
  8.  *  This is not a replacement for AlienMap!
  9.  **********************************************************************    
  10.  */
  11.  
  12. /* The GIMP -- an image manipulation program
  13.  * Copyright (C) 1995 Spencer Kimball and Peter Mattis
  14.  *
  15.  * This program is free software; you can redistribute it and/or modify
  16.  * it under the terms of the GNU General Public License as published by
  17.  * the Free Software Foundation; either version 2 of the License, or
  18.  * (at your option) any later version.
  19.  *
  20.  * This program is distributed in the hope that it will be useful,
  21.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  22.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  23.  * GNU General Public License for more details.
  24.  *
  25.  * You should have received a copy of the GNU General Public License
  26.  * along with this program; if not, write to the Free Software
  27.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  28.  */
  29.  
  30. #include "config.h"
  31.  
  32. #include <stdio.h>
  33. #include <stdlib.h>
  34.  
  35. #include <gtk/gtk.h>
  36.  
  37. #include <libgimp/gimp.h>
  38. #include <libgimp/gimpui.h>
  39.  
  40. #include "libgimp/stdplugins-intl.h"
  41.  
  42.  
  43. static unsigned int logo_width = 200;
  44. static unsigned int logo_height = 72;
  45.  
  46. #define HEADER_PIXEL(data,pixel) \
  47.   pixel[0] = palette_data[data[0]*3+2]; \
  48.   pixel[1] = palette_data[data[0]*3+1]; \
  49.   pixel[2] = palette_data[data[0]*3+0]; \
  50.   data--;
  51.  
  52. static unsigned char 
  53. palette_data[]  =  { 4,2,2,4,110,178,32,4,122,4,36,
  54. 86,15,3,66,4,58,127,36,8,186,4,34,122,17,2,
  55. 34,4,19,66,12,4,162,90,2,69,88,2,48,7,20,
  56. 2,25,2,103,8,14,48,4,58,186,90,3,154,82,2,
  57. 129,55,2,34,17,2,18,17,34,191,94,2,101,57,2,
  58. 70,7,32,154,12,22,157,17,3,50,4,88,150,96,3,
  59. 186,86,2,138,87,2,86,212,214,210,4,19,98,52,2,
  60. 154,15,11,2,4,132,216,7,18,125,12,6,82,37,12,
  61. 18,4,88,189,86,14,48,128,2,157,32,4,138,4,60,
  62. 155,4,48,126,60,2,218,7,10,52,13,12,66,129,2,
  63. 50,56,2,52,52,14,98,4,47,157,6,20,87,48,2,
  64. 24,58,2,101,120,2,141,52,5,170,4,113,215,127,2,
  65. 73,4,90,210,4,52,112,36,18,194,59,2,85,42,2,
  66. 10,107,2,173,95,2,114,31,3,52,4,79,160,84,3,
  67. 189,14,10,40,30,2,69,96,2,58,113,2,126,9,37,
  68. 231,17,33,170,28,14,2,4,30,146,68,10,37,132,2,
  69. 82,23,4,7,4,10,122,4,36,108,32,2,37,7,27,
  70. 2,4,98,175,84,10,146,4,101,191,4,14,146,8,29,
  71. 86,4,2,170,8,60,230,84,10,162,72,2,39,102,2,
  72. 142,4,142,221,4,49,143,68,12,170,4,124,213,15,4,
  73. 74,114,2,69,112,2,158,32,3,23,8,50,190,111,2,
  74. 104,6,40,154,96,2,210,6,28,104,60,2,138,61,2,
  75. 25,68,2,114,58,2,125,39,2,114,73,2,69,16,4,
  76. 58,4,88,177,56,14,26,138,2,173,4,68,176,71,2,
  77. 55,76,2,210,4,78,130,17,3,42,6,27,69,112,2,
  78. 49,12,26,178,47,13,159,18,11,10,13,11,74,141,2,
  79. 58,52,18,234,4,82,186,4,126,198,4,103,213,4,62,
  80. 206,4,72,226,12,46,210,72,12,222,12,26,146,20,34,
  81. 210,4,113,197,4,131,229,4,48,170,4,76,170,7,43,
  82. 95,52,30,218,15,11,170,52,14,202,12,14,86,4,40,
  83. 174,108,14,202,156,2,186,60,12,130,5,40,129,73,13,
  84. 189,12,42,138,44,14,202,4,59,143,4,124,229,4,69,
  85. 191,4,69,157,4,60,114,4,43,110,14,14,58,20,26,
  86. 157,28,26,210,4,87,162,4,91,202,4,110,226,4,98,
  87. 226,4,101,202,17,14,186,28,18,18,60,2,234,28,10,
  88. 114,4,30,114,8,10,162,12,54,186,20,26,130,100,10,
  89. 170,40,18,154,4,22,114,28,26,234,4,22,58,4,66,
  90. 226,4,54,202,12,42,202,4,38,98,4,145,234,4,76,
  91. 146,4,94,148,4,138,213,4,94,186,4,54,126,4,54,
  92. 154,4,118,211,4,106,178,4,106,188,4,54,142,4,94,
  93. 170,4,70,202,4,118,197,4,54,173,4,82,178,72,4,
  94. 172,36,10,138,76,14,162,4,98,210,4,118,226,112,2,
  95. 114,24,19,8,30,2,85,84,6,226,141,2,73,28,30,
  96. 10,28,46,186,112,4,206,36,10,90,36,2,174,108,2,
  97. 58,41,3,130,44,10,194,9,33,130,92,2,162,51,2,
  98. 42,12,32,162,81,3,146,44,11,26,28,6,146,44,2,
  99. 178,30,12,10,60,10,178,64,2,146,28,10,178,92,10,
  100. 210,5,41,146,40,2,102,96,2,125,100,2,88,74,2,
  101. 157,142,2,159,26,10,55,143,2,50,73,2,102,134,2,
  102. 142,73,2,84,127,2,126,142,2,82,156,2,178,28,10,
  103. 158,28,26,114,84,14,202,12,4,10,5,20,74,17,2,
  104. 26,92,2,194,7,19,106};
  105.  
  106. static unsigned char header_data[] = { 71,99,218,218,99,11,71,218,71,71,
  107. 218,99,99,99,71,99,218,99,99,99,99,218,71,218,99,218,218,99,99,218,
  108. 218,99,99,218,99,218,99,58,218,99,99,99,58,218,99,99,99,58,99,58,
  109. 99,58,11,58,99,58,58,11,99,58,99,58,99,99,99,218,99,218,99,58,
  110. 99,71,99,218,71,12,12,12,12,12,12,12,12,12,92,19,19,19,92,92,
  111. 92,92,19,108,19,19,19,19,19,19,53,53,53,53,101,19,19,53,53,19,
  112. 19,19,12,92,92,12,12,12,71,71,218,99,218,218,71,71,12,12,218,99,
  113. 58,58,58,99,99,99,58,99,99,99,11,58,11,58,58,99,58,99,99,99,
  114. 58,99,99,99,99,58,99,99,99,99,99,218,99,99,11,99,99,99,11,99,
  115. 99,218,218,218,99,218,99,99,218,218,99,99,218,99,218,218,99,99,218,11,
  116. 218,71,99,218,99,218,218,99,71,8,218,99,218,218,99,99,99,99,99,99,
  117. 218,218,99,99,218,99,218,99,218,71,99,99,99,218,99,99,218,99,99,99,
  118. 218,218,99,99,99,99,58,99,58,30,99,99,99,99,99,99,58,99,99,58,
  119. 99,58,99,58,99,99,58,58,58,99,58,58,99,218,218,71,99,99,71,71,
  120. 71,123,12,118,71,71,12,71,123,12,12,19,19,19,53,19,19,53,53,19,
  121. 19,53,101,63,20,63,20,63,53,53,53,101,53,53,53,19,53,53,53,19,
  122. 92,12,12,12,71,12,12,12,12,12,92,71,218,218,71,218,71,71,71,71,
  123. 99,218,58,58,58,99,99,99,99,58,58,58,99,58,99,58,58,99,58,58,
  124. 99,99,58,99,99,99,99,58,99,58,30,99,99,99,218,99,58,99,99,58,
  125. 11,99,99,218,99,218,218,99,99,218,71,99,218,99,99,218,99,99,218,99,
  126. 11,218,99,218,99,11,218,99,99,8,71,71,71,99,218,71,218,99,71,218,
  127. 11,99,218,218,99,218,99,218,99,99,99,99,218,99,99,99,99,99,218,99,
  128. 99,99,99,99,99,11,99,99,99,99,99,99,58,99,58,99,58,99,58,58,
  129. 99,11,58,58,99,58,99,99,58,58,218,99,123,71,71,71,123,71,71,218,
  130. 99,99,218,71,12,12,12,12,92,19,19,53,19,53,53,53,53,19,53,53,
  131. 53,53,19,53,19,53,53,53,53,53,63,63,101,63,63,20,53,19,53,53,
  132. 53,19,92,92,12,12,12,71,71,71,71,12,12,71,71,12,12,12,12,12,
  133. 12,218,218,99,58,58,99,58,99,58,99,58,99,99,58,218,58,99,58,99,
  134. 99,99,99,11,58,99,99,58,99,99,58,58,99,99,99,99,99,99,99,99,
  135. 99,58,218,99,218,99,99,99,218,99,99,218,99,11,218,99,218,218,99,99,
  136. 218,99,218,11,99,71,99,218,71,8,99,99,218,99,99,99,218,99,99,218,
  137. 218,99,11,99,99,218,99,218,99,218,218,99,58,99,99,99,58,11,99,99,
  138. 58,99,99,58,58,58,58,99,99,99,99,218,58,99,99,99,58,58,99,99,
  139. 58,58,99,58,99,58,99,99,58,58,99,218,71,71,218,218,218,58,58,58,
  140. 218,99,71,123,12,12,12,19,19,108,108,108,92,92,92,12,71,12,12,92,
  141. 19,53,53,53,101,53,53,19,53,101,53,20,53,79,79,0,34,79,20,63,
  142. 53,53,53,19,19,19,12,12,12,71,71,71,71,71,71,123,71,12,12,12,
  143. 12,12,71,71,218,58,99,58,218,58,218,99,58,99,58,99,99,218,58,58,
  144. 58,99,58,58,99,99,58,99,58,99,99,218,58,58,99,99,99,99,99,99,
  145. 58,11,99,99,218,218,218,99,218,99,99,218,218,99,218,99,99,218,218,99,
  146. 218,99,71,218,99,218,99,99,99,8,218,218,99,218,99,218,99,218,218,99,
  147. 11,218,218,218,218,99,71,99,218,99,99,99,218,58,99,99,99,99,218,30,
  148. 58,99,58,99,58,11,58,99,58,99,58,58,58,99,58,58,99,99,58,58,
  149. 58,99,58,99,58,58,99,58,218,99,99,218,58,99,58,58,58,58,58,218,
  150. 71,12,12,71,71,12,12,12,12,71,71,118,71,71,118,71,71,12,223,19,
  151. 19,53,53,53,53,63,229,20,79,20,34,0,20,101,101,63,20,101,101,53,
  152. 108,53,53,53,53,53,101,19,92,12,12,12,12,71,71,218,218,218,71,71,
  153. 118,12,71,71,218,218,58,58,58,58,58,58,218,58,58,58,99,99,218,99,
  154. 58,58,99,99,58,99,58,99,58,58,58,99,99,99,58,99,99,99,58,58,
  155. 99,58,58,99,99,99,99,99,99,99,218,99,99,218,99,218,218,99,99,218,
  156. 99,58,99,99,218,99,218,218,218,8,99,218,99,218,99,218,11,99,218,99,
  157. 99,99,99,99,218,99,58,99,99,99,58,99,218,99,99,99,99,99,58,99,
  158. 58,218,99,99,99,58,218,58,58,58,99,99,58,99,218,58,99,99,58,218,
  159. 58,99,58,99,99,99,58,99,58,58,58,58,99,58,58,58,58,218,218,12,
  160. 71,71,71,12,12,71,71,12,71,12,71,71,71,71,12,92,19,53,53,53,
  161. 101,63,79,34,251,0,0,63,20,53,19,53,53,53,53,19,19,53,19,19,
  162. 19,108,19,19,19,19,19,19,53,53,108,12,12,12,71,71,218,58,58,58,
  163. 99,218,71,71,71,12,218,99,99,58,58,58,58,218,58,58,58,58,58,99,
  164. 99,58,58,99,58,218,58,99,99,99,99,58,99,128,99,58,99,99,11,99,
  165. 99,58,11,58,99,99,99,218,58,11,99,58,99,218,99,99,218,99,99,99,
  166. 218,71,99,99,218,99,11,99,218,8,218,99,218,99,218,99,99,218,99,218,
  167. 58,218,58,218,99,99,218,99,58,99,99,99,99,78,11,58,99,58,99,99,
  168. 99,58,58,99,58,11,58,58,218,99,99,58,58,58,99,58,58,58,99,99,
  169. 58,58,58,58,58,58,99,58,99,99,99,58,58,58,58,58,218,71,118,12,
  170. 71,71,71,71,71,12,71,71,71,71,71,12,92,19,19,53,53,63,20,251,
  171. 0,79,79,0,79,34,34,79,0,63,229,20,63,101,53,101,19,53,19,92,
  172. 12,71,12,92,12,12,12,12,12,92,19,92,92,71,12,118,71,218,99,58,
  173. 58,58,58,58,218,123,71,218,58,58,58,99,58,58,58,218,58,218,58,58,
  174. 218,58,99,58,58,58,99,99,58,99,58,99,218,99,99,99,58,58,58,11,
  175. 58,58,99,58,99,99,30,99,99,99,58,218,218,30,99,218,99,99,99,218,
  176. 99,99,218,218,99,99,218,71,99,8,99,99,71,99,218,218,99,218,99,218,
  177. 99,218,99,58,11,58,99,99,11,58,99,58,99,99,99,99,58,58,99,99,
  178. 58,99,99,99,99,58,99,78,58,58,99,99,218,78,58,218,58,99,212,58,
  179. 99,58,58,58,218,58,58,58,58,58,58,58,58,58,218,71,12,12,71,71,
  180. 123,218,218,58,99,71,123,71,71,12,19,19,19,53,53,19,19,53,63,53,
  181. 101,101,101,63,101,101,20,20,79,0,0,79,79,34,251,79,79,251,101,53,
  182. 19,92,12,71,71,71,218,12,218,12,71,71,71,71,71,12,71,71,123,71,
  183. 58,58,58,58,58,58,58,99,99,58,58,58,99,58,58,58,99,58,99,58,
  184. 99,58,58,99,58,58,58,58,99,58,99,58,99,58,99,58,99,99,58,58,
  185. 99,99,99,58,99,58,58,58,99,99,99,30,128,58,99,99,99,99,99,58,
  186. 218,99,99,218,218,99,99,218,71,8,71,218,99,99,99,99,218,99,99,99,
  187. 99,30,58,11,58,58,99,58,58,58,58,30,58,58,99,99,99,58,99,58,
  188. 99,58,99,58,58,58,218,99,58,99,58,58,58,218,99,58,58,58,58,58,
  189. 58,99,99,99,58,99,99,58,58,212,99,58,58,218,71,71,218,218,99,58,
  190. 58,58,58,218,123,71,71,12,108,19,19,108,19,19,223,92,19,92,12,12,
  191. 19,19,19,19,53,53,63,63,229,0,34,34,79,0,79,0,75,34,0,34,
  192. 79,20,53,19,92,12,71,71,71,218,71,123,71,123,71,71,71,71,71,71,
  193. 71,218,58,58,58,58,58,58,58,99,58,58,58,58,58,58,58,58,99,58,
  194. 58,99,99,58,99,58,58,58,58,58,58,99,58,99,58,99,58,58,99,99,
  195. 58,58,99,99,58,58,218,58,58,99,58,99,11,58,58,99,58,218,99,99,
  196. 99,99,218,99,99,218,99,99,99,8,99,218,99,218,99,99,99,99,58,58,
  197. 11,58,99,58,58,30,58,11,58,11,58,99,99,58,99,58,58,58,99,58,
  198. 58,99,58,99,99,58,58,99,58,99,58,99,58,99,212,58,58,58,58,58,
  199. 58,58,58,58,58,58,58,58,58,58,212,58,218,218,218,99,58,58,58,58,
  200. 58,99,71,71,71,12,71,71,12,12,12,71,71,123,71,218,71,71,71,92,
  201. 19,108,63,79,229,126,0,79,0,0,34,34,34,126,34,251,79,0,126,34,
  202. 79,0,79,20,63,19,19,12,71,71,71,218,71,99,71,71,71,71,71,71,
  203. 71,71,218,58,58,58,212,58,58,58,58,58,58,58,58,58,58,58,58,58,
  204. 58,58,99,58,58,99,58,58,99,99,128,218,58,58,99,58,99,58,58,99,
  205. 218,58,58,218,99,99,99,99,99,99,58,99,99,58,30,218,99,99,99,99,
  206. 99,99,218,99,99,99,218,218,99,8,218,99,99,99,58,99,99,99,99,99,
  207. 58,58,218,99,99,99,58,99,58,58,58,99,58,99,58,99,99,99,58,58,
  208. 99,99,58,58,58,58,58,58,99,99,58,99,99,58,58,58,58,99,58,58,
  209. 99,58,99,58,78,212,99,212,99,58,58,99,58,58,78,78,246,99,212,58,
  210. 99,71,123,71,71,71,71,71,218,218,71,123,218,218,218,118,12,19,63,63,
  211. 0,0,0,34,34,0,34,79,79,79,0,34,79,79,20,101,53,101,53,19,
  212. 53,53,101,101,53,53,19,19,19,92,218,218,218,218,218,212,78,58,218,218,
  213. 71,71,71,11,58,246,58,78,246,58,58,58,99,99,58,58,99,58,212,58,
  214. 99,58,99,58,58,99,58,58,58,58,58,212,218,58,58,99,58,58,99,58,
  215. 99,99,99,58,58,99,99,99,58,99,58,58,99,99,99,58,58,99,99,99,
  216. 99,99,99,11,58,99,99,99,218,8,99,99,218,99,99,218,99,218,58,58,
  217. 11,78,58,99,58,99,58,99,58,11,58,99,58,99,58,58,58,99,99,58,
  218. 99,99,99,58,58,58,58,58,58,58,58,58,58,58,58,212,99,58,212,99,
  219. 58,58,78,58,78,58,58,58,58,58,58,58,58,58,246,58,246,58,58,71,
  220. 218,71,71,71,218,71,71,71,71,218,218,71,71,92,92,53,63,126,79,0,
  221. 0,79,0,79,34,79,0,126,79,79,79,79,79,229,229,101,53,108,92,71,
  222. 71,71,71,71,71,12,12,19,108,19,92,71,71,71,71,218,212,246,78,58,
  223. 58,218,218,71,71,58,58,212,212,78,212,78,78,58,58,58,58,58,99,58,
  224. 78,58,58,99,58,58,58,58,58,58,58,58,99,58,99,58,58,212,99,58,
  225. 58,99,58,99,58,99,99,58,58,99,99,58,58,58,58,11,78,99,99,99,
  226. 99,58,99,58,71,99,99,99,99,8,99,99,99,218,99,58,99,30,58,11,
  227. 58,11,58,58,99,58,58,99,58,99,58,99,99,58,99,58,99,58,58,99,
  228. 58,58,58,58,58,78,58,99,58,99,58,58,58,58,99,58,212,99,58,58,
  229. 58,78,78,78,58,58,58,58,58,212,58,78,58,78,78,78,58,99,218,218,
  230. 71,218,218,71,58,99,58,99,71,71,71,12,19,20,79,251,0,251,79,251,
  231. 79,63,126,79,79,79,79,229,79,79,79,126,126,79,79,63,20,53,53,92,
  232. 12,12,218,71,71,218,218,218,71,218,71,71,71,218,71,218,218,58,246,246,
  233. 78,212,78,58,218,218,58,58,58,246,78,212,78,212,58,58,58,58,58,212,
  234. 78,78,78,58,58,99,58,58,58,58,58,58,58,58,58,218,99,99,58,99,
  235. 58,58,218,99,58,58,99,58,99,99,58,99,99,99,58,99,99,58,58,58,
  236. 218,99,11,58,99,99,99,218,99,8,99,30,218,58,11,99,99,58,99,58,
  237. 99,58,58,99,218,99,218,58,99,99,58,58,58,58,99,58,99,99,58,99,
  238. 58,58,58,78,78,58,58,58,58,58,99,246,78,78,58,58,58,58,58,78,
  239. 78,212,78,246,246,58,58,58,212,58,212,246,78,246,58,212,218,218,218,218,
  240. 218,58,246,58,246,58,218,218,123,12,19,19,53,53,101,53,63,101,63,63,
  241. 63,63,63,63,63,101,63,53,63,53,53,53,53,108,19,19,19,19,108,19,
  242. 92,92,12,12,71,71,218,99,99,218,218,218,218,218,71,71,71,218,218,246,
  243. 78,78,246,78,78,78,58,58,58,78,78,78,78,246,58,58,58,58,58,78,
  244. 212,78,78,58,58,58,58,99,58,58,58,58,58,58,99,58,58,58,58,58,
  245. 58,99,58,58,99,58,58,58,58,58,58,99,58,58,58,58,58,99,99,99,
  246. 58,99,58,99,99,58,99,99,99,8,99,99,30,58,58,58,58,58,58,99,
  247. 58,11,99,58,99,58,58,58,58,58,58,99,58,58,58,58,58,58,99,58,
  248. 99,58,78,58,58,58,99,58,58,78,246,78,58,78,58,58,58,58,78,212,
  249. 246,78,246,78,78,99,212,246,78,246,58,246,246,78,246,218,218,218,58,58,
  250. 246,78,78,246,58,218,218,71,12,12,108,92,108,19,108,53,63,63,63,53,
  251. 53,53,19,223,92,92,49,118,118,118,118,118,118,118,71,118,118,12,12,12,
  252. 92,71,71,123,218,99,11,58,58,58,58,78,58,99,99,123,71,218,218,218,
  253. 246,246,78,212,78,212,78,246,78,78,58,78,246,78,246,78,58,58,58,58,
  254. 99,78,246,78,246,99,58,58,58,58,58,78,78,78,78,99,58,99,58,99,
  255. 78,58,58,99,58,218,218,58,58,99,58,58,58,218,99,58,58,58,58,11,
  256. 58,99,99,99,58,99,99,218,58,8,99,99,58,99,58,11,58,11,58,58,
  257. 99,58,99,58,99,58,99,58,58,218,58,58,58,99,58,99,58,58,58,99,
  258. 78,58,58,58,99,58,58,78,78,58,246,78,246,99,58,58,58,212,78,78,
  259. 246,58,246,58,78,78,78,58,246,78,78,58,246,58,58,58,212,58,246,78,
  260. 212,246,58,58,71,71,71,71,12,92,92,92,108,53,53,53,19,19,223,223,
  261. 49,223,92,49,49,223,92,49,118,118,118,71,118,112,118,11,11,112,71,112,
  262. 71,71,11,11,11,99,99,58,58,78,78,78,246,78,246,58,99,71,218,71,
  263. 218,78,78,246,78,246,58,246,78,246,212,58,246,58,246,78,212,78,246,58,
  264. 58,58,78,246,246,78,78,99,58,58,58,212,78,58,78,58,58,58,58,58,
  265. 78,58,78,99,58,58,99,58,58,58,58,99,58,58,99,218,58,99,58,58,
  266. 58,58,99,58,99,99,58,99,99,8,99,99,58,58,58,99,58,99,99,58,
  267. 99,58,58,58,58,58,58,218,99,58,99,58,58,58,58,58,99,58,58,78,
  268. 58,78,78,78,78,58,78,58,78,78,78,212,78,58,78,58,78,212,78,246,
  269. 78,246,78,78,212,246,246,78,246,212,246,246,78,246,58,246,78,246,58,246,
  270. 246,58,99,218,218,218,71,12,92,19,19,19,19,19,223,223,49,223,49,118,
  271. 49,112,30,30,237,103,208,208,245,208,245,208,245,245,245,103,208,103,22,237,
  272. 30,30,11,11,11,11,71,71,11,99,58,78,78,246,58,246,246,246,58,99,
  273. 99,218,212,78,246,78,246,78,246,58,78,58,246,78,58,246,78,212,78,246,
  274. 58,212,58,78,78,212,78,78,58,58,99,78,78,78,78,78,58,58,99,58,
  275. 58,78,78,78,58,58,99,58,99,58,58,99,58,218,58,58,99,58,58,218,
  276. 99,58,99,99,58,99,30,99,99,8,58,99,58,99,58,58,58,99,58,99,
  277. 58,218,218,58,99,58,99,58,58,58,78,99,78,58,99,58,58,78,58,78,
  278. 78,58,78,78,58,78,78,246,246,212,78,78,78,58,78,246,78,246,58,246,
  279. 212,78,58,78,78,58,246,78,78,78,58,246,78,246,78,58,246,78,78,78,
  280. 58,218,99,11,71,12,92,92,92,223,223,223,223,223,49,118,112,22,237,208,
  281. 72,245,55,243,245,72,72,72,65,208,236,208,208,245,72,55,243,55,55,243,
  282. 245,245,245,103,237,237,30,11,11,112,71,11,99,58,78,246,246,246,246,78,
  283. 58,218,58,58,246,78,212,78,246,78,246,78,212,78,78,212,78,246,78,78,
  284. 58,78,78,78,78,78,246,246,246,58,58,78,58,246,78,212,78,78,99,58,
  285. 58,78,58,58,58,58,58,99,58,58,58,58,78,58,58,99,99,58,58,58,
  286. 99,218,58,99,99,99,58,99,58,8,99,99,99,58,11,58,58,58,99,58,
  287. 58,58,58,58,58,58,58,99,99,78,78,58,58,78,58,58,99,78,78,78,
  288. 78,78,78,78,78,78,212,246,246,246,246,78,78,246,246,58,246,78,246,78,
  289. 78,78,212,246,246,246,78,78,212,246,246,246,58,246,246,78,246,246,78,58,
  290. 218,99,71,12,12,92,92,82,223,49,223,118,112,22,208,72,72,208,65,22,
  291. 22,112,11,112,112,112,112,112,118,118,118,112,112,112,30,244,244,30,237,65,
  292. 236,72,55,55,243,243,208,208,237,237,11,71,11,11,71,11,99,58,246,246,
  293. 246,78,78,246,58,246,78,246,58,246,58,246,58,246,246,78,78,78,212,78,
  294. 212,246,212,78,246,246,58,78,78,246,99,246,246,58,246,58,78,78,78,58,
  295. 78,78,78,78,78,78,58,58,58,99,58,58,78,99,58,58,58,218,99,99,
  296. 58,58,99,58,99,58,58,99,99,8,58,58,99,58,99,218,99,58,99,99,
  297. 99,58,99,58,99,58,58,58,58,78,58,58,58,58,58,58,58,78,212,78,
  298. 78,58,246,78,58,246,246,246,246,246,246,246,78,58,246,78,246,58,246,58,
  299. 246,78,78,78,58,246,212,78,78,78,58,246,78,212,246,58,78,212,58,99,
  300. 218,71,12,92,19,223,49,49,118,62,30,22,208,208,103,30,244,112,244,118,
  301. 112,23,49,49,49,49,49,49,49,49,82,82,223,82,49,118,23,118,118,112,
  302. 11,30,237,22,65,245,55,243,245,245,103,237,237,11,71,11,71,71,218,58,
  303. 246,246,78,246,78,212,78,246,246,78,246,246,78,78,212,78,212,78,246,78,
  304. 78,58,246,78,58,246,78,212,78,246,78,78,78,78,78,212,246,246,246,78,
  305. 58,78,78,78,58,78,78,58,58,58,58,58,99,58,58,58,58,58,99,58,
  306. 58,58,58,58,58,99,99,58,58,8,99,99,58,58,58,99,99,99,99,58,
  307. 58,99,78,58,78,99,58,58,99,78,78,78,58,78,58,58,78,246,78,212,
  308. 78,78,58,78,246,246,246,246,246,246,58,78,78,246,58,246,78,246,78,246,
  309. 78,212,78,212,212,246,78,78,246,246,78,212,58,99,212,246,246,58,99,218,
  310. 118,12,92,223,223,49,49,11,237,208,208,103,244,23,118,112,118,112,49,49,
  311. 19,82,82,82,223,49,66,49,49,82,223,223,101,19,223,82,223,82,223,82,
  312. 82,49,23,112,11,244,30,65,72,55,55,245,208,22,237,112,11,118,71,218,
  313. 218,58,58,78,246,78,212,78,78,212,99,78,212,246,78,246,78,246,78,212,
  314. 246,246,78,246,246,78,246,78,246,58,246,78,58,78,246,246,246,246,212,246,
  315. 78,78,78,78,78,58,78,78,99,58,78,78,78,99,58,58,99,58,99,99,
  316. 58,99,99,99,99,58,99,58,99,8,99,99,99,58,58,99,58,58,99,58,
  317. 58,58,78,78,58,58,58,58,58,58,78,78,78,78,78,58,246,246,246,246,
  318. 246,78,78,212,246,246,246,246,246,246,78,212,78,246,78,212,78,246,58,246,
  319. 78,246,78,58,58,212,246,58,78,246,246,58,58,58,58,246,58,218,71,12,
  320. 223,223,49,49,49,30,65,72,72,30,112,118,118,112,118,49,223,223,223,49,
  321. 244,244,244,244,23,23,23,23,70,66,49,70,49,70,70,118,23,23,23,23,
  322. 49,223,19,82,223,223,23,11,244,237,208,72,55,55,208,103,30,11,11,49,
  323. 71,71,99,58,246,78,246,246,58,246,58,58,246,212,78,246,58,246,78,58,
  324. 58,212,78,78,212,78,212,78,78,78,212,78,78,78,246,212,246,246,246,212,
  325. 246,58,78,78,78,78,58,78,78,99,58,58,78,58,58,58,99,58,58,58,
  326. 58,58,58,58,99,58,99,58,99,8,99,58,58,218,58,58,58,99,58,58,
  327. 58,99,58,58,99,58,78,78,78,78,78,78,78,58,246,246,246,212,246,246,
  328. 212,246,78,246,246,246,246,246,212,246,246,78,246,58,212,246,78,78,78,246,
  329. 58,246,212,99,58,246,78,246,246,58,58,58,58,78,246,58,99,118,12,92,
  330. 223,223,223,11,22,72,208,244,49,112,112,118,49,82,223,49,244,244,242,62,
  331. 23,62,23,23,244,244,244,244,244,244,62,30,244,244,244,244,23,112,210,23,
  332. 62,244,244,23,223,82,53,82,49,112,30,30,65,72,55,245,208,237,30,112,
  333. 71,49,118,71,99,78,78,78,246,246,58,99,58,246,212,78,246,58,246,212,
  334. 99,58,212,246,78,246,78,246,212,246,78,246,246,212,246,246,246,212,246,246,
  335. 246,246,78,78,246,246,78,78,78,78,58,58,78,58,58,58,58,58,99,99,
  336. 99,78,99,58,99,99,58,99,58,8,58,99,58,99,99,58,58,99,58,58,
  337. 58,58,58,58,78,58,78,78,58,78,58,246,78,78,78,212,246,246,212,246,
  338. 246,246,246,246,246,246,246,246,246,246,246,58,246,58,99,212,246,212,78,78,
  339. 78,99,58,58,78,246,58,78,246,58,58,58,58,212,58,218,71,12,49,49,
  340. 49,112,22,72,65,112,49,112,112,112,223,19,118,62,244,62,62,23,23,244,
  341. 244,244,244,112,23,49,49,223,19,223,82,223,223,49,223,23,118,112,244,30,
  342. 62,62,62,62,23,62,23,223,82,8,82,71,30,244,22,72,55,245,103,237,
  343. 11,71,12,12,71,99,78,78,78,58,212,58,58,58,58,212,78,58,246,78,
  344. 58,58,58,212,78,246,58,78,78,212,212,246,246,246,212,246,246,246,246,246,
  345. 246,246,58,78,78,58,246,212,78,78,58,78,58,78,78,78,58,78,58,58,
  346. 218,58,58,99,58,99,99,99,58,8,218,99,58,58,58,99,58,58,99,78,
  347. 78,58,99,58,58,78,58,78,246,78,78,58,78,212,246,246,246,246,246,246,
  348. 246,246,246,212,246,212,246,246,246,212,78,246,58,58,58,246,78,78,212,246,
  349. 58,58,58,58,212,78,246,212,58,58,58,58,58,58,71,12,49,223,223,49,
  350. 30,208,72,30,49,49,112,49,223,223,23,22,244,62,23,23,62,22,112,118,
  351. 49,49,223,118,23,244,30,242,22,242,242,62,242,244,244,112,23,49,49,223,
  352. 23,112,30,244,62,112,210,23,23,49,82,8,223,244,237,30,208,55,243,245,
  353. 22,30,71,118,12,71,99,78,78,246,212,58,58,58,58,246,246,246,78,246,
  354. 58,58,58,78,212,78,246,246,246,58,58,212,246,246,246,246,246,246,246,246,
  355. 246,78,246,58,246,246,246,78,212,78,78,78,58,78,58,78,58,58,99,58,
  356. 58,58,99,58,58,58,58,58,58,8,58,99,58,58,58,58,99,58,78,78,
  357. 58,58,78,58,58,78,78,58,78,78,78,78,78,246,212,246,246,246,246,246,
  358. 246,246,246,246,246,246,212,246,246,246,78,58,58,58,58,246,78,78,246,99,
  359. 212,58,212,58,212,78,78,58,58,218,58,212,58,99,71,49,223,49,49,30,
  360. 55,72,112,49,244,11,49,82,112,242,242,62,23,62,244,112,118,223,82,118,
  361. 30,236,29,225,231,33,248,42,42,42,219,2,42,219,110,107,231,29,65,244,
  362. 112,223,223,49,112,30,30,23,23,23,23,49,82,101,49,30,30,242,72,243,
  363. 208,103,30,71,118,12,71,99,78,78,78,58,58,58,58,58,78,58,246,78,
  364. 58,58,99,58,246,58,246,58,246,58,99,58,212,246,246,212,246,246,246,246,
  365. 246,246,246,246,212,246,246,246,246,78,58,78,78,78,78,78,58,78,78,78,
  366. 58,78,99,99,99,58,58,99,99,8,99,58,99,99,58,58,58,58,78,78,
  367. 78,78,58,58,58,78,78,78,78,78,246,246,58,246,246,246,246,246,246,246,
  368. 246,246,212,246,99,58,246,246,246,246,212,58,58,58,99,212,78,212,212,58,
  369. 78,58,58,58,246,246,78,58,71,218,58,58,11,71,118,223,49,23,103,243,
  370. 22,49,118,30,118,82,49,30,242,62,70,62,244,118,223,82,112,65,93,205,
  371. 217,42,80,147,98,4,26,8,8,8,8,121,8,8,26,4,98,210,111,219,
  372. 29,29,65,112,223,82,23,30,244,62,62,62,62,49,82,82,112,30,30,65,
  373. 243,245,103,30,71,118,12,71,218,212,246,58,58,212,212,58,58,246,212,78,
  374. 58,58,212,58,58,246,78,246,58,58,58,58,246,212,246,246,246,246,246,246,
  375. 246,212,246,246,246,246,212,246,246,212,78,246,212,78,58,78,78,78,58,78,
  376. 78,78,58,58,58,58,99,58,58,8,58,58,58,58,58,58,58,58,237,78,
  377. 58,78,78,58,78,78,212,78,246,78,78,246,246,246,246,246,246,246,246,246,
  378. 246,246,246,58,58,58,246,246,246,246,58,58,99,58,58,246,246,78,99,78,
  379. 246,78,58,58,58,58,58,218,12,99,58,99,71,92,49,223,118,22,41,65,
  380. 223,23,30,118,19,23,22,242,23,23,30,112,223,19,112,29,222,232,87,80,
  381. 98,26,121,8,20,253,20,20,20,20,101,20,20,20,253,253,20,8,121,26,
  382. 4,14,2,231,29,30,49,82,112,30,244,62,23,210,118,82,101,223,30,244,
  383. 65,55,243,103,237,71,118,71,71,99,58,58,58,58,218,58,58,58,246,212,
  384. 58,58,212,78,99,58,246,246,78,58,58,58,58,246,246,246,246,246,246,246,
  385. 246,246,246,212,246,246,246,246,246,246,246,78,78,78,78,78,58,78,58,78,
  386. 78,58,58,58,78,99,58,58,99,8,99,58,58,99,99,58,58,58,58,237,
  387. 78,78,58,78,78,246,78,246,78,246,78,246,246,246,246,246,246,246,246,246,
  388. 246,246,58,58,58,58,246,246,246,58,99,78,246,212,99,246,212,58,78,246,
  389. 58,246,58,58,58,212,218,12,118,58,58,71,12,49,19,49,237,41,65,49,
  390. 118,112,223,82,244,236,62,66,62,30,82,8,112,93,68,6,137,88,162,253,
  391. 253,20,253,19,223,23,244,244,54,242,54,242,244,62,112,49,223,20,20,20,
  392. 20,253,26,98,14,33,29,244,82,101,112,22,62,62,62,23,49,53,82,30,
  393. 112,22,243,243,208,11,71,118,12,218,99,58,58,58,12,71,58,58,58,58,
  394. 99,58,58,246,246,58,58,246,246,58,58,58,99,58,246,246,246,246,78,58,
  395. 246,212,246,246,246,246,246,212,246,246,78,78,78,78,58,78,78,78,78,58,
  396. 78,58,78,237,78,58,99,99,78,8,58,99,58,58,78,78,78,78,78,78,
  397. 58,78,78,58,78,246,78,212,246,246,246,246,246,246,246,246,246,103,246,246,
  398. 246,246,58,58,58,99,212,246,246,58,212,78,246,58,58,58,58,58,212,78,
  399. 78,78,58,58,58,58,123,49,218,99,11,118,223,223,82,237,41,208,23,118,
  400. 237,223,82,244,18,210,23,23,112,19,223,103,64,6,148,147,26,253,20,8,
  401. 66,23,54,111,219,219,137,24,76,24,163,25,137,42,204,42,151,109,244,223,
  402. 20,20,20,20,8,4,111,231,236,23,82,12,237,62,62,23,62,223,253,223,
  403. 237,244,22,41,245,103,11,112,118,71,218,58,58,99,92,92,128,58,58,58,
  404. 58,58,58,212,78,58,58,212,58,58,58,78,78,58,212,246,246,246,58,58,
  405. 212,246,212,246,246,246,246,246,246,212,246,78,246,246,78,78,78,78,78,58,
  406. 78,58,58,78,99,58,58,58,99,8,99,58,58,58,58,78,78,58,78,78,
  407. 78,78,78,78,78,58,246,246,246,246,246,246,246,246,103,246,246,246,246,246,
  408. 246,78,58,58,58,58,58,212,58,58,78,212,78,78,99,58,58,212,78,246,
  409. 212,212,58,58,58,218,92,12,218,99,71,12,223,82,118,243,55,23,223,30,
  410. 223,19,244,93,54,49,23,112,82,82,245,153,138,234,162,8,253,101,49,30,
  411. 111,125,24,201,142,16,159,142,43,95,197,156,193,193,51,141,224,25,248,231,
  412. 65,118,20,20,20,20,121,210,231,55,244,82,49,30,244,62,62,244,223,20,
  413. 118,237,112,208,243,245,237,71,118,49,71,58,58,218,92,92,12,58,58,99,
  414. 58,58,212,78,212,212,58,58,58,58,58,212,78,58,58,246,246,246,99,58,
  415. 99,246,246,246,246,246,246,246,246,246,212,246,58,78,78,78,78,78,58,78,
  416. 78,58,78,78,58,78,58,99,58,8,99,99,58,58,58,78,78,58,78,58,
  417. 78,78,78,246,78,78,78,246,246,246,246,246,246,246,246,103,246,246,246,246,
  418. 246,58,58,58,58,58,58,58,58,58,78,78,246,78,58,58,58,212,78,58,
  419. 58,78,58,58,58,12,92,12,99,218,118,19,82,223,22,116,237,49,112,112,
  420. 101,112,93,109,70,112,118,82,223,55,136,185,44,26,253,253,82,62,107,163,
  421. 117,16,114,159,161,106,98,46,26,26,26,26,26,4,32,81,44,142,43,234,
  422. 10,56,236,23,20,20,20,8,4,219,225,237,19,82,11,244,62,54,62,223,
  423. 20,112,30,244,72,239,103,237,71,12,12,71,58,71,92,92,12,128,58,58,
  424. 58,58,246,78,246,58,58,58,99,58,58,246,78,78,58,246,246,58,58,58,
  425. 58,212,246,212,246,246,246,246,246,246,78,78,246,58,246,58,78,246,78,58,
  426. 78,58,78,78,58,58,58,58,58,8,58,58,58,58,78,237,58,78,78,78,
  427. 78,78,78,58,246,246,212,246,246,246,246,246,246,246,246,246,246,246,246,246,
  428. 78,58,58,58,58,58,99,58,58,246,246,246,58,246,58,58,58,78,246,218,
  429. 11,58,58,58,58,12,92,71,218,11,49,223,101,23,239,93,23,118,244,223,
  430. 223,65,29,70,70,112,82,82,72,233,135,152,121,253,20,49,242,179,176,39,
  431. 198,156,32,47,26,26,69,113,26,47,9,47,162,113,26,121,113,252,152,159,
  432. 43,234,217,238,30,253,20,251,8,4,107,17,30,82,223,22,62,62,54,244,
  433. 82,19,237,112,244,41,245,30,112,71,92,71,99,71,12,92,92,71,78,58,
  434. 58,246,246,58,78,212,58,58,58,58,58,78,246,58,99,58,212,58,58,58,
  435. 58,78,246,246,246,246,246,246,246,246,246,246,78,78,78,78,246,58,78,78,
  436. 58,58,58,99,58,99,58,58,58,8,58,99,99,58,58,78,78,58,78,58,
  437. 78,58,78,78,78,78,78,246,246,246,246,246,246,246,246,246,78,246,246,246,
  438. 58,58,78,58,78,58,58,99,58,78,58,246,246,58,58,58,212,58,58,12,
  439. 71,58,58,58,99,92,92,71,218,71,223,8,19,22,150,30,49,11,23,101,
  440. 30,93,54,49,112,49,20,30,254,181,95,26,253,253,49,65,163,166,206,202,
  441. 52,26,8,121,4,161,43,114,139,131,57,200,195,188,192,88,26,26,121,98,
  442. 197,67,234,145,230,22,82,20,20,8,98,107,100,112,253,112,103,244,54,62,
  443. 49,20,49,237,118,208,243,103,11,11,12,92,92,92,92,12,49,12,58,58,
  444. 78,58,246,78,246,78,212,99,58,58,78,246,58,78,58,58,58,99,58,58,
  445. 58,99,246,246,246,246,246,246,246,246,246,246,246,78,246,78,246,78,58,78,
  446. 78,58,78,78,78,58,58,99,58,8,99,58,58,58,99,78,58,78,78,78,
  447. 78,78,78,78,78,246,246,246,246,246,246,246,246,246,246,246,58,212,58,246,
  448. 99,212,58,99,78,99,58,58,78,246,58,58,58,78,78,58,78,78,99,71,
  449. 12,71,58,58,12,12,12,71,11,12,223,101,49,243,100,118,223,112,82,19,
  450. 93,225,113,23,244,101,223,41,129,199,52,253,20,223,242,124,39,57,117,122,
  451. 121,121,47,44,195,35,94,196,165,189,189,189,27,84,200,139,67,186,26,121,
  452. 240,106,159,234,175,68,242,20,20,20,8,210,238,93,223,19,237,244,23,54,
  453. 62,19,101,244,112,30,243,208,237,11,12,92,49,223,12,12,92,12,58,78,
  454. 246,78,58,246,78,212,78,78,58,58,212,58,58,58,78,99,58,58,99,58,
  455. 58,58,246,246,246,246,246,246,246,246,246,246,78,246,58,78,58,78,78,78,
  456. 78,78,237,78,58,58,58,58,58,8,99,58,99,58,78,78,78,58,78,78,
  457. 78,78,78,78,78,58,246,246,246,246,103,246,246,246,246,218,58,58,78,78,
  458. 58,99,71,12,58,78,58,78,58,78,123,12,78,78,58,212,78,78,123,92,
  459. 12,12,99,99,12,92,92,71,11,118,82,101,112,116,236,82,112,112,82,118,
  460. 100,110,66,23,49,101,244,215,73,43,69,253,101,23,219,59,97,202,52,8,
  461. 8,4,120,97,187,139,27,143,46,113,26,26,46,88,60,27,131,200,192,47,
  462. 82,66,81,159,234,170,68,118,20,251,20,26,2,64,244,101,118,22,23,62,
  463. 62,49,20,118,244,23,208,245,30,11,71,12,92,12,12,49,12,12,71,58,
  464. 246,246,78,246,78,246,58,78,58,78,212,218,12,246,78,99,58,78,78,11,
  465. 12,58,58,246,246,103,246,246,58,246,246,246,246,78,246,78,78,78,58,78,
  466. 78,58,58,58,78,58,58,99,58,8,99,58,58,58,99,78,58,78,78,78,
  467. 78,212,78,246,246,78,99,58,246,246,246,246,246,246,71,12,99,58,58,99,
  468. 58,58,53,251,71,78,78,78,78,246,19,19,71,246,246,78,212,246,12,92,
  469. 12,12,12,12,92,12,12,71,218,118,19,101,244,239,65,223,244,11,53,112,
  470. 222,235,66,112,223,20,72,45,90,221,8,253,19,242,214,97,57,152,26,8,
  471. 26,188,57,187,139,186,8,8,8,8,121,121,8,8,26,4,44,131,94,67,
  472. 162,82,113,44,159,76,220,29,82,0,20,8,98,238,245,82,82,237,23,62,
  473. 54,112,20,223,237,49,22,245,237,11,71,49,12,92,12,12,12,12,71,78,
  474. 246,58,246,58,246,78,246,58,246,212,58,19,101,218,78,78,99,58,58,53,
  475. 101,71,58,246,246,246,78,71,92,58,246,246,212,246,78,58,58,78,78,58,
  476. 78,78,78,78,58,58,58,58,58,8,99,99,58,99,58,78,78,58,99,58,
  477. 78,78,58,246,78,58,71,92,218,246,246,246,103,246,12,92,92,58,58,58,
  478. 58,218,63,53,19,246,246,78,78,212,53,92,92,212,246,78,78,58,92,218,
  479. 12,12,92,92,92,12,12,71,11,118,101,101,22,116,242,223,237,11,8,30,
  480. 17,62,70,112,8,53,72,172,134,143,8,20,223,109,102,57,97,81,121,82,
  481. 252,114,35,157,165,26,253,8,8,46,182,4,26,26,8,8,113,160,190,35,
  482. 186,66,121,106,117,152,232,68,49,79,20,8,26,42,17,223,53,22,112,244,
  483. 54,244,8,82,30,118,30,245,30,11,99,12,12,92,123,12,12,12,71,78,
  484. 246,78,246,78,58,246,246,58,246,58,12,53,53,12,78,78,78,99,12,63,
  485. 63,92,78,78,246,246,78,229,229,12,246,246,246,212,78,71,71,58,78,78,
  486. 58,78,78,58,58,58,212,58,58,8,99,58,58,58,58,78,78,58,99,218,
  487. 99,58,246,78,78,58,12,92,12,78,246,246,246,218,92,92,19,71,58,58,
  488. 58,12,38,92,53,71,246,58,246,218,108,92,92,218,246,212,78,58,12,218,
  489. 12,12,12,92,12,92,12,71,71,118,82,8,103,116,242,82,244,11,82,30,
  490. 222,210,223,23,8,101,55,172,183,186,8,253,223,110,102,157,97,161,8,8,
  491. 127,67,190,140,189,26,8,8,69,127,120,5,52,26,26,8,121,9,84,187,
  492. 43,113,82,98,142,152,89,119,244,20,0,253,121,219,64,23,101,30,30,23,
  493. 54,244,82,101,30,112,112,72,237,71,30,12,12,92,118,12,12,12,71,58,
  494. 246,246,58,246,58,212,78,246,58,246,108,63,53,19,78,78,78,58,53,101,
  495. 53,108,78,246,246,246,108,79,20,53,246,246,246,78,99,92,92,12,99,78,
  496. 78,58,58,218,218,218,99,58,58,8,99,99,58,58,58,99,99,218,71,11,
  497. 99,99,78,246,212,71,218,71,92,71,246,246,246,71,92,92,19,19,58,58,
  498. 58,92,53,92,92,108,58,246,246,71,92,92,92,92,212,246,246,58,123,48,
  499. 12,12,12,92,92,12,12,12,99,118,19,101,237,116,65,49,30,112,82,244,
  500. 222,235,26,118,82,101,65,136,183,7,8,8,82,242,21,157,57,192,69,8,
  501. 26,7,191,157,190,60,9,8,26,52,84,131,60,4,121,8,26,113,67,94,
  502. 142,113,82,98,43,152,10,119,244,251,0,253,121,111,64,23,101,244,22,49,
  503. 62,62,82,101,112,23,112,103,30,71,11,12,12,118,12,12,118,12,71,78,
  504. 78,246,78,58,218,58,78,246,246,12,53,101,53,19,58,78,58,12,63,63,
  505. 53,63,218,246,246,71,79,20,63,101,218,246,246,218,12,19,108,12,99,58,
  506. 99,71,218,71,71,218,71,218,71,8,99,58,99,99,58,58,11,218,71,218,
  507. 71,71,218,58,58,99,218,99,71,92,218,78,246,92,92,12,223,53,71,58,
  508. 58,19,19,92,92,19,12,78,78,12,92,92,92,92,71,78,78,218,123,241,
  509. 48,12,12,92,49,12,118,12,71,49,223,101,11,116,65,66,112,11,82,112,
  510. 100,54,66,66,223,20,244,105,90,159,8,8,8,244,10,167,187,202,98,8,
  511. 121,47,192,169,190,35,195,188,188,195,57,84,106,47,8,8,8,122,195,140,
  512. 95,66,82,98,142,221,175,119,244,251,251,20,8,219,64,112,101,30,242,118,
  513. 23,62,19,20,11,118,112,22,11,11,99,12,12,12,12,71,12,118,71,58,
  514. 246,58,246,99,12,99,212,78,58,19,53,53,101,53,58,78,218,53,101,53,
  515. 53,63,218,246,246,63,0,101,19,53,12,78,58,12,108,92,19,108,92,71,
  516. 71,12,71,71,123,71,71,123,71,8,99,99,58,58,58,11,58,11,99,218,
  517. 99,11,99,99,218,99,218,99,71,12,12,99,99,92,92,92,12,19,53,71,
  518. 99,38,53,12,12,92,19,218,212,92,92,92,48,12,108,128,246,218,123,48,
  519. 128,123,12,12,12,12,12,118,71,71,223,8,112,41,55,49,49,244,223,49,
  520. 93,231,70,82,223,20,82,116,181,158,252,8,20,223,242,214,57,157,156,46,
  521. 8,66,26,147,44,198,86,196,86,198,44,52,4,8,8,8,46,60,97,194,
  522. 52,82,82,180,159,177,232,64,66,79,20,8,26,231,100,49,8,237,62,23,
  523. 62,244,82,82,30,223,11,237,112,11,11,12,12,71,12,12,118,12,71,218,
  524. 246,78,58,218,92,99,246,212,92,53,79,79,53,53,218,58,19,63,38,126,
  525. 53,101,92,58,19,251,63,223,19,19,92,71,12,223,92,223,223,92,19,92,
  526. 12,71,123,71,71,71,71,71,71,8,11,58,11,58,99,58,99,58,99,58,
  527. 58,218,218,218,99,218,11,99,99,71,92,92,12,49,92,71,99,12,53,53,
  528. 92,20,53,123,48,12,92,19,218,19,92,12,241,48,92,92,58,218,92,241,
  529. 128,212,71,12,118,12,12,71,71,112,223,19,82,55,116,112,49,244,223,19,
  530. 208,238,235,66,223,253,82,22,250,73,95,113,8,82,49,111,102,207,132,188,
  531. 252,69,8,121,162,4,47,52,127,4,4,26,26,8,8,46,186,86,169,95,
  532. 66,8,4,95,192,87,45,236,101,251,253,8,70,222,236,223,223,237,244,23,
  533. 54,244,82,82,237,118,11,244,71,11,99,71,118,12,12,12,12,12,12,58,
  534. 78,78,246,123,108,12,212,12,53,63,13,83,63,53,12,92,53,226,13,13,
  535. 53,53,53,226,75,63,12,71,92,19,19,92,92,92,19,12,12,12,92,12,
  536. 71,71,71,71,71,12,71,71,71,8,99,99,58,99,99,58,58,99,58,58,
  537. 11,218,71,71,11,218,99,99,58,218,12,19,92,92,92,99,78,58,92,101,
  538. 75,251,53,12,123,48,92,108,101,63,92,12,241,241,92,92,108,92,108,128,
  539. 212,246,58,12,12,12,49,12,12,118,12,49,19,237,116,22,49,118,244,82,
  540. 112,17,231,70,223,82,20,82,93,45,133,7,46,8,8,49,50,224,168,207,
  541. 142,60,127,46,8,26,8,8,8,8,8,8,121,26,47,192,166,169,7,113,
  542. 66,113,7,156,36,217,28,23,251,251,20,26,111,222,30,8,49,22,112,62,
  543. 242,112,101,112,30,49,244,11,112,11,99,71,12,12,118,12,12,12,71,246,
  544. 246,78,212,92,108,92,218,53,38,13,0,0,63,101,20,63,101,75,83,83,
  545. 63,101,229,79,126,92,58,78,12,19,92,92,19,92,12,71,71,118,71,71,
  546. 218,12,71,71,71,71,71,218,99,8,218,99,218,58,58,218,99,99,58,99,
  547. 58,58,99,99,218,99,218,99,58,58,99,92,92,92,19,58,78,78,99,108,
  548. 0,34,38,123,123,48,123,92,53,108,92,12,241,241,241,123,92,19,19,123,
  549. 241,212,246,99,12,71,12,71,12,71,118,223,82,118,245,100,112,49,30,118,
  550. 223,237,238,111,113,223,19,20,49,93,144,184,44,113,8,253,19,210,173,141,
  551. 168,57,196,142,60,52,122,182,113,113,122,3,60,159,130,86,43,122,26,223,
  552. 47,106,95,76,89,68,244,20,251,20,8,210,238,72,223,19,30,112,23,62,
  553. 244,223,20,118,112,112,244,118,11,99,99,218,71,218,71,12,12,71,58,58,
  554. 78,246,246,92,63,53,53,101,83,0,83,83,53,63,63,53,20,83,0,0,
  555. 53,53,79,0,226,78,58,78,12,108,92,19,92,71,58,58,99,71,71,123,
  556. 71,218,218,71,218,218,99,218,99,8,99,99,218,218,99,99,99,99,58,99,
  557. 99,58,99,11,71,99,99,58,58,58,58,71,92,92,19,78,78,58,78,218,
  558. 53,63,101,123,123,48,48,123,92,19,92,92,241,241,241,241,92,92,92,12,
  559. 241,212,78,78,123,118,12,12,12,12,112,92,49,223,30,247,65,49,23,112,
  560. 82,23,72,231,14,26,82,19,101,49,17,146,102,154,147,69,8,82,49,23,
  561. 249,104,158,39,206,169,86,130,202,142,202,114,39,117,76,88,4,66,66,113,
  562. 7,95,234,175,68,22,101,20,251,8,4,107,100,112,101,112,30,23,112,62,
  563. 49,101,49,244,118,112,112,118,11,78,99,99,99,58,71,12,92,99,246,78,
  564. 246,58,218,108,108,53,63,229,0,83,34,13,53,53,101,38,13,0,0,13,
  565. 53,101,63,101,99,78,58,78,71,19,19,92,71,58,99,58,11,218,218,71,
  566. 99,99,99,99,218,58,99,218,218,8,71,218,99,99,218,58,99,99,99,99,
  567. 99,58,99,58,99,218,11,58,58,99,58,58,71,92,92,58,78,78,78,78,
  568. 118,19,53,123,48,128,128,48,123,12,92,92,48,128,212,48,241,12,12,92,
  569. 241,128,246,246,246,71,12,12,12,71,71,118,49,223,49,208,116,22,49,23,
  570. 11,223,223,72,225,235,113,82,82,101,49,65,68,164,201,7,162,26,8,121,
  571. 66,223,23,216,14,36,177,152,154,152,80,255,98,66,66,223,66,4,32,152,
  572. 152,163,228,222,112,251,20,20,8,113,219,222,22,82,23,22,62,112,54,244,
  573. 101,82,112,112,23,118,112,11,11,78,58,58,246,99,71,71,99,58,246,212,
  574. 58,58,123,108,108,53,20,13,101,19,34,13,53,53,53,0,75,38,0,34,
  575. 63,53,53,71,58,78,58,78,11,92,92,71,58,58,58,58,99,218,11,99,
  576. 11,58,218,218,99,99,218,99,99,8,99,71,99,99,99,99,99,218,58,99,
  577. 218,58,99,99,99,58,58,78,58,99,58,58,58,71,12,78,78,78,78,78,
  578. 58,12,19,12,48,218,246,218,48,12,92,92,241,48,58,212,48,241,12,92,
  579. 48,241,212,58,212,212,123,118,12,71,118,118,12,223,49,118,55,239,244,223,
  580. 112,112,82,118,236,225,14,4,26,82,101,19,112,93,153,21,224,174,88,162,
  581. 26,26,121,82,66,66,66,66,66,66,26,82,66,26,113,127,32,44,51,87,
  582. 248,222,236,223,20,20,20,8,70,111,17,237,223,49,237,30,62,54,30,118,
  583. 253,49,112,118,23,118,118,11,99,58,58,58,212,99,71,218,246,78,78,58,
  584. 58,58,108,108,63,38,13,92,58,12,13,251,53,63,251,79,12,71,34,34,
  585. 251,53,19,58,78,78,78,58,58,71,71,58,99,99,58,99,58,11,58,99,
  586. 99,99,99,218,218,99,218,218,99,8,71,99,218,218,218,99,218,99,99,99,
  587. 99,71,58,99,99,99,99,58,58,99,58,58,78,58,99,78,58,78,58,78,
  588. 78,78,99,218,128,58,58,78,128,48,12,92,123,241,78,246,58,48,241,218,
  589. 12,128,212,212,58,58,212,218,71,12,71,12,118,12,223,49,11,243,55,244,
  590. 49,112,244,223,49,236,17,111,4,121,82,82,8,223,244,29,153,61,148,234,
  591. 152,32,147,52,4,4,113,26,113,26,98,98,147,255,7,193,24,163,217,238,
  592. 110,112,101,20,20,253,8,70,107,222,22,223,223,244,244,244,244,242,112,82,
  593. 223,118,23,23,49,118,71,11,58,58,58,246,246,58,99,78,58,212,212,78,
  594. 58,99,53,53,38,83,19,58,246,19,34,79,251,34,34,71,58,71,79,13,
  595. 83,63,218,58,58,99,58,78,58,99,78,58,99,99,99,58,58,99,99,58,
  596. 218,11,218,99,11,218,11,99,71,8,71,218,218,11,71,99,218,99,99,99,
  597. 99,218,11,99,58,58,58,58,11,58,99,218,58,58,78,78,78,78,58,58,
  598. 78,78,78,78,58,78,78,78,58,58,48,123,48,48,128,78,246,78,128,241,
  599. 241,241,128,212,58,58,58,58,218,12,118,71,71,112,118,223,49,11,245,55,
  600. 30,49,112,244,223,19,30,93,107,111,4,26,101,101,8,101,112,242,93,203,
  601. 6,170,21,74,51,51,104,24,234,76,24,104,76,124,232,56,225,18,30,223,
  602. 20,20,20,20,8,66,235,231,236,112,223,118,30,112,112,54,244,112,82,49,
  603. 112,23,118,118,12,11,99,99,246,58,58,58,78,58,246,246,78,78,212,78,
  604. 58,12,53,229,34,40,78,78,58,38,0,13,13,79,71,58,58,71,13,0,
  605. 38,71,58,99,58,99,58,99,78,58,58,99,99,99,71,99,58,99,218,99,
  606. 71,99,218,99,99,71,218,99,71,8,71,71,71,123,218,218,11,218,218,218,
  607. 218,99,218,218,99,99,99,99,58,99,99,99,99,99,58,78,78,58,58,99,
  608. 99,78,78,246,78,212,78,78,58,78,128,48,48,241,48,246,78,58,246,128,
  609. 128,128,128,128,212,78,212,78,58,218,71,71,12,12,118,118,49,49,112,208,
  610. 41,22,49,112,244,23,19,49,22,93,219,14,4,8,82,101,20,101,223,49,
  611. 30,65,18,29,17,203,228,230,56,96,91,225,225,236,242,112,49,82,20,20,
  612. 20,20,82,113,210,107,29,22,118,223,112,30,244,244,62,112,23,82,223,49,
  613. 118,118,49,49,118,71,99,246,58,58,212,246,246,78,212,58,246,246,78,58,
  614. 218,53,209,126,40,78,78,78,218,0,34,34,79,71,78,99,58,71,251,229,
  615. 12,58,99,99,99,58,58,58,58,99,99,99,99,218,99,58,99,99,99,218,
  616. 99,218,11,218,218,11,218,71,71,8,71,123,71,71,218,123,71,99,11,99,
  617. 218,11,99,71,218,99,58,99,99,58,218,218,99,99,58,58,58,58,99,58,
  618. 58,99,58,246,246,246,78,58,58,58,78,58,48,48,241,78,246,78,78,58,
  619. 58,241,241,241,212,58,246,78,246,58,218,71,71,71,118,118,118,49,49,112,
  620. 103,243,236,112,49,244,112,49,223,118,65,93,107,14,98,113,82,8,101,253,
  621. 101,20,101,82,82,223,118,118,49,49,49,82,82,101,101,20,20,253,253,121,
  622. 26,70,235,110,29,103,118,223,223,11,244,244,54,242,244,49,19,223,49,118,
  623. 118,49,12,71,11,99,212,246,78,78,78,78,212,246,78,58,78,212,78,58,
  624. 12,38,213,71,78,58,58,78,40,83,79,20,99,58,99,58,99,12,92,71,
  625. 78,58,99,99,99,99,99,99,99,99,218,218,99,218,218,99,218,218,11,218,
  626. 11,218,218,71,218,218,71,123,71,8,71,71,12,71,71,218,218,218,71,71,
  627. 218,218,218,218,71,218,218,99,99,218,99,99,99,99,99,99,58,99,58,99,
  628. 99,99,99,58,78,78,78,78,58,99,58,58,58,128,48,128,78,78,58,78,
  629. 212,212,212,241,128,58,246,246,58,246,58,218,218,118,71,71,118,12,118,49,
  630. 23,237,245,55,208,23,118,23,112,223,223,118,244,236,18,110,14,210,4,66,
  631. 121,8,82,20,82,101,101,251,20,20,20,101,8,20,8,8,26,26,210,235,
  632. 109,110,65,30,118,223,49,244,244,244,244,242,65,30,223,82,49,118,118,49,
  633. 92,49,118,71,11,78,246,78,58,246,212,246,78,78,246,78,246,78,212,218,
  634. 53,92,99,78,58,58,58,246,53,0,53,99,99,58,99,58,99,71,218,58,
  635. 99,58,99,218,58,99,58,78,99,99,11,99,71,99,99,218,99,99,218,71,
  636. 123,218,71,218,12,71,71,71,71,8,71,71,71,71,71,118,71,71,218,99,
  637. 71,71,71,123,71,71,218,99,99,218,218,71,11,218,99,99,58,99,58,99,
  638. 99,99,218,58,58,78,78,78,58,99,99,58,58,58,58,128,246,78,58,58,
  639. 58,58,246,128,128,58,212,246,78,78,78,58,58,218,71,71,11,118,118,49,
  640. 12,23,11,103,243,72,237,23,23,112,23,223,19,223,112,22,109,18,29,111,
  641. 111,210,210,70,4,26,26,26,26,26,26,4,4,70,98,235,2,18,29,65,
  642. 54,23,223,49,23,244,244,112,244,54,22,244,118,82,223,223,118,92,49,49,
  643. 223,71,11,99,99,78,246,58,246,78,58,212,78,78,58,58,246,78,58,218,
  644. 71,78,58,58,99,58,58,99,19,77,58,58,58,218,99,58,58,58,58,58,
  645. 218,99,11,218,58,99,218,58,218,218,71,218,218,71,99,71,218,71,71,218,
  646. 71,123,71,71,71,71,71,71,12,8,118,118,71,71,118,71,71,71,118,12,
  647. 71,123,71,71,71,71,71,71,218,99,99,99,218,218,71,218,99,99,58,99,
  648. 99,218,99,218,58,58,246,78,78,99,99,99,99,58,246,78,58,246,58,58,
  649. 58,58,58,78,78,58,58,58,246,212,99,58,58,58,218,99,71,118,11,118,
  650. 49,49,49,23,11,208,55,245,22,112,23,23,23,23,49,49,49,223,112,30,
  651. 22,236,18,18,18,29,18,18,18,18,107,236,29,236,236,22,30,23,223,223,
  652. 223,118,118,112,244,112,244,242,242,30,23,223,82,223,49,49,49,223,49,12,
  653. 71,71,99,58,246,212,58,58,58,78,78,78,58,58,58,58,78,212,246,78,
  654. 78,58,58,11,99,58,78,78,99,58,58,99,218,99,58,99,58,58,58,218,
  655. 99,71,218,99,218,58,99,218,218,71,218,123,71,99,71,218,71,71,71,12,
  656. 71,71,12,12,12,12,12,12,12,8,12,12,12,12,12,12,118,118,71,71,
  657. 71,218,71,123,71,71,71,71,123,71,218,11,218,71,218,123,218,99,218,58,
  658. 99,99,11,218,71,99,99,58,78,58,99,99,71,99,58,78,246,246,246,58,
  659. 58,218,58,99,78,78,246,78,78,246,58,58,58,212,58,58,99,71,71,118,
  660. 71,118,118,23,49,112,112,103,72,72,65,244,112,23,118,118,70,223,223,223,
  661. 223,49,118,23,118,112,112,244,112,112,23,23,23,49,49,223,223,49,23,118,
  662. 244,244,112,62,244,109,22,30,49,223,223,82,49,223,49,223,223,118,118,71,
  663. 99,99,99,78,78,246,58,58,78,78,58,58,58,99,78,246,78,78,78,78,
  664. 99,99,99,58,99,58,78,78,58,99,99,11,218,99,99,58,58,11,99,218,
  665. 218,218,71,99,218,218,11,218,123,71,218,71,71,218,71,71,123,71,118,12,
  666. 71,12,12,12,12,12,12,12,12,8,12,12,12,12,12,12,71,71,71,118,
  667. 71,118,71,71,118,12,71,71,71,71,99,218,123,71,218,71,218,71,99,99,
  668. 99,218,218,71,218,218,99,58,58,58,58,218,99,218,218,99,58,99,78,58,
  669. 58,99,99,99,58,58,78,246,246,78,78,78,58,99,58,58,99,58,99,71,
  670. 11,71,12,23,118,118,118,23,112,30,103,208,208,65,242,112,118,23,23,118,
  671. 118,118,49,112,23,112,11,112,112,112,118,49,49,49,49,112,23,23,112,244,
  672. 244,22,22,22,242,112,49,223,223,66,223,49,223,49,223,49,12,71,71,99,
  673. 99,58,212,212,246,58,78,78,58,58,99,99,99,58,78,78,78,78,58,58,
  674. 99,99,99,58,58,58,58,58,99,218,71,218,99,99,218,58,99,99,71,218,
  675. 71,71,218,99,71,99,123,71,118,118,123,71,71,123,71,71,12,12,118,12,
  676. 12,12,12,12,12,12,71,12,71,8,12,92,12,92,71,12,118,118,12,12,
  677. 118,71,71,12,71,71,118,12,12,71,118,218,71,71,71,12,71,12,218,218,
  678. 99,99,218,218,71,71,71,218,99,99,99,99,71,71,218,71,99,58,58,58,
  679. 58,58,99,11,99,99,99,58,246,78,246,78,58,99,99,99,58,58,99,99,
  680. 99,11,71,112,112,118,118,92,118,23,118,112,30,237,103,65,65,22,30,54,
  681. 244,244,23,112,244,112,244,112,244,23,244,23,112,62,244,244,30,242,22,242,
  682. 22,30,23,49,49,19,82,223,223,49,49,49,223,49,12,11,11,218,99,58,
  683. 58,78,78,78,246,78,78,99,99,58,99,58,58,78,78,78,58,99,218,218,
  684. 71,99,99,99,58,99,58,99,71,123,71,218,99,99,218,99,218,71,12,71,
  685. 71,218,71,71,218,71,71,71,71,71,12,71,71,71,118,12,12,12,71,71,
  686. 12,12,12,12,118,12,12,92,12,8,12,12,71,12,12,12,12,12,71,12,
  687. 118,12,12,12,118,12,71,12,12,71,71,71,71,123,71,12,12,71,71,218,
  688. 218,218,11,71,123,71,71,218,71,99,99,58,99,99,71,218,218,99,218,58,
  689. 58,58,58,99,218,71,99,218,58,58,58,246,212,58,58,99,99,58,99,58,
  690. 58,58,58,218,71,71,112,71,118,118,49,23,118,118,49,112,112,30,237,22,
  691. 22,22,103,22,22,22,22,22,30,242,22,22,22,103,22,22,30,112,112,23,
  692. 49,49,49,82,223,66,49,49,49,49,223,12,118,71,218,99,99,58,99,58,
  693. 78,246,78,246,58,58,99,99,218,218,99,99,99,58,58,58,99,218,71,218,
  694. 99,99,58,58,58,99,218,123,71,71,218,218,99,99,99,123,71,71,71,92,
  695. 71,71,218,218,71,12,12,12,118,71,12,118,71,71,71,12,12,12,12,12,
  696. 12,12,118,118,12,12,12,12,12,8,92,92,92,12,12,12,12,12,12,12,
  697. 92,12,12,12,71,12,118,12,12,12,12,12,71,71,71,12,12,71,118,71,
  698. 71,123,71,71,71,118,71,71,71,123,71,218,218,99,218,71,12,71,71,218,
  699. 218,58,58,99,58,71,71,218,218,218,99,58,58,58,58,58,99,99,99,218,
  700. 218,99,58,58,99,99,99,11,11,11,23,112,118,112,49,118,118,118,23,118,
  701. 49,118,23,112,112,112,112,244,112,112,118,112,118,49,49,223,49,223,223,49,
  702. 223,223,49,49,223,49,223,223,118,118,71,11,218,99,218,99,218,78,58,58,
  703. 58,58,58,218,218,218,218,218,58,99,58,58,58,58,218,99,71,71,123,71,
  704. 218,99,58,99,99,71,71,12,12,71,71,71,218,218,218,71,118,71,71,12,
  705. 123,71,12,71,71,12,12,12,118,71,12,12,12,118,118,12,71,118,12,118,
  706. 12,12,12,12,12,92,12,12,92,8,92,92,12,12,92,12,92,12,12,12,
  707. 12,12,118,12,12,12,12,12,12,12,118,12,12,71,118,71,12,12,71,118,
  708. 71,71,71,123,218,118,12,71,71,71,71,99,99,218,218,71,71,71,71,71,
  709. 99,218,99,58,99,218,218,71,71,71,218,71,58,99,58,58,99,58,218,99,
  710. 99,218,99,99,58,58,58,99,58,99,218,11,71,112,11,112,118,23,118,23,
  711. 49,118,118,92,49,92,49,92,49,92,49,223,223,49,223,49,49,49,49,82,
  712. 49,49,49,223,118,118,71,71,11,71,99,218,218,99,58,58,58,58,58,58,
  713. 58,218,218,218,71,218,218,99,99,99,99,58,218,218,71,123,71,71,218,11,
  714. 99,99,218,218,71,71,12,71,12,218,218,218,71,218,118,12,71,118,71,71,
  715. 71,71,71,71,118,71,12,12,12,71,12,12,12,12,12,12,12,49,12,12,
  716. 12,92,12,49,12,92,12,12,92,8,92,92,92,92,92,12,92,12,12,92,
  717. 12,92,12,92,12,71,71,12,12,12,12,71,12,118,71,118,71,118,12,12,
  718. 12,12,71,71,218,71,71,118,118,12,12,118,71,218,71,218,123,12,12,12,
  719. 12,71,71,99,99,99,218,71,71,71,71,123,71,218,218,58,99,99,58,218,
  720. 99,218,218,11,99,218,99,218,218,58,58,58,99,218,71,11,71,71,118,11,
  721. 112,71,112,118,112,12,118,118,118,118,118,118,118,118,118,118,223,223,49,49,
  722. 118,118,118,71,71,71,218,71,218,71,99,99,99,218,58,58,58,218,218,218,
  723. 218,71,71,218,123,71,218,99,58,218,218,99,71,118,12,71,71,71,218,218,
  724. 218,99,71,118,12,12,12,71,71,123,71,71,71,12,118,12,92,71,118,71,
  725. 12,12,71,12,12,92,12,12,12,118,12,12,12,12,12,92,12,12,12,92,
  726. 71,92,12,92,92,92,92,92,12,8,92,92,92,92,92,92,92,92,92,12,
  727. 92,12,92,12,92,92,12,118,92,12,12,92,92,12,12,12,12,12,12,12,
  728. 12,12,71,118,12,118,71,71,12,12,12,12,118,71,218,71,218,71,118,12,
  729. 12,71,12,71,218,71,99,218,123,71,71,12,71,118,71,71,99,218,218,99,
  730. 218,99,218,218,218,71,123,71,218,218,218,218,99,99,99,58,99,99,99,218,
  731. 99,71,71,71,11,71,11,11,11,11,11,11,11,11,71,118,12,118,218,218,
  732. 71,218,71,71,218,71,99,71,99,99,99,58,218,99,218,218,71,71,71,71,
  733. 71,71,123,71,11,99,99,99,218,218,71,71,12,12,12,71,123,218,71,218,
  734. 71,118,71,12,118,12,12,71,71,218,118,12,12,12,92,12,71,118,71,71,
  735. 12,71,92,12,92,12,12,12,118,12,12,92,92,12,92,12,92,92,92,92,
  736. 92,92,92,92,12,92,92,92,92,8,92,92,92,12,92,92,92,92,92,92,
  737. 92,92,92,12,92,92,12,12,92,92,92,12,92,92,12,12,118,12,12,92,
  738. 92,12,12,12,71,71,71,118,12,118,12,12,12,71,12,71,71,71,71,12,
  739. 12,12,118,12,12,118,218,71,71,71,12,71,71,71,12,12,71,71,71,11,
  740. 218,99,218,218,218,218,71,71,71,71,71,71,71,71,218,218,218,218,99,218,
  741. 218,218,99,218,99,218,218,218,218,218,218,218,218,99,218,11,218,71,71,71,
  742. 71,123,71,123,71,218,99,218,218,11,218,99,71,71,71,71,71,71,71,92,
  743. 71,71,71,123,71,218,71,71,71,118,12,12,12,12,71,71,71,218,71,71,
  744. 12,12,12,12,12,12,12,71,71,71,12,12,12,12,12,12,12,12,118,12,
  745. 12,92,92,92,12,92,12,71,12,92,92,12,92,92,92,92,92,12,92,92,
  746. 92,92,92,92,92,92,92,92,92,8,92,19,92,92,92,92,92,223,92,92,
  747. 92,92,92,92,92,92,92,92,92,92,92,92,12,92,12,92,12,118,12,12,
  748. 12,92,92,12,92,12,12,12,71,12,49,12,92,92,12,12,71,12,12,12,
  749. 12,71,12,12,12,12,71,12,71,71,218,218,71,118,12,12,12,71,12,12,
  750. 71,123,71,71,99,71,71,123,71,123,71,123,71,71,71,71,71,71,71,71,
  751. 71,218,218,218,71,71,218,71,218,71,218,71,71,123,71,123,71,123,71,123,
  752. 218,71,218,218,218,218,71,71,71,71,71,12,12,12,12,12,12,12,71,71,
  753. 71,123,218,218,71,71,12,12,12,71,12,12,12,12,71,71,71,12,118,12,
  754. 12,92,12,12,12,12,12,12,71,12,92,12,92,12,12,118,12,12,12,92,
  755. 92,92,92,92,92,12,92,92,12,92,92,92,92,19,12,92,92,92,92,92,
  756. 12,92,92,92,92,92,92,92,92,8,19,108,19,108,12,19,92,92,92,92,
  757. 92,92,92,92,92,19,92,92,92,92,92,92,92,92,92,92,92,92,12,92,
  758. 92,92,92,92,92,92,12,12,12,12,71,12,92,92,92,92,12,92,118,12,
  759. 12,12,12,12,92,12,12,12,71,12,71,71,71,12,12,12,12,12,12,92,
  760. 112,118,71,12,71,71,71,218,71,71,71,71,71,71,12,12,12,12,12,12,
  761. 12,118,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,
  762. 71,71,71,71,71,71,71,71,118,71,12,71,12,12,12,12,12,71,71,123,
  763. 71,71,71,92,12,12,12,12,92,92,71,12,12,12,12,71,12,12,92,12,
  764. 92,92,12,118,12,12,118,12,12,92,92,92,92,12,12,12,12,92,92,92,
  765. 92,12,92,12,92,12,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
  766. 92,92,92,92,12,19,19,108,92,8,92,92,19,92,108,92,19,92,92,92,
  767. 92,108,92,92,92,12,92,92,12,92,92,92,92,92,92,92,92,92,92,12,
  768. 12,92,92,92,92,223,12,92,12,12,12,12,12,92,92,12,92,12,12,12,
  769. 12,12,12,12,49,12,92,92,92,92,12,12,71,12,12,12,12,12,12,12,
  770. 92,92,118,92,12,12,118,12,12,12,12,12,12,71,12,12,12,12,12,12,
  771. 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
  772. 12,12,118,118,12,118,12,12,12,12,12,12,12,12,12,12,12,12,71,12,
  773. 12,12,71,92,12,92,92,49,12,12,12,12,118,12,12,118,92,12,92,92,
  774. 12,12,12,12,123,12,92,92,92,92,92,92,12,92,12,92,92,92,92,92,
  775. 92,92,92,92,92,92,92,92,92,92,92,92,12,92,92,92,19,92,92,108,
  776. 92,19,92,108,108,92,108,92,108,8,19,108,19,92,19,108,108,108,92,19,
  777. 92,92,19,92,108,108,92,108,108,92,92,92,92,92,92,19,92,92,92,92,
  778. 92,92,92,92,92,92,92,92,92,92,92,92,12,92,12,92,92,92,92,92,
  779. 92,12,12,12,12,12,12,92,92,92,92,92,92,12,12,12,12,12,118,12,
  780. 12,12,12,92,12,12,12,12,71,12,12,12,12,71,71,12,12,71,118,118,
  781. 12,12,12,12,12,118,12,12,12,92,12,12,12,12,12,71,12,12,118,12,
  782. 12,71,12,12,12,12,12,92,118,118,12,12,12,12,71,12,12,12,49,12,
  783. 92,12,92,92,92,12,92,12,12,12,12,12,92,92,92,92,92,92,92,92,
  784. 12,12,71,92,92,92,12,92,223,92,92,92,12,92,92,92,92,92,12,19,
  785. 92,92,92,92,92,92,108,92,108,19,92,108,108,108,92,92,19,108,92,108,
  786. 19,92,19,92,108,92,108,19,19,8,19,108,19,108,108,19,92,19,108,19,
  787. 19,108,108,19,19,92,108,92,92,108,19,12,108,108,92,19,108,108,92,19,
  788. 92,92,92,92,92,92,108,19,92,92,92,92,12,92,92,92,92,92,92,92,
  789. 92,92,92,12,12,118,123,92,12,12,92,92,92,92,92,92,12,12,12,12,
  790. 12,92,12,12,92,12,92,92,92,92,92,92,12,12,12,12,12,12,12,71,
  791. 71,12,12,12,12,12,12,12,71,12,12,12,12,12,12,92,12,12,92,12,
  792. 92,12,12,49,12,92,12,12,12,12,12,71,12,12,12,12,92,12,92,12,
  793. 92,92,92,92,92,12,12,12,12,92,12,12,92,92,92,92,92,92,12,12,
  794. 12,92,92,92,92,19,108,92,92,92,92,92,92,92,92,19,92,108,108,92,
  795. 92,92,92,19,108,92,19,108,92,108,108,92,19,92,108,19,108,92,108,92,
  796. 19,108,108,92,108,108,19,92,108,8,19,19,19,19,19,108,19,19,108,92,
  797. 19,19,108,92,19,19,108,19,108,92,108,19,92,19,92,92,92,19,92,92,
  798. 92,92,92,92,92,92,19,108,92,19,19,92,92,92,92,92,92,92,223,92,
  799. 223,92,92,92,92,92,92,92,92,92,92,92,92,223,92,92,92,12,92,12,
  800. 12,12,12,12,92,12,12,92,12,92,92,92,92,92,92,92,92,92,92,92,
  801. 92,92,12,92,49,92,12,92,92,12,12,92,12,92,12,92,12,12,92,12,
  802. 12,12,12,12,12,12,12,92,92,92,12,92,92,92,92,92,92,92,92,92,
  803. 92,92,12,12,12,12,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
  804. 92,92,12,19,92,92,108,12,92,92,92,12,19,92,92,108,92,19,19,92,
  805. 92,92,92,92,108,19,92,19,19,92,92,108,108,92,108,92,19,19,19,108,
  806. 19,19,19,19,19,19,108,19,19,8,19,53,19,53,19,53,19,53,19,108,
  807. 19,108,19,108,108,108,19,108,19,108,19,108,108,108,108,19,108,19,108,19,
  808. 19,92,108,19,19,12,108,92,108,92,108,19,108,92,92,92,92,92,92,19,
  809. 92,19,108,92,19,92,92,92,92,92,92,92,92,92,92,92,108,108,19,92,
  810. 92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
  811. 92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
  812. 92,92,92,92,12,92,92,92,12,92,19,92,92,92,92,92,92,92,92,92,
  813. 92,92,92,92,92,92,92,92,92,108,19,92,92,223,92,92,92,92,92,92,
  814. 19,108,108,108,108,19,92,92,92,92,108,108,108,108,108,92,108,92,108,19,
  815. 92,19,108,108,19,108,108,108,108,108,19,19,19,19,19,19,108,108,53,19,
  816. 108,19,108,53,19,53,19,53,19,8,19,19,19,19,19,19,19,19,19,19,
  817. 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,108,19,108,19,
  818. 19,19,19,19,108,19,108,19,108,19,108,19,19,19,19,108,19,92,92,92,
  819. 19,19,108,19,108,19,19,92,92,92,92,92,92,92,92,19,19,108,19,108,
  820. 19,92,19,92,92,92,92,92,92,92,92,92,92,92,92,19,92,92,92,92,
  821. 92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
  822. 92,92,92,19,19,19,92,19,19,92,19,19,108,92,92,92,19,92,92,92,
  823. 92,92,92,92,92,19,19,19,19,108,19,108,92,92,92,92,92,92,19,19,
  824. 92,19,223,19,108,19,108,92,19,19,19,19,19,19,108,19,108,19,108,19,
  825. 19,19,19,19,19,19,19,19,19,108,19,108,19,108,19,19,19,19,19,19,
  826. 19,19,19,19,19,19,19,19,19,8};
  827. /***** Magic numbers *****/
  828.  
  829. #define PREVIEW_SIZE 128
  830. #define SCALE_WIDTH  200
  831. #define ENTRY_WIDTH   45
  832.  
  833. /***** Color model *****/
  834.  
  835. #define RGB_MODEL 0
  836. #define HSL_MODEL 1 
  837.  
  838. /***** Types *****/
  839. typedef struct
  840. {
  841.   gdouble redfrequency;
  842.   gdouble redangle;
  843.   gdouble greenfrequency;
  844.   gdouble greenangle;
  845.   gdouble bluefrequency;
  846.   gdouble blueangle;
  847.   gint      colormodel;
  848.   gint    redmode;
  849.   gint    greenmode;
  850.   gint    bluemode;
  851. } alienmap2_vals_t;
  852.  
  853. typedef struct
  854. {
  855.   GtkWidget *preview;
  856.   guchar    *image;
  857.   guchar    *wimage;
  858.   gint run;
  859. } alienmap2_interface_t;
  860.  
  861.  
  862.  
  863. /* Declare local functions. */
  864.  
  865. static void      query  (void);
  866. static void      run    (char         *name,
  867.                  int           nparams,
  868.                  GimpParam    *param,
  869.                  int          *nreturn_vals,
  870.                  GimpParam   **return_vals);
  871.  
  872. static void      alienmap2            (GimpDrawable  *drawable);
  873. static void      alienmap2_render_row  (const guchar *src_row,
  874.                     guchar *dest_row,
  875.                     gint row,
  876.                     gint row_width,
  877.                     gint bytes);
  878. static void      alienmap2_get_pixel   (int x, int y, guchar *pixel);
  879. static void         transform             (short int *, short int *, short int *);
  880.  
  881.  
  882. static void      build_preview_source_image (void);
  883.  
  884. static gint      alienmap2_dialog        (void);
  885. static void      dialog_update_preview   (void);
  886. static void      dialog_scale_update     (GtkAdjustment *adjustment,
  887.                       gdouble *value);
  888. static void      dialog_ok_callback      (GtkWidget *widget, gpointer data);
  889. static void      alienmap2_toggle_update (GtkWidget *widget,
  890.                       gpointer   data);
  891. static void      alienmap2_radio_update  (GtkWidget *widget,
  892.                       gpointer   data);
  893. static void      alienmap2_logo_dialog   (void);
  894.  
  895. static void      rgb_to_hsl (gdouble    r,
  896.                  gdouble    g,
  897.                  gdouble    b,
  898.                  gdouble *  h,
  899.                  gdouble *  s,
  900.                  gdouble *  l);
  901. static void      hsl_to_rgb (gdouble    h,
  902.                  gdouble    sl,
  903.                  gdouble    l,
  904.                  gdouble *  r,
  905.                  gdouble *  g,
  906.                  gdouble *  b);
  907.  
  908. /***** Variables *****/
  909.  
  910. GtkWidget *maindlg;
  911. GtkWidget *logodlg;
  912.  
  913. GimpPlugInInfo PLUG_IN_INFO =
  914. {
  915.   NULL,  /* init_proc  */
  916.   NULL,  /* quit_proc  */
  917.   query, /* query_proc */
  918.   run,   /* run_proc   */
  919. };
  920.  
  921. static alienmap2_interface_t wint =
  922. {
  923.   NULL,  /* preview */
  924.   NULL,  /* image   */
  925.   NULL,  /* wimage  */
  926.   FALSE  /* run     */
  927. };
  928.  
  929. static alienmap2_vals_t wvals =
  930. {
  931.   1.0,
  932.   0.0,
  933.   1.0,
  934.   0.0,
  935.   1.0,
  936.   0.0,
  937.   RGB_MODEL,
  938.   TRUE,
  939.   TRUE,
  940.   TRUE,
  941. };
  942.  
  943. static GimpDrawable *drawable;
  944. static gint        tile_width, tile_height;
  945. static gint         img_width, img_height, img_bpp;
  946. static gint         sel_x1, sel_y1, sel_x2, sel_y2;
  947. static gint         sel_width, sel_height;
  948. static gint         preview_width, preview_height;
  949. static GimpTile    *the_tile = NULL;
  950. static gdouble      cen_x, cen_y;
  951. static gdouble      scale_x, scale_y;
  952.  
  953. /***** Functions *****/
  954.  
  955. MAIN ()
  956.  
  957. static void
  958. query (void)
  959. {
  960.   static GimpParamDef args[] =
  961.   {
  962.     { GIMP_PDB_INT32,    "run_mode",       "Interactive, non-interactive" },
  963.     { GIMP_PDB_IMAGE,    "image",          "Input image" },
  964.     { GIMP_PDB_DRAWABLE, "drawable",       "Input drawable" },
  965.     { GIMP_PDB_FLOAT,    "redfrequency",   "Red/hue component frequency factor" },
  966.     { GIMP_PDB_FLOAT,    "redangle",       "Red/hue component angle factor (0-360)" },
  967.     { GIMP_PDB_FLOAT,    "greenfrequency", "Green/saturation component frequency factor" },
  968.     { GIMP_PDB_FLOAT,    "greenangle",     "Green/saturation component angle factor (0-360)" },
  969.     { GIMP_PDB_FLOAT,    "bluefrequency",  "Blue/luminance component frequency factor" },
  970.     { GIMP_PDB_FLOAT,    "blueangle",      "Blue/luminance component angle factor (0-360)" },
  971.     { GIMP_PDB_INT8,     "colormodel",     "Color model (0: RGB_MODEL, 1: HSL_MODEL)" },
  972.     { GIMP_PDB_INT8,     "redmode",        "Red/hue application mode (TRUE, FALSE)" },
  973.     { GIMP_PDB_INT8,     "greenmode",      "Green/saturation application mode (TRUE, FALSE)" },
  974.     { GIMP_PDB_INT8,     "bluemode",       "Blue/luminance application mode (TRUE, FALSE)" },
  975.   };
  976.   static GimpParamDef *return_vals = NULL;
  977.   static int nargs = sizeof (args) / sizeof (args[0]);
  978.   static int nreturn_vals = 0;
  979.  
  980.   INIT_I18N();
  981.  
  982.   gimp_install_procedure ("plug_in_alienmap2",
  983.                   "AlienMap2 Color Transformation Plug-In",
  984.                   "No help yet. Just try it and you'll see!",
  985.                   "Martin Weber (martweb@gmx.net, http://diverse.freepage.de/martin.weber)",
  986.                   "Martin Weber (martweb@gmx.net, http://diverse.freepage.de/martin.weber",
  987.                   "24th April 1998",
  988.                   N_("<Image>/Filters/Colors/Map/Alien Map 2..."),
  989.                   "RGB*",
  990.                   GIMP_PLUGIN,
  991.                   nargs, nreturn_vals,
  992.                   args, return_vals);
  993. }
  994.  
  995. void
  996. transform (short int *r,
  997.        short int *g,
  998.        short int *b)
  999. {
  1000.   gint red, green, blue;
  1001.   gdouble r1, g1, b1, h, s, l;
  1002.   red = *r;
  1003.   green = *g;
  1004.   blue = *b;
  1005.   
  1006.   if (wvals.colormodel == HSL_MODEL)
  1007.     {
  1008.       r1 = (gdouble) red / 255.0;
  1009.       g1 = (gdouble) green / 255.0;
  1010.       b1 = (gdouble) blue / 255.0;
  1011.       rgb_to_hsl (r1, g1, b1, &h, &s, &l);
  1012.       if (wvals.redmode)
  1013.     h = 0.5*(1.0+sin(((2*h-1.0)*wvals.redfrequency+wvals.redangle/180.0)*G_PI));
  1014.       if (wvals.greenmode)
  1015.     s = 0.5*(1.0+sin(((2*s-1.0)*wvals.greenfrequency+wvals.greenangle/180.0)*G_PI));
  1016.       if (wvals.bluemode)
  1017.     l = 0.5*(1.0+sin(((2*l-1.0)*wvals.bluefrequency+wvals.blueangle/180.0)*G_PI));
  1018.       hsl_to_rgb (h, s, l, &r1, &g1, &b1);
  1019.       red = (gint) (255.0 * r1 + 0.5);
  1020.       green = (gint) (255.0 * g1 + 0.5);
  1021.       blue = (gint) (255.0 * b1 + 0.5);
  1022.     }
  1023.   else if (wvals.colormodel == RGB_MODEL)
  1024.     {
  1025.       if (wvals.redmode)
  1026.     red = (int) (127.5*(1.0+sin(((red/127.5-1.0)*wvals.redfrequency+wvals.redangle/180.0)*G_PI))+0.5);
  1027.       if (wvals.greenmode)
  1028.     green = (int) (127.5*(1.0+sin(((green/127.5-1.0)*wvals.greenfrequency+wvals.greenangle/180.0)*G_PI))+0.5);
  1029.       if (wvals.bluemode)
  1030.     blue = (int) (127.5*(1.0+sin(((blue/127.5-1.0)*wvals.bluefrequency+wvals.blueangle/180.0)*G_PI))+0.5);
  1031.     }
  1032.    
  1033.   *r = red;
  1034.   *g = green;
  1035.   *b = blue;
  1036. }
  1037.  
  1038. static void
  1039. run (char       *name,
  1040.      int         nparams,
  1041.      GimpParam  *param,
  1042.      int        *nreturn_vals,
  1043.      GimpParam **return_vals)
  1044. {
  1045.   static GimpParam values[1];
  1046.   GimpRunModeType run_mode;
  1047.   double          xhsiz, yhsiz;
  1048.   int         pwidth, pheight;
  1049.   GimpPDBStatusType status = GIMP_PDB_SUCCESS;
  1050.  
  1051.   INIT_I18N_UI ();
  1052.  
  1053.   run_mode = param[0].data.d_int32;
  1054.  
  1055.   values[0].type = GIMP_PDB_STATUS;
  1056.   values[0].data.d_status = status;
  1057.  
  1058.   *nreturn_vals = 1;
  1059.   *return_vals = values;
  1060.  
  1061.   /*  Get the specified drawable  */
  1062.   drawable = gimp_drawable_get (param[2].data.d_drawable);
  1063.   /* image_ID = param[1].data.d_image; */
  1064.   tile_width  = gimp_tile_width();
  1065.   tile_height = gimp_tile_height();
  1066.  
  1067.   img_width  = gimp_drawable_width(drawable->id);
  1068.   img_height = gimp_drawable_height(drawable->id);
  1069.   img_bpp    = gimp_drawable_bpp(drawable->id);
  1070.  
  1071.   gimp_drawable_mask_bounds(drawable->id, &sel_x1, &sel_y1, &sel_x2, &sel_y2);
  1072.  
  1073.   sel_width  = sel_x2 - sel_x1;
  1074.   sel_height = sel_y2 - sel_y1;
  1075.  
  1076.   cen_x = (double) (sel_x2 - 1 + sel_x1) / 2.0;
  1077.   cen_y = (double) (sel_y2 - 1 + sel_y1) / 2.0;
  1078.  
  1079.   xhsiz = (double) (sel_width - 1) / 2.0;
  1080.   yhsiz = (double) (sel_height - 1) / 2.0;
  1081.  
  1082.   if (xhsiz < yhsiz)
  1083.     {
  1084.       scale_x = yhsiz / xhsiz;
  1085.       scale_y = 1.0;
  1086.     }
  1087.   else if (xhsiz > yhsiz)
  1088.     {
  1089.       scale_x = 1.0;
  1090.       scale_y = xhsiz / yhsiz;
  1091.     }
  1092.   else
  1093.     {
  1094.       scale_x = 1.0;
  1095.       scale_y = 1.0;
  1096.     }
  1097.  
  1098.   /* Calculate preview size */
  1099.   if (sel_width > sel_height)
  1100.     {
  1101.       pwidth  = MIN(sel_width, PREVIEW_SIZE);
  1102.       pheight = sel_height * pwidth / sel_width;
  1103.     }
  1104.   else
  1105.     {
  1106.       pheight = MIN(sel_height, PREVIEW_SIZE);
  1107.       pwidth  = sel_width * pheight / sel_height;
  1108.     }
  1109.  
  1110.   preview_width  = MAX(pwidth, 2);  /* Min size is 2 */
  1111.   preview_height = MAX(pheight, 2);
  1112.  
  1113.   /* See how we will run */
  1114.   switch (run_mode)
  1115.     {
  1116.     case GIMP_RUN_INTERACTIVE:
  1117.       /* Possibly retrieve data */
  1118.       gimp_get_data("plug_in_alienmap2", &wvals);
  1119.  
  1120.       /* Get information from the dialog */
  1121.       if (!alienmap2_dialog())
  1122.     return;
  1123.  
  1124.       break;
  1125.  
  1126.     case GIMP_RUN_NONINTERACTIVE:
  1127.       /* Make sure all the arguments are present */
  1128.       if (nparams != 13)
  1129.     status = GIMP_PDB_CALLING_ERROR;
  1130.  
  1131.       if (status == GIMP_PDB_SUCCESS)
  1132.     {
  1133.       wvals.redfrequency   = param[3].data.d_float;
  1134.       wvals.redangle       = param[4].data.d_float;
  1135.       wvals.greenfrequency = param[5].data.d_float;
  1136.       wvals.greenangle     = param[6].data.d_float;
  1137.       wvals.bluefrequency  = param[7].data.d_float;
  1138.       wvals.blueangle      = param[8].data.d_float;
  1139.       wvals.colormodel     = param[9].data.d_int8;
  1140.       wvals.redmode        = param[10].data.d_int8 ? TRUE : FALSE;
  1141.       wvals.greenmode      = param[11].data.d_int8 ? TRUE : FALSE;
  1142.       wvals.bluemode       = param[12].data.d_int8 ? TRUE : FALSE;
  1143.     }
  1144.  
  1145.       break;
  1146.  
  1147.     case GIMP_RUN_WITH_LAST_VALS:
  1148.       /* Possibly retrieve data */
  1149.       gimp_get_data("plug_in_alienmap2", &wvals);
  1150.       break;
  1151.  
  1152.     default:
  1153.       break;
  1154.     }
  1155.  
  1156.   if (status == GIMP_PDB_SUCCESS)
  1157.     {
  1158.       /*  Make sure that the drawable is indexed or RGB_MODEL color  */
  1159.       if (gimp_drawable_is_rgb (drawable->id))
  1160.         {
  1161.           gimp_progress_init (_("AlienMap2: Transforming..."));
  1162.  
  1163.       /* Set the tile cache size */
  1164.       gimp_tile_cache_ntiles(2*(drawable->width / gimp_tile_width()+1));
  1165.  
  1166.       /* Run! */
  1167.  
  1168.       /* gimp_tile_cache_ntiles (2 * (drawable->width / gimp_tile_width()+1));*/
  1169.           alienmap2 (drawable);
  1170.       if (run_mode != GIMP_RUN_NONINTERACTIVE)
  1171.         gimp_displays_flush();
  1172.  
  1173.       /* Store data */
  1174.       if (run_mode == GIMP_RUN_INTERACTIVE)
  1175.         gimp_set_data("plug_in_alienmap2", &wvals, sizeof(alienmap2_vals_t));
  1176.         }
  1177.       else
  1178.         {
  1179.       /* gimp_message("This filter only applies on RGB_MODEL-images"); */
  1180.           status = GIMP_PDB_EXECUTION_ERROR;
  1181.         }
  1182.     }
  1183.  
  1184.   values[0].data.d_status = status;
  1185.  
  1186.   gimp_drawable_detach (drawable);
  1187. }
  1188.  
  1189. static void
  1190. alienmap2_get_pixel (int     x,
  1191.              int     y,
  1192.              guchar *pixel)
  1193. {
  1194.   static gint row  = -1;
  1195.   static gint col  = -1;
  1196.  
  1197.   gint    newcol, newrow;
  1198.   gint    newcoloff, newrowoff;
  1199.   guchar *p;
  1200.   int     i;
  1201.  
  1202.   if ((x < 0) || (x >= img_width) || (y < 0) || (y >= img_height))
  1203.     {
  1204.       pixel[0] = 0;
  1205.       pixel[1] = 0;
  1206.       pixel[2] = 0;
  1207.       pixel[3] = 0;
  1208.  
  1209.       return;
  1210.     }
  1211.  
  1212.   newcol    = x / tile_width; /* The compiler should optimize this */
  1213.   newcoloff = x % tile_width;
  1214.   newrow    = y / tile_height;
  1215.   newrowoff = y % tile_height;
  1216.  
  1217.   if ((col != newcol) || (row != newrow) || (the_tile == NULL))
  1218.     {
  1219.       if (the_tile != NULL)
  1220.     gimp_tile_unref(the_tile, FALSE);
  1221.  
  1222.       the_tile = gimp_drawable_get_tile(drawable, FALSE, newrow, newcol);
  1223.       gimp_tile_ref(the_tile);
  1224.       col = newcol;
  1225.       row = newrow;
  1226.     }
  1227.   p = the_tile->data + the_tile->bpp * (the_tile->ewidth * newrowoff + newcoloff);
  1228.   for (i = img_bpp; i; i--)
  1229.     *pixel++ = *p++;
  1230. }
  1231.  
  1232. static void
  1233. alienmap2_render_row (const guchar *src_row,
  1234.               guchar       *dest_row,
  1235.               gint          row,
  1236.               gint          row_width,
  1237.               gint          bytes)
  1238. {
  1239.   gint col, bytenum;
  1240.  
  1241.   for (col = 0; col < row_width ; col++)
  1242.     {
  1243.       short int v1, v2, v3;
  1244.  
  1245.       v1 = (short int)src_row[col*bytes];
  1246.       v2 = (short int)src_row[col*bytes +1];
  1247.       v3 = (short int)src_row[col*bytes +2];
  1248.  
  1249.       transform(&v1, &v2, &v3);
  1250.  
  1251.       dest_row[col*bytes] = (int)v1;
  1252.       dest_row[col*bytes +1] = (int)v2;
  1253.       dest_row[col*bytes +2] = (int)v3;
  1254.  
  1255.       if (bytes>3)
  1256.         for (bytenum = 3; bytenum<bytes; bytenum++)
  1257.           {
  1258.             dest_row[col*bytes+bytenum] = src_row[col*bytes+bytenum];
  1259.           }
  1260.     }
  1261. }
  1262.  
  1263. static void
  1264. alienmap2 (GimpDrawable *drawable)
  1265. {
  1266.   GimpPixelRgn srcPR, destPR;
  1267.   gint width, height;
  1268.   gint bytes;
  1269.   guchar *src_row;
  1270.   guchar *dest_row;
  1271.   gint row;
  1272.   gint x1, y1, x2, y2;
  1273.  
  1274.   /* Get the input area. This is the bounding box of the selection in
  1275.    *  the image (or the entire image if there is no selection). Only
  1276.    *  operating on the input area is simply an optimization. It doesn't
  1277.    *  need to be done for correct operation. (It simply makes it go
  1278.    *  faster, since fewer pixels need to be operated on).
  1279.    */
  1280.   gimp_drawable_mask_bounds (drawable->id, &x1, &y1, &x2, &y2);
  1281.  
  1282.   /* Get the size of the input image. (This will/must be the same
  1283.    *  as the size of the output image.
  1284.    */
  1285.   width = drawable->width;
  1286.   height = drawable->height;
  1287.   bytes = drawable->bpp;
  1288.  
  1289.   /*  allocate row buffers  */
  1290.   src_row = (guchar *) malloc ((x2 - x1) * bytes);
  1291.   dest_row = (guchar *) malloc ((x2 - x1) * bytes);
  1292.  
  1293.   /*  initialize the pixel regions  */
  1294.   gimp_pixel_rgn_init (&srcPR, drawable, 0, 0, width, height, FALSE, FALSE);
  1295.   gimp_pixel_rgn_init (&destPR, drawable, 0, 0, width, height, TRUE, TRUE);
  1296.  
  1297.   for (row = y1; row < y2; row++)
  1298.     {
  1299.       gimp_pixel_rgn_get_row (&srcPR, src_row, x1, row, (x2 - x1));
  1300.  
  1301.       alienmap2_render_row (src_row,
  1302.                 dest_row,
  1303.                 row,
  1304.                 (x2 - x1),
  1305.                 bytes);
  1306.  
  1307.       /*  store the dest  */
  1308.       gimp_pixel_rgn_set_row (&destPR, dest_row, x1, row, (x2 - x1));
  1309.  
  1310.       if ((row % 10) == 0)
  1311.         gimp_progress_update ((double) row / (double) (y2 - y1));
  1312.     }
  1313.  
  1314.   /*  update the processed region  */
  1315.   gimp_drawable_flush (drawable);
  1316.   gimp_drawable_merge_shadow (drawable->id, TRUE);
  1317.   gimp_drawable_update (drawable->id, x1, y1, (x2 - x1), (y2 - y1));
  1318.  
  1319.   free (src_row);
  1320.   free (dest_row);
  1321. }
  1322.  
  1323. static void
  1324. build_preview_source_image (void)
  1325. {
  1326.   double  left, right, bottom, top;
  1327.   double  px, py;
  1328.   double  dx, dy;
  1329.   int     x, y;
  1330.   guchar *p;
  1331.   guchar  pixel[4];
  1332.  
  1333.   wint.image  = g_malloc(preview_width * preview_height * 3 * sizeof(guchar));
  1334.   wint.wimage = g_malloc(preview_width * preview_height * 3 * sizeof(guchar));
  1335.  
  1336.   left   = sel_x1;
  1337.   right  = sel_x2 - 1;
  1338.   bottom = sel_y2 - 1;
  1339.   top    = sel_y1;
  1340.  
  1341.   dx = (right - left) / (preview_width - 1);
  1342.   dy = (bottom - top) / (preview_height - 1);
  1343.  
  1344.   py = top;
  1345.  
  1346.   p = wint.image;
  1347.  
  1348.   for (y = 0; y < preview_height; y++)
  1349.     {
  1350.       px = left;
  1351.       for (x = 0; x < preview_width; x++)
  1352.     {
  1353.       alienmap2_get_pixel((int) px, (int) py, pixel);
  1354.  
  1355.       *p++ = pixel[0];
  1356.       *p++ = pixel[1];
  1357.       *p++ = pixel[2];
  1358.  
  1359.       px += dx;
  1360.     }
  1361.  
  1362.       py += dy;
  1363.     }
  1364. }
  1365.  
  1366. static gint
  1367. alienmap2_dialog (void)
  1368. {
  1369.   GtkWidget *dialog;
  1370.   GtkWidget *top_table;
  1371.   GtkWidget *frame;
  1372.   GtkWidget *toggle;
  1373.   GtkWidget *toggle_vbox;
  1374.   GtkWidget *sep;
  1375.   GtkWidget *table;
  1376.   GtkObject *adj;
  1377.  
  1378.   gimp_ui_init ("alienmap2", TRUE);
  1379.  
  1380.   build_preview_source_image ();
  1381.  
  1382.   dialog = maindlg =
  1383.     gimp_dialog_new (_("AlienMap2"), "alienmap2",
  1384.              gimp_standard_help_func, "filters/alienmap2.html",
  1385.              GTK_WIN_POS_MOUSE,
  1386.              FALSE, TRUE, FALSE,
  1387.  
  1388.              _("About"), alienmap2_logo_dialog,
  1389.              NULL, NULL, NULL, FALSE, FALSE,
  1390.              _("OK"), dialog_ok_callback,
  1391.              NULL, NULL, NULL, TRUE, FALSE,
  1392.              _("Cancel"), gtk_widget_destroy,
  1393.              NULL, 1, NULL, FALSE, TRUE,
  1394.  
  1395.              NULL);
  1396.  
  1397.   gtk_signal_connect (GTK_OBJECT (dialog), "destroy",
  1398.               GTK_SIGNAL_FUNC (gtk_main_quit),
  1399.               NULL);
  1400.  
  1401.   top_table = gtk_table_new (2, 2, FALSE);
  1402.   gtk_table_set_col_spacings (GTK_TABLE (top_table), 4);
  1403.   gtk_table_set_row_spacings (GTK_TABLE (top_table), 4);
  1404.   gtk_container_set_border_width (GTK_CONTAINER (top_table), 6);
  1405.   gtk_table_set_row_spacings (GTK_TABLE (top_table), 4);
  1406.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), top_table,
  1407.               FALSE, FALSE, 0);
  1408.   gtk_widget_show (top_table);
  1409.  
  1410.   gimp_help_init ();
  1411.  
  1412.   /* Preview */
  1413.   frame = gtk_frame_new (NULL);
  1414.   gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
  1415.   gtk_table_attach (GTK_TABLE (top_table), frame, 0, 1, 0, 1, 0, 0, 0, 0);
  1416.   gtk_widget_show (frame);
  1417.  
  1418.   wint.preview = gtk_preview_new (GTK_PREVIEW_COLOR);
  1419.   gtk_preview_size (GTK_PREVIEW (wint.preview), preview_width, preview_height);
  1420.   gtk_container_add (GTK_CONTAINER (frame), wint.preview);
  1421.   gtk_widget_show (wint.preview);
  1422.  
  1423.   /* Controls */
  1424.   table = gtk_table_new (6, 3, FALSE);
  1425.   gtk_table_set_col_spacings (GTK_TABLE (table), 4);
  1426.   gtk_table_set_row_spacings (GTK_TABLE (table), 2);
  1427.   gtk_table_attach (GTK_TABLE (top_table), table, 0, 2, 1, 2,
  1428.             GTK_EXPAND | GTK_FILL, 0, 0, 0);
  1429.   gtk_widget_show (table);
  1430.  
  1431.   adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 0,
  1432.                   _("R/H-Frequency:"), SCALE_WIDTH, 0,
  1433.                   wvals.redfrequency, 0, 5.0, 0.1, 1, 2,
  1434.                   TRUE, 0, 0,
  1435.                   _("Change frequency of the red/hue channel"),
  1436.                   NULL);
  1437.   gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
  1438.               GTK_SIGNAL_FUNC (dialog_scale_update),
  1439.               &wvals.redfrequency);
  1440.  
  1441.   adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 1,
  1442.                   _("R/H-Phaseshift:"), SCALE_WIDTH, 0,
  1443.                   wvals.redangle, 0, 360.0, 1, 15, 2,
  1444.                   TRUE, 0, 0,
  1445.                   _("Change angle of the red/hue channel"),
  1446.                   NULL);
  1447.   gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
  1448.               GTK_SIGNAL_FUNC (dialog_scale_update),
  1449.               &wvals.redangle);
  1450.  
  1451.   adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 2,
  1452.                   _("G/S-Frequency:"), SCALE_WIDTH, 0,
  1453.                   wvals.greenfrequency, 0, 5.0, 0.1, 1, 2,
  1454.                   TRUE, 0, 0,
  1455.                   _("Change frequency of the green/saturation "
  1456.                 "channel"), NULL);
  1457.   gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
  1458.               GTK_SIGNAL_FUNC (dialog_scale_update),
  1459.               &wvals.greenfrequency);
  1460.  
  1461.   adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 3,
  1462.                   _("G/S-Phaseshift:"), SCALE_WIDTH, 0,
  1463.                   wvals.redangle, 0, 360.0, 1, 15, 2,
  1464.                   TRUE, 0, 0,
  1465.                   _("Change angle of the green/saturation channel"),
  1466.                   NULL);
  1467.   gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
  1468.               GTK_SIGNAL_FUNC (dialog_scale_update),
  1469.               &wvals.greenangle);
  1470.  
  1471.   adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 4,
  1472.                   _("B/L-Frequency:"), SCALE_WIDTH, 0,
  1473.                   wvals.bluefrequency, 0, 5.0, 0.1, 1, 2,
  1474.                   TRUE, 0, 0,
  1475.                   _("Change frequency of the blue/luminance "
  1476.                 "channel"), NULL);
  1477.   gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
  1478.               GTK_SIGNAL_FUNC (dialog_scale_update),
  1479.               &wvals.bluefrequency);
  1480.  
  1481.   adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 5,
  1482.                   _("B/L-Phaseshift:"), SCALE_WIDTH, 0,
  1483.                   wvals.blueangle, 0, 360.0, 1, 15, 2,
  1484.                   TRUE, 0, 0,
  1485.                   _("Change angle of the blue/luminance channel"),
  1486.                   NULL);
  1487.   gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
  1488.               GTK_SIGNAL_FUNC (dialog_scale_update),
  1489.               &wvals.blueangle);
  1490.  
  1491.   /*  Mode toggle box  */
  1492.   frame =
  1493.     gimp_radio_group_new2 (TRUE, _("Mode"),
  1494.                alienmap2_radio_update,
  1495.                &wvals.colormodel, (gpointer) wvals.colormodel,
  1496.  
  1497.                _("RGB Color Model"), (gpointer) RGB_MODEL, NULL,
  1498.                _("HSL Color Model"), (gpointer) HSL_MODEL, NULL,
  1499.  
  1500.                NULL);
  1501.   gtk_table_attach (GTK_TABLE (top_table), frame, 1, 2, 0, 1,
  1502.             GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0);
  1503.  
  1504.   toggle_vbox = GTK_BIN (frame)->child;
  1505.  
  1506.   sep = gtk_hseparator_new ();
  1507.   gtk_box_pack_start (GTK_BOX (toggle_vbox), sep, FALSE, FALSE, 0);
  1508.   gtk_widget_show (sep);
  1509.  
  1510.   toggle = gtk_check_button_new_with_label (_("Modify Red/Hue Channel"));
  1511.   gtk_box_pack_start (GTK_BOX (toggle_vbox), toggle, FALSE, FALSE, 0);
  1512.   gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
  1513.               GTK_SIGNAL_FUNC (alienmap2_toggle_update),
  1514.               &wvals.redmode);
  1515.   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), wvals.redmode);
  1516.   gtk_widget_show (toggle);
  1517.   gimp_help_set_help_data (toggle, _("Use function for red/hue component"),
  1518.                NULL);
  1519.  
  1520.   toggle = gtk_check_button_new_with_label (_("Modify Green/Saturation Channel"));
  1521.   gtk_box_pack_start (GTK_BOX (toggle_vbox), toggle, FALSE, FALSE, 0);
  1522.   gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
  1523.               GTK_SIGNAL_FUNC (alienmap2_toggle_update),
  1524.               &wvals.greenmode);
  1525.   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), wvals.greenmode);
  1526.   gtk_widget_show (toggle);
  1527.   gimp_help_set_help_data (toggle,
  1528.                _("Use function for green/saturation component"),
  1529.                NULL);
  1530.  
  1531.   toggle = gtk_check_button_new_with_label (_("Modify Blue/Luminance Channel"));
  1532.   gtk_box_pack_start (GTK_BOX (toggle_vbox), toggle, FALSE, FALSE, 0);
  1533.   gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
  1534.               GTK_SIGNAL_FUNC (alienmap2_toggle_update),
  1535.               &wvals.bluemode);
  1536.   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), wvals.bluemode);
  1537.   gtk_widget_show (toggle);
  1538.   gimp_help_set_help_data (toggle,
  1539.                _("Use function for blue/luminance component"),
  1540.                NULL);
  1541.  
  1542.   gtk_widget_show (frame);
  1543.  
  1544.   gtk_widget_show (dialog);
  1545.   dialog_update_preview ();
  1546.  
  1547.   gtk_main ();
  1548.   gimp_help_free ();
  1549.   gdk_flush ();
  1550.  
  1551.   if (the_tile != NULL)
  1552.     {
  1553.       gimp_tile_unref (the_tile, FALSE);
  1554.       the_tile = NULL;
  1555.     }
  1556.  
  1557.   g_free (wint.image);
  1558.   g_free (wint.wimage);
  1559.  
  1560.   return wint.run;
  1561. }
  1562.  
  1563. static void
  1564. dialog_update_preview (void)
  1565. {
  1566.   double  left, right, bottom, top;
  1567.   double  dx, dy;
  1568.   int  px, py;
  1569.   int     x, y;
  1570.   short int r,g,b;
  1571.   double  scale_x, scale_y;
  1572.   guchar *p_ul, *i, *p;
  1573.  
  1574.   left   = sel_x1;
  1575.   right  = sel_x2 - 1;
  1576.   bottom = sel_y2 - 1;
  1577.   top    = sel_y1;
  1578.   dx = (right - left) / (preview_width - 1);
  1579.   dy = (bottom - top) / (preview_height - 1);
  1580.  
  1581.   scale_x = (double) (preview_width - 1) / (right - left);
  1582.   scale_y = (double) (preview_height - 1) / (bottom - top);
  1583.  
  1584.   py = 0;
  1585.  
  1586.   p_ul = wint.wimage;
  1587.  
  1588.   for (y = 0; y < preview_height; y++)
  1589.     {
  1590.       px = 0;
  1591.  
  1592.       for (x = 0; x < preview_width; x++)
  1593.     {
  1594.       i = wint.image + 3 * (preview_width * py + px);
  1595.       r = *i++;
  1596.       g = *i++;
  1597.       b = *i;
  1598.       transform (&r, &g, &b);
  1599.       p_ul[0] = r;
  1600.       p_ul[1] = g;
  1601.       p_ul[2] = b;
  1602.       p_ul += 3;
  1603.       px += 1; /* dx; */
  1604.     }
  1605.       py +=1; /* dy; */
  1606.     }
  1607.  
  1608.   p = wint.wimage;
  1609.  
  1610.   for (y = 0; y < preview_height; y++)
  1611.     {
  1612.       gtk_preview_draw_row (GTK_PREVIEW (wint.preview), p, 0, y, preview_width);
  1613.       p += preview_width * 3;
  1614.     }
  1615.   gtk_widget_draw (wint.preview, NULL);
  1616.   gdk_flush ();
  1617. }
  1618.  
  1619. static void
  1620. dialog_scale_update (GtkAdjustment *adjustment,
  1621.              gdouble       *value)
  1622. {
  1623.   gimp_double_adjustment_update (adjustment, value);
  1624.  
  1625.   dialog_update_preview();
  1626. }
  1627.  
  1628. static void
  1629. dialog_ok_callback (GtkWidget *widget,
  1630.             gpointer   data)
  1631. {
  1632.   wint.run = TRUE;
  1633.  
  1634.   gtk_widget_destroy (GTK_WIDGET (data));
  1635. }
  1636.  
  1637. static void
  1638. alienmap2_toggle_update (GtkWidget *widget,
  1639.              gpointer   data)
  1640. {
  1641.   gimp_toggle_button_update (widget, data);
  1642.  
  1643.   dialog_update_preview ();
  1644. }
  1645.  
  1646. static void
  1647. alienmap2_radio_update (GtkWidget *widget,
  1648.             gpointer   data)
  1649. {
  1650.   gimp_radio_button_update (widget, data);
  1651.  
  1652.   dialog_update_preview ();
  1653. }
  1654.  
  1655. void
  1656. alienmap2_logo_dialog (void)
  1657. {
  1658.   GtkWidget *xlabel;
  1659.   GtkWidget *xlogo_box;
  1660.   GtkWidget *xpreview;
  1661.   GtkWidget *xframe, *xframe2;
  1662.   GtkWidget *xvbox;
  1663.   GtkWidget *xhbox;
  1664.   gchar  *text;
  1665.   guchar *temp, *temp2;
  1666.   guchar *datapointer;
  1667.   gint    y,x;
  1668.  
  1669.   if (!logodlg)
  1670.     {
  1671.       logodlg = gimp_dialog_new (_("About AlienMap2"), "alienmap2",
  1672.                  gimp_standard_help_func, "filters/alienmap2.html",
  1673.                  GTK_WIN_POS_MOUSE,
  1674.                  FALSE, TRUE, FALSE,
  1675.  
  1676.                  _("OK"), gtk_widget_hide,
  1677.                  NULL, 1, NULL, TRUE, TRUE,
  1678.  
  1679.                  NULL);
  1680.  
  1681.       gtk_signal_connect (GTK_OBJECT (logodlg), "destroy",
  1682.              GTK_SIGNAL_FUNC (gtk_widget_destroyed),
  1683.               &logodlg);
  1684.  
  1685.       gtk_quit_add_destroy (1, GTK_OBJECT (logodlg));
  1686.  
  1687.       xframe = gtk_frame_new(NULL);
  1688.       gtk_frame_set_shadow_type (GTK_FRAME (xframe), GTK_SHADOW_ETCHED_IN);
  1689.       gtk_container_set_border_width (GTK_CONTAINER (xframe), 6);
  1690.       gtk_box_pack_start (GTK_BOX (GTK_DIALOG (logodlg)->vbox), xframe,
  1691.               TRUE, TRUE, 0);
  1692.       xvbox = gtk_vbox_new (FALSE, 4);
  1693.       gtk_container_set_border_width (GTK_CONTAINER (xvbox), 4);
  1694.       gtk_container_add (GTK_CONTAINER(xframe), xvbox);
  1695.       
  1696.       /*  The logo frame & drawing area  */
  1697.       xhbox = gtk_hbox_new (FALSE, 5);
  1698.       gtk_box_pack_start (GTK_BOX (xvbox), xhbox, FALSE, TRUE, 0);
  1699.  
  1700.       xlogo_box = gtk_vbox_new (FALSE, 0);
  1701.       gtk_box_pack_start (GTK_BOX (xhbox), xlogo_box, FALSE, FALSE, 0);
  1702.  
  1703.       xframe2 = gtk_frame_new (NULL);
  1704.       gtk_frame_set_shadow_type (GTK_FRAME (xframe2), GTK_SHADOW_IN);
  1705.       gtk_box_pack_start (GTK_BOX (xlogo_box), xframe2, FALSE, FALSE, 0);
  1706.       
  1707.       xpreview = gtk_preview_new (GTK_PREVIEW_COLOR);
  1708.       gtk_preview_size (GTK_PREVIEW (xpreview), logo_width, logo_height);
  1709.       temp = g_malloc ((logo_width + 10) * 3);
  1710.       datapointer = header_data+logo_width*logo_height-1;
  1711.       for (y = 0; y < logo_height; y++)
  1712.     {
  1713.       temp2=temp;
  1714.       for (x = 0; x< logo_width; x++)
  1715.         {
  1716.           HEADER_PIXEL (datapointer,temp2);
  1717.           temp2 += 3;
  1718.         }
  1719.       gtk_preview_draw_row (GTK_PREVIEW (xpreview),
  1720.                 temp,
  1721.                 0, y, logo_width); 
  1722.     }              
  1723.       g_free (temp);
  1724.       gtk_container_add (GTK_CONTAINER (xframe2), xpreview);
  1725.       gtk_widget_show (xpreview);
  1726.       gtk_widget_show (xframe2);
  1727.       gtk_widget_show (xlogo_box);
  1728.       gtk_widget_show (xhbox);
  1729.  
  1730.       xhbox = gtk_hbox_new(FALSE, 5);
  1731.       gtk_box_pack_start (GTK_BOX (xvbox), xhbox, TRUE, TRUE, 0);
  1732.       text = ("\nMartin Weber\n"
  1733.           "martweb@gmx.net\n"
  1734.           "http://diverse.freepage.de/martin.weber\n\n"
  1735.           "AlienMap2 Plug-In for the GIMP\n"
  1736.           "Version 1.0\n");
  1737.       xlabel = gtk_label_new (text);
  1738.       gtk_box_pack_start (GTK_BOX (xhbox), xlabel, TRUE, FALSE, 0);
  1739.       gtk_widget_show (xlabel);
  1740.  
  1741.       gtk_widget_show (xhbox);
  1742.  
  1743.       gtk_widget_show (xvbox);
  1744.       gtk_widget_show (xframe);
  1745.       gtk_widget_show (logodlg);
  1746.     }
  1747.   else
  1748.     {
  1749.       gtk_widget_show (logodlg);
  1750.       gdk_window_raise (logodlg->window);
  1751.     }
  1752. }
  1753.  
  1754. /*
  1755.  * RGB-HSL transforms.
  1756.  * Ken Fishkin, Pixar Inc., January 1989.
  1757.  */
  1758.  
  1759. /*
  1760.  * given r,g,b on [0 ... 1],
  1761.  * return (h,s,l) on [0 ... 1]
  1762.  */
  1763.  
  1764. static void
  1765. rgb_to_hsl (gdouble  r,
  1766.         gdouble  g,
  1767.         gdouble  b,
  1768.         gdouble *h,
  1769.         gdouble *s,
  1770.         gdouble *l)
  1771. {
  1772.   gdouble v;
  1773.   gdouble m;
  1774.   gdouble vm;
  1775.   gdouble r2, g2, b2;
  1776.  
  1777.   v = MAX(r,g);
  1778.   v = MAX(v,b);
  1779.   m = MIN(r,g);
  1780.   m = MIN(m,b);
  1781.  
  1782.   if ((*l = (m + v) / 2.0) <= 0.0)
  1783.     return;
  1784.   if ((*s = vm = v - m) > 0.0)
  1785.     {
  1786.       *s /= (*l <= 0.5) ? (v + m ) :
  1787.     (2.0 - v - m) ;
  1788.     }
  1789.   else
  1790.     return;
  1791.  
  1792.   r2 = (v - r) / vm;
  1793.   g2 = (v - g) / vm;
  1794.   b2 = (v - b) / vm;
  1795.  
  1796.   if (r == v)
  1797.     *h = (g == m ? 5.0 + b2 : 1.0 - g2);
  1798.   else if (g == v)
  1799.     *h = (b == m ? 1.0 + r2 : 3.0 - b2);
  1800.   else
  1801.     *h = (r == m ? 3.0 + g2 : 5.0 - r2);
  1802.  
  1803.   *h /= 6;
  1804. }
  1805.  
  1806. /*
  1807.  * given h,s,l on [0..1],
  1808.  * return r,g,b on [0..1]
  1809.  */
  1810.  
  1811. static void
  1812. hsl_to_rgb (gdouble  h,
  1813.         gdouble  sl,
  1814.         gdouble  l,
  1815.         gdouble *r,
  1816.         gdouble *g,
  1817.         gdouble *b)
  1818. {
  1819.   gdouble v;
  1820.  
  1821.   v = (l <= 0.5) ? (l * (1.0 + sl)) : (l + sl - l * sl);
  1822.   if (v <= 0)
  1823.     {
  1824.       *r = *g = *b = 0.0;
  1825.     }
  1826.   else
  1827.     {
  1828.       gdouble m;
  1829.       gdouble sv;
  1830.       gint sextant;
  1831.       gdouble fract, vsf, mid1, mid2;
  1832.  
  1833.       m = l + l - v;
  1834.       sv = (v - m ) / v;
  1835.       h *= 6.0;
  1836.       sextant = h;
  1837.       fract = h - sextant;
  1838.       vsf = v * sv * fract;
  1839.       mid1 = m + vsf;
  1840.       mid2 = v - vsf;
  1841.       switch (sextant)
  1842.     {
  1843.     case 0: *r = v; *g = mid1; *b = m; break;
  1844.     case 1: *r = mid2; *g = v; *b = m; break;
  1845.     case 2: *r = m; *g = v; *b = mid1; break;
  1846.     case 3: *r = m; *g = mid2; *b = v; break;
  1847.     case 4: *r = mid1; *g = m; *b = v; break;
  1848.     case 5: *r = v; *g = m; *b = mid2; break;
  1849.     }
  1850.     }
  1851. }
  1852.