summaryrefslogtreecommitdiff
path: root/test/colbrowser.cxx
diff options
context:
space:
mode:
authorMichael R Sweet <michael.r.sweet@gmail.com>1998-10-06 18:21:25 +0000
committerMichael R Sweet <michael.r.sweet@gmail.com>1998-10-06 18:21:25 +0000
commitf9039b2ae21988783feae9b362818e7923e82d14 (patch)
tree6d6fe3679d73448758f9794e7d4d4f6b22a4adad /test/colbrowser.cxx
parent67e89232f9ba067825a158734a09e0fa21aacbe3 (diff)
Initial revision
git-svn-id: file:///fltk/svn/fltk/trunk@2 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'test/colbrowser.cxx')
-rw-r--r--test/colbrowser.cxx316
1 files changed, 316 insertions, 0 deletions
diff --git a/test/colbrowser.cxx b/test/colbrowser.cxx
new file mode 100644
index 000000000..8ee56d3ee
--- /dev/null
+++ b/test/colbrowser.cxx
@@ -0,0 +1,316 @@
+// This is an XForms program from the 0.86 distribution of XForms.
+// It has been modified as little as possible to work under fltk by
+// using fltk's Forms emulation.
+// Search for "fltk" to find all the changes
+
+#include <FL/forms.H> // changed for fltk
+#include <stdlib.h>
+#include <stdio.h> // added for fltk
+#include <string.h> // added for fltk
+
+#define MAX_RGB 3000
+
+static FL_FORM *cl;
+static Fl_Widget *rescol, *dbobj, *colbr, *rs, *gs, *bs;
+char dbname[FL_PATH_MAX];
+static void create_form_cl(void);
+static int load_browser(char *);
+
+/* the RGB data file does not have a standard location on unix. */
+
+#ifdef __VMS
+ static char *rgbfile = "SYS$MANAGER:DECW$RGB.DAT";
+#else
+#ifdef __EMX__ /* OS2 */
+ static char *rgbfile = "/XFree86/lib/X11/rgb.txt";
+#else
+#ifdef __FreeBSD__
+ static char *rgbfile = "/usr/X11R6/lib/X11/rgb.txt";
+#else
+ static char *rgbfile = "/usr/lib/X11/rgb.txt";
+#endif
+#endif
+#endif
+
+typedef struct { int r, g, b; } RGBdb;
+
+static RGBdb rgbdb[MAX_RGB];
+
+int
+main(int argc, char *argv[])
+{
+
+ fl_initialize(&argc, argv, "FormDemo", 0, 0);
+
+ create_form_cl();
+ strcpy(dbname, rgbfile);
+
+ if (load_browser(dbname))
+ fl_set_object_label(dbobj, dbname);
+ else
+ fl_set_object_label(dbobj, "None");
+
+// fl_set_form_minsize(cl, cl->w , cl->h); // removed for fltk
+// fl_set_form_maxsize(cl, 2*cl->w , 2*cl->h); // removed for fltk
+ cl->size_range(cl->w(),cl->h(),2*cl->w(),2*cl->h()); // added for fltk
+ // border changed from FL_TRANSIENT for fltk:
+ // This is so Esc & the close box will close the window.
+ // (on transient windows attempting to close it just calls the callback)
+ fl_show_form(cl, FL_PLACE_FREE, 1/*FL_TRANSIENT*/, "RGB Browser");
+
+
+ while (fl_do_forms())
+ ;
+ return 0;
+}
+
+static void
+set_entry(int i)
+{
+ RGBdb *db = rgbdb + i;
+
+ fl_freeze_form(cl);
+// unclear why demo is doing this. This messes up FL:
+// fl_mapcolor(FL_FREE_COL4+i, db->r, db->g, db->b);
+ fl_mapcolor(FL_FREE_COL4, db->r, db->g, db->b);
+ fl_set_slider_value(rs, db->r);
+ fl_set_slider_value(gs, db->g);
+ fl_set_slider_value(bs, db->b);
+ fl_redraw_object(rescol);
+ fl_unfreeze_form(cl);
+}
+
+static void
+br_cb(Fl_Widget * ob, long)
+{
+ int r = fl_get_browser(ob);
+
+ if (r <= 0)
+ return;
+ set_entry(r - 1);
+}
+
+static int
+read_entry(FILE * fp, int *r, int *g, int *b, char *name)
+{
+ int n;
+ char buf[512], *p;
+
+ if (!fgets(buf, sizeof(buf) - 1, fp))
+ return 0;
+
+ if(buf[0] == '!')
+ fgets(buf,sizeof(buf)-1,fp);
+
+ if(sscanf(buf, " %d %d %d %n", r, g, b, &n) < 3)
+ return 0;
+
+ p = buf + n;
+
+ /* squeeze out all spaces */
+ while (*p)
+ {
+ if (*p != ' ' && *p != '\n')
+ *name++ = *p;
+ p++;
+ }
+ *name = 0;
+
+ return (feof(fp) || ferror(fp)) ? 0 : 1;
+}
+
+
+static int
+load_browser(char *fname)
+{
+ FILE *fp;
+ RGBdb *db = rgbdb, *dbs = db + MAX_RGB;
+ int r, g, b, lr = -1 , lg = -1, lb = -1;
+ char name[256], buf[256];
+#ifdef __EMX__
+ extern char *__XOS2RedirRoot(const char*);
+ if (!(fp = fopen(__XOS2RedirRoot(fname), "r")))
+#else
+ if (!(fp = fopen(fname, "r")))
+#endif
+ {
+ fl_show_alert("Load", fname, "Can't open", 0);
+ return 0;
+ }
+
+ /* read the items */
+
+ fl_freeze_form(cl);
+
+ for (; db < dbs && read_entry(fp, &r, &g, &b, name);)
+ {
+ db->r = r;
+ db->g = g;
+ db->b = b;
+
+ /* unique the entries on the fly */
+ if (lr != r || lg != g || lb != b)
+ {
+ db++;
+ lr = r;
+ lg = g;
+ lb = b;
+ sprintf(buf, "(%3d %3d %3d) %s", r, g, b, name);
+ fl_addto_browser(colbr, buf);
+ }
+ }
+ fclose(fp);
+
+ if (db < dbs)
+ db->r = 1000; /* sentinel */
+ else
+ {
+ db--;
+ db->r = 1000;
+ }
+
+ fl_set_browser_topline(colbr, 1);
+ fl_select_browser_line(colbr, 1);
+ set_entry(0);
+ fl_unfreeze_form(cl);
+ return 1;
+}
+
+static int
+search_entry(int r, int g, int b)
+{
+ register RGBdb *db = rgbdb;
+ int i, j, diffr, diffg, diffb;
+ unsigned int diff, mindiff;
+
+ mindiff = ~0;
+ for (i = j = 0; db->r < 256; db++, i++)
+ {
+ diffr = r - db->r;
+ diffg = g - db->g;
+ diffb = b - db->b;
+
+#ifdef FL_LINEAR
+ diff = unsigned(3.0 * (FL_abs(r - db->r)) +
+ (5.9 * FL_abs(g - db->g)) +
+ (1.1 * (FL_abs(b - db->b)));
+#else
+ diff = unsigned(3.0 * (diffr *diffr) +
+ 5.9 * (diffg *diffg) +
+ 1.1 * (diffb *diffb));
+#endif
+
+ if (mindiff > diff)
+ {
+ mindiff = diff;
+ j = i;
+ }
+ }
+
+ return j;
+}
+
+static void
+search_rgb(Fl_Widget *, long)
+{
+ int r, g, b, i;
+ int top = fl_get_browser_topline(colbr);
+
+ r = int(fl_get_slider_value(rs));
+ g = int(fl_get_slider_value(gs));
+ b = int(fl_get_slider_value(bs));
+
+ fl_freeze_form(cl);
+ fl_mapcolor(FL_FREE_COL4, r, g, b);
+ fl_redraw_object(rescol);
+ i = search_entry(r, g, b);
+ /* change topline only if necessary */
+ if(i < top || i > (top+15))
+ fl_set_browser_topline(colbr, i-8);
+ fl_select_browser_line(colbr, i + 1);
+ fl_unfreeze_form(cl);
+}
+
+/* change database */
+static void
+db_cb(Fl_Widget * ob, long)
+{
+ const char *p = fl_show_input("Enter New Database Name", dbname);
+ char buf[512];
+
+ if (!p || strcmp(p, dbname) == 0)
+ return;
+
+ strcpy(buf, p);
+ if (load_browser(buf))
+ strcpy(dbname, buf);
+ else
+ fl_set_object_label(ob, dbname);
+}
+
+static void
+done_cb(Fl_Widget *, long)
+{
+ exit(0);
+}
+
+static void
+create_form_cl(void)
+{
+ Fl_Widget *obj;
+
+ if (cl)
+ return;
+
+ cl = fl_bgn_form(FL_NO_BOX, 330, 385);
+ obj = fl_add_box(FL_UP_BOX, 0, 0, 330, 385, "");
+ fl_set_object_color(obj, FL_INDIANRED, FL_COL1);
+
+ obj = fl_add_box(FL_NO_BOX, 40, 10, 250, 30, "Color Browser");
+ fl_set_object_lcol(obj, FL_RED);
+ fl_set_object_lsize(obj, FL_HUGE_SIZE);
+ fl_set_object_lstyle(obj, FL_BOLD_STYLE + FL_SHADOW_STYLE);
+
+ dbobj = obj = fl_add_button(FL_NORMAL_BUTTON, 40, 50, 250, 25, "");
+ fl_set_object_boxtype(obj, FL_BORDER_BOX);
+ fl_set_object_color(obj, /*fl_get_visual_depth()==1 ? FL_WHITE:*/ FL_INDIANRED,
+ FL_INDIANRED);
+ fl_set_object_callback(obj, db_cb, 0);
+ rs = obj = fl_add_valslider(FL_VERT_FILL_SLIDER, 225, 130, 30, 200, "");
+ fl_set_object_color(obj, FL_INDIANRED, FL_RED);
+ fl_set_slider_bounds(obj, 0, 255);
+ fl_set_slider_precision(obj, 0);
+ fl_set_object_callback(obj, search_rgb, 0);
+ fl_set_slider_return(obj, 0);
+
+ gs = obj = fl_add_valslider(FL_VERT_FILL_SLIDER, 255, 130, 30, 200, "");
+ fl_set_object_color(obj, FL_INDIANRED, FL_GREEN);
+ fl_set_slider_bounds(obj, 0, 255);
+ fl_set_slider_precision(obj, 0);
+ fl_set_object_callback(obj, search_rgb, 1);
+ fl_set_slider_return(obj, 0);
+
+ bs = obj = fl_add_valslider(FL_VERT_FILL_SLIDER, 285, 130, 30, 200, "");
+ fl_set_object_color(obj, FL_INDIANRED, FL_BLUE);
+ fl_set_slider_bounds(obj, 0, 255);
+ fl_set_slider_precision(obj, 0);
+ fl_set_object_callback(obj, search_rgb, 2);
+ fl_set_slider_return(obj, 0);
+
+
+ colbr = obj = fl_add_browser(FL_HOLD_BROWSER, 10, 90, 205, 240, "");
+ fl_set_browser_fontstyle(obj, FL_FIXED_STYLE);
+ fl_set_object_callback(obj, br_cb, 0);
+
+
+ obj = fl_add_button(FL_NORMAL_BUTTON, 135, 345, 80, 30, "Done");
+ fl_set_object_callback(obj, done_cb, 0);
+
+ rescol = obj = fl_add_box(FL_FLAT_BOX, 225, 90, 90, 35, "");
+ fl_set_object_color(obj, FL_FREE_COL4, FL_FREE_COL4);
+ fl_set_object_boxtype(obj, FL_BORDER_BOX);
+
+
+ fl_end_form();
+ fl_scale_form(cl, 1.1, 1.0);
+}