📄 colbrowser.cxx
字号:
//// "$Id: colbrowser.cxx,v 1.1.1.1 2003/08/07 21:18:42 jasonk Exp $"//// Forms test program for the Fast Light Tool Kit (FLTK).//// 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//// Copyright 1998-1999 by Bill Spitzak and others.//// This library is free software; you can redistribute it and/or// modify it under the terms of the GNU Library General Public// License as published by the Free Software Foundation; either// version 2 of the License, or (at your option) any later version.//// This library is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU// Library General Public License for more details.//// You should have received a copy of the GNU Library General Public// License along with this library; if not, write to the Free Software// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307// USA.//// Please report all bugs and problems to "fltk-bugs@easysw.com".//#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 3000static 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#endiftypedef struct { int r, g, b; } RGBdb;static RGBdb rgbdb[MAX_RGB];intmain(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 voidset_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 voidbr_cb(Fl_Widget * ob, long){ int r = fl_get_browser(ob); if (r <= 0) return; set_entry(r - 1);}static intread_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 intload_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__ 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 intsearch_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 voidsearch_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 voiddb_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 voiddone_cb(Fl_Widget *, long){ exit(0);}static voidcreate_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);}//// End of "$Id: colbrowser.cxx,v 1.1.1.1 2003/08/07 21:18:42 jasonk Exp $".//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -