PageRenderTime 57ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/xforms-1.0.94pre12/demos/colbrowser.c

#
C | 449 lines | 299 code | 92 blank | 58 comment | 35 complexity | 74109f11c67424bd95ad6fbe4bc8e9d5 MD5 | raw file
Possible License(s): LGPL-2.1
  1. /*
  2. * This file is part of XForms.
  3. *
  4. * XForms is free software; you can redistribute it and/or modify it
  5. * under the terms of the GNU Lesser General Public License as
  6. * published by the Free Software Foundation; either version 2.1, or
  7. * (at your option) any later version.
  8. *
  9. * XForms is distributed in the hope that it will be useful, but
  10. * WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * Lesser General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Lesser General Public
  15. * License along with XForms; see the file COPYING. If not, write to
  16. * the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
  17. * MA 02111-1307, USA.
  18. */
  19. /*
  20. * Test browser/slider and color handling. Select a colorname,
  21. * the program will show the color. Change the sliders, the
  22. * program will pick a colorname that has the closest color.
  23. *
  24. * This file is part of xforms package.
  25. * T.C. Zhao and M. Overmars (1997)
  26. */
  27. #ifdef HAVE_CONFIG_H
  28. #include <config.h>
  29. #endif
  30. #include "include/forms.h"
  31. #include <stdlib.h>
  32. #define MAX_RGB 3000
  33. static FL_FORM *cl;
  34. static FL_OBJECT *rescol,
  35. *dbobj,
  36. *colbr,
  37. *rs,
  38. *gs,
  39. *bs;
  40. char dbname[ FL_PATH_MAX ] ;
  41. static void create_form_cl( void );
  42. static int load_browser( const char * );
  43. /* the RGB data file does not have a standard location on unix. */
  44. #ifdef __VMS
  45. static char *rgbfile = "SYS$MANAGER:DECW$RGB.DAT";
  46. #else
  47. #ifdef __EMX__ /* OS2 */
  48. static char *rgbfile = "/XFree86/lib/X11/rgb.txt";
  49. #else
  50. #include <sys/stat.h>
  51. static char *rgbfile = "/usr/lib/X11/rgb.txt";
  52. static char *rgbfile_2 = "/usr/share/X11/rgb.txt";
  53. #endif
  54. #endif
  55. typedef struct { int r,
  56. g,
  57. b;
  58. } RGBdb;
  59. static RGBdb rgbdb[ MAX_RGB ];
  60. /***************************************
  61. ***************************************/
  62. int
  63. main( int argc,
  64. char * argv[ ] )
  65. {
  66. fl_initialize( &argc, argv, "FormDemo", 0, 0 );
  67. create_form_cl( );
  68. strcpy( dbname, rgbfile );
  69. #if ! defined __EMX__ && ! defined __VMS
  70. {
  71. struct stat buf;
  72. if ( stat( rgbfile, &buf ) == -1 )
  73. strcpy( dbname, rgbfile_2 );
  74. }
  75. #endif
  76. if ( load_browser( dbname ) )
  77. fl_set_object_label( dbobj, dbname );
  78. else
  79. fl_set_object_label( dbobj, "None" );
  80. fl_set_form_minsize( cl, cl->w , cl->h );
  81. fl_set_form_maxsize( cl, 2 * cl->w , 2 * cl->h );
  82. fl_show_form( cl, FL_PLACE_FREE, FL_TRANSIENT, "RGB Browser" );
  83. fl_do_forms( );
  84. return 0;
  85. }
  86. /***************************************
  87. ***************************************/
  88. static void
  89. set_entry( int i )
  90. {
  91. RGBdb *db = rgbdb + i;
  92. fl_freeze_form( cl );
  93. fl_mapcolor( FL_FREE_COL4 + i, db->r, db->g, db->b );
  94. fl_mapcolor( FL_FREE_COL4, db->r, db->g, db->b );
  95. fl_set_slider_value( rs, db->r );
  96. fl_set_slider_value( gs, db->g );
  97. fl_set_slider_value( bs, db->b );
  98. fl_unfreeze_form( cl );
  99. }
  100. /***************************************
  101. ***************************************/
  102. static void
  103. br_cb( FL_OBJECT * ob,
  104. long q FL_UNUSED_ARG )
  105. {
  106. int r = fl_get_browser( ob );
  107. if ( r > 0 )
  108. set_entry( r - 1 );
  109. }
  110. /***************************************
  111. ***************************************/
  112. static int
  113. read_entry( FILE * fp,
  114. int * r,
  115. int * g,
  116. int * b,
  117. char * name )
  118. {
  119. int n;
  120. char buf[ 512 ],
  121. *p;
  122. if ( ! fgets( buf, sizeof buf, fp ) )
  123. return 0;
  124. if ( *buf == '!' )
  125. if ( ! fgets( buf, sizeof buf, fp ) )
  126. return 0;
  127. if ( sscanf( buf, " %d %d %d %n", r, g, b, &n ) != 3 )
  128. return 0;
  129. p = buf + n;
  130. /* Remove all spaces */
  131. while ( *p )
  132. {
  133. if ( * p != ' ' && *p != '\n' )
  134. *name++ = *p;
  135. p++;
  136. }
  137. *name = '\0';
  138. return ! ( feof( fp ) || ferror( fp ) );
  139. }
  140. /***************************************
  141. ***************************************/
  142. static int
  143. load_browser( const char * fname )
  144. {
  145. FILE *fp;
  146. RGBdb *db = rgbdb,
  147. *dbs = db + MAX_RGB;
  148. int r,
  149. g,
  150. b,
  151. lr = -1,
  152. lg = -1,
  153. lb = -1;
  154. char name[ 256 ],
  155. buf[ 256 ];
  156. #ifdef __EMX__
  157. extern char *__XOS2RedirRoot( const char * );
  158. if ( ! ( fp = fopen( __XOS2RedirRoot( fname ), "r" ) ) )
  159. #else
  160. if ( ! ( fp = fopen( fname, "r" ) ) )
  161. #endif
  162. {
  163. fl_show_alert( "Load", fname, "Can't open database file", 0 );
  164. return 0;
  165. }
  166. /* read the items */
  167. fl_freeze_form( cl );
  168. while ( db < dbs && read_entry( fp, &r, &g, &b, name ) )
  169. {
  170. db->r = r;
  171. db->g = g;
  172. db->b = b;
  173. /* unique the entries on the fly */
  174. if ( lr != r || lg != g || lb != b )
  175. {
  176. db++;
  177. lr = r;
  178. lg = g;
  179. lb = b;
  180. sprintf( buf, "(%3d %3d %3d) %s", r, g, b, name );
  181. fl_addto_browser( colbr, buf );
  182. }
  183. }
  184. fclose( fp );
  185. if ( db < dbs )
  186. db->r = 1000; /* sentinel */
  187. else
  188. {
  189. db--;
  190. db->r = 1000;
  191. }
  192. fl_set_browser_topline( colbr, 1 );
  193. fl_select_browser_line( colbr, 1 );
  194. set_entry( 0 );
  195. fl_unfreeze_form( cl );
  196. return 1;
  197. }
  198. /***************************************
  199. ***************************************/
  200. static int
  201. search_entry( int r,
  202. int g,
  203. int b )
  204. {
  205. RGBdb *db = rgbdb;
  206. int i,
  207. j,
  208. diffr,
  209. diffg,
  210. diffb;
  211. unsigned int diff,
  212. mindiff;
  213. mindiff = ~0;
  214. for ( i = j = 0; db->r < 256; db++, i++ )
  215. {
  216. diffr = r - db->r;
  217. diffg = g - db->g;
  218. diffb = b - db->b;
  219. #ifdef FL_LINEAR
  220. diff = ( int ) ( 3.0 * FL_abs( r - db->r ) +
  221. 5.9 * FL_abs( g - db->g ) +
  222. 1.1 * FL_abs(b - db->b ) );
  223. #else
  224. diff = ( int ) ( 3.0 * ( diffr * diffr ) +
  225. 5.9 * ( diffg * diffg ) +
  226. 1.1 * ( diffb * diffb ) );
  227. #endif
  228. if ( mindiff > diff )
  229. {
  230. mindiff = diff;
  231. j = i;
  232. }
  233. }
  234. return j;
  235. }
  236. /***************************************
  237. ***************************************/
  238. static void
  239. search_rgb( FL_OBJECT * ob FL_UNUSED_ARG,
  240. long q FL_UNUSED_ARG )
  241. {
  242. int r,
  243. g,
  244. b,
  245. i;
  246. int top = fl_get_browser_topline( colbr );
  247. r = ( int ) fl_get_slider_value( rs );
  248. g = ( int ) fl_get_slider_value( gs );
  249. b = ( int ) fl_get_slider_value( bs );
  250. fl_freeze_form( cl );
  251. fl_mapcolor( FL_FREE_COL4, r, g, b );
  252. i = search_entry( r, g, b );
  253. /* Change topline only if necessary */
  254. if ( i < top || i > top + 15 )
  255. fl_set_browser_topline( colbr, i - 8 );
  256. fl_select_browser_line( colbr, i + 1 );
  257. fl_unfreeze_form( cl );
  258. }
  259. /***************************************
  260. * change database
  261. ***************************************/
  262. static void
  263. db_cb( FL_OBJECT * ob,
  264. long q FL_UNUSED_ARG )
  265. {
  266. const char *p = fl_show_input( "Enter new database name", dbname );
  267. char buf[ 512 ];
  268. if ( ! p || ! strcmp( p, dbname ) )
  269. return;
  270. strcpy( buf, p );
  271. if ( load_browser( buf ) )
  272. {
  273. strcpy( dbname, buf );
  274. fl_set_object_label( ob, dbname );
  275. }
  276. }
  277. /***************************************
  278. ***************************************/
  279. static void
  280. done_cb( FL_OBJECT * ob FL_UNUSED_ARG,
  281. long q FL_UNUSED_ARG )
  282. {
  283. fl_finish( );
  284. exit( 0 );
  285. }
  286. /***************************************
  287. ***************************************/
  288. static void
  289. create_form_cl( void )
  290. {
  291. FL_OBJECT *obj;
  292. cl = fl_bgn_form( FL_NO_BOX, 330, 385 );
  293. obj = fl_add_box( FL_UP_BOX, 0, 0, 330, 385, "" );
  294. fl_set_object_color( obj, FL_COL1, FL_COL1 );
  295. obj = fl_add_box( FL_NO_BOX, 40, 10, 250, 30, "Color Browser" );
  296. fl_set_object_lcol( obj, FL_RED );
  297. fl_set_object_lsize( obj, FL_HUGE_SIZE );
  298. fl_set_object_lstyle( obj, FL_BOLD_STYLE + FL_SHADOW_STYLE );
  299. fl_set_object_gravity( obj, FL_North, FL_North );
  300. fl_set_object_resize( obj, FL_RESIZE_NONE );
  301. dbobj = obj = fl_add_button( FL_NORMAL_BUTTON, 40, 50, 250, 25, "" );
  302. fl_set_object_boxtype( obj, FL_BORDER_BOX );
  303. fl_set_object_color( obj,
  304. fl_get_visual_depth( )==1 ? FL_WHITE: FL_COL1,
  305. FL_COL1 );
  306. fl_set_object_callback( obj, db_cb, 0 );
  307. fl_set_object_gravity( obj, FL_North, FL_North );
  308. fl_set_object_resize( obj, FL_RESIZE_X );
  309. rescol = obj = fl_add_box( FL_FLAT_BOX, 225, 90, 90, 35, "" );
  310. fl_set_object_color( obj, FL_FREE_COL4, FL_FREE_COL4 );
  311. fl_set_object_boxtype( obj, FL_BORDER_BOX );
  312. fl_set_object_resize( obj, FL_RESIZE_NONE );
  313. fl_set_object_gravity( obj, FL_NorthEast, FL_East );
  314. rs = obj = fl_add_valslider( FL_VERT_FILL_SLIDER, 225, 130, 30, 200, "" );
  315. fl_set_object_color( obj, FL_COL1, FL_RED );
  316. fl_set_slider_bounds( obj, 0, 255 );
  317. fl_set_slider_precision( obj, 0 );
  318. fl_set_object_callback( obj, search_rgb, 0 );
  319. fl_set_slider_return( obj, 0 );
  320. fl_set_object_resize( obj, FL_RESIZE_Y );
  321. fl_set_object_gravity( obj, FL_NorthEast, FL_SouthEast );
  322. fl_set_object_return( obj, FL_RETURN_CHANGED );
  323. gs = obj = fl_add_valslider( FL_VERT_FILL_SLIDER, 255, 130, 30, 200, "" );
  324. fl_set_object_color( obj, FL_COL1, FL_GREEN );
  325. fl_set_slider_bounds( obj, 0, 255 );
  326. fl_set_slider_precision( obj, 0 );
  327. fl_set_object_callback( obj, search_rgb, 1 );
  328. fl_set_slider_return( obj, 0 );
  329. fl_set_object_resize( obj, FL_RESIZE_Y );
  330. fl_set_object_gravity( obj, FL_NorthEast, FL_SouthEast );
  331. fl_set_object_return( obj, FL_RETURN_CHANGED );
  332. bs = obj = fl_add_valslider( FL_VERT_FILL_SLIDER, 285, 130, 30, 200, "" );
  333. fl_set_object_color( obj, FL_COL1, FL_BLUE );
  334. fl_set_slider_bounds( obj, 0, 255 );
  335. fl_set_slider_precision( obj, 0 );
  336. fl_set_object_callback( obj, search_rgb, 2 );
  337. fl_set_slider_return( obj, 0 );
  338. fl_set_object_resize( obj, FL_RESIZE_Y );
  339. fl_set_object_gravity( obj, FL_NorthEast, FL_SouthEast );
  340. fl_set_object_return( obj, FL_RETURN_CHANGED );
  341. colbr = obj = fl_add_browser( FL_HOLD_BROWSER, 10, 90, 205, 240, "" );
  342. fl_set_browser_fontstyle( obj, FL_FIXED_STYLE );
  343. fl_set_object_callback( obj, br_cb, 0 );
  344. fl_set_object_gravity( obj, FL_NorthWest, FL_SouthEast );
  345. obj = fl_add_button( FL_NORMAL_BUTTON, 135, 345, 80, 30, "Done" );
  346. fl_set_object_callback( obj, done_cb, 0 );
  347. fl_set_object_gravity( obj, FL_South, FL_South );
  348. fl_set_object_resize( obj, FL_RESIZE_NONE );
  349. fl_end_form( );
  350. fl_scale_form( cl, 1.1, 1.0 );
  351. }
  352. /*
  353. * Local variables:
  354. * tab-width: 4
  355. * indent-tabs-mode: nil
  356. * End:
  357. */