home *** CD-ROM | disk | FTP | other *** search
- #include "defs.h"
- #include <fcntl.h>
-
- #define DEFAULT_WIN_XSIZE 850
- #define DEFAULT_WIN_YSIZE 1000
- #define MIN_WIN_XSIZE 200
- #define MIN_WIN_YSIZE 200
-
- Frame frame;
- anvas canvas;
- ursor cursor;
- con icon;
- anel panel;
- anel_item window_slider, level_slider;
- ixwin *pw, *fpw;
- ixrect *pr, *dpr, *icon_pr, *backing_pixrect, *mem_create();
-
- tatic short dspicon[] =
- {
- #include "../images/icons/dsp.icon"
- };
- EFINE_ICON_FROM_IMAGE(bwicon, dspicon);
-
- enu canvas_menu;
- tatic void
- etcoords(), window_proc(), level_proc(), canvas_proc(),
- epaint_canvas(), resize_canvas();
-
- har cmsname[BUFSIZ];
- _char red[256], green[256], blue[256];
- har *progname;
- har *filename;
- har *eight_to_one;
- har buf1[BUFSIZ];
- nt window, level;
- nt old_level, old_window;
- nt max_level, min_level;
- nt lower, upper;
- nt table[10000];
- nt winxsize, winysize;
- nt size, wl, colour;
- olormap_t colormap;
- anel_item next_butt, prev_butt;
- tatic void dummy_proc(), canvas_event_proc();
-
- #ifdef STANDALONE
- ain(argc, argv, envp)
- #else
- sp_main(argc, argv, envp)
- #endif
- int argc;
- char **argv;
- char **envp;
- {
- int i;
- int scroll_thickness;
- float calc_mean();
- Pixrect *call_dither();
-
- eight_to_one = NULL;
- progname = strsave(argv[0]);
- parse_profile(&argc, argv, envp);
-
- filename = strsave("stdin");
- while ((gc = getopt(argc, argv, "W:bc8:")) != EOF)
- switch (gc) {
- case '8':
- eight_to_one = strsave(optarg);
- break;
- case '?':
- errflag++;
- break;
- }
-
- if (errflag)
- error((char *) 0, "Usage: %s: [-8 program] [infile]\n", progname);
-
- for (stream = 0; optind < argc; stream++, optind++)
- if (stream == 0 && strcmp(argv[optind], "-") != 0) {
- filename = strsave(argv[optind]);
- if (freopen(argv[optind], mode[stream], f[stream]) == NULL)
- error("%s %s", PR_IO_ERR_INFILE, argv[optind]);
- }
- if (eight_to_one == NULL)
- eight_to_one = strsave(FILTER8TO1);
-
- if ((pr = pr_load(stdin, &colormap)) == NULL)
- error(PR_IO_ERR_RASREAD);
-
- frame = window_create(NULL, FRAME, FRAME_NO_CONFIRM, TRUE, 0);
- canvas = window_create(frame, CANVAS, 0);
- pw = canvas_pixwin(canvas);
- colour = iscolour(pw);
- window_destroy(frame);
-
- if (!colour) {
- if (pr->pr_depth == 8)
- pr = call_dither(pr);
- if (pr->pr_depth > 8)
- error("Input depth not supported on this workstation");
- }
-
- setup_windowsizes();
-
- scroll_thickness = defaults_get_integer("/Scrollbar/Thickness", 14, 0);
- frame = window_create(NULL, FRAME,
- FRAME_LABEL, filename,
- WIN_HEIGHT, winysize + scroll_thickness + 7,
- WIN_WIDTH, winxsize + scroll_thickness + 10,
- FRAME_ARGS, argc, argv,
- 0);
-
- if (colour) {
- setup_colourmap();
- if (colormap.length != 0) {
- if (!mono_override)
- allow_mono(pr);
- }
- }
-
- max_level = calc_max(pr)+1;
- if (pr->pr_depth > 8 && colormap.length == 0) {
- window = MAXLEVEL(8);
- level = (int) calc_mean(pr);
- old_window = max_level;
- old_level = max_level / 2;
- setup_scrollbars();
- }
- cursor = cursor_create(
- CURSOR_OP, PIX_SRC ^ PIX_DST,
- CURSOR_CROSSHAIR_LENGTH, 20,
- CURSOR_SHOW_CROSSHAIRS, TRUE,
- 0);
-
- canvas = window_create(frame, CANVAS,
- WIN_CURSOR, cursor,
- CANVAS_HEIGHT, pr->pr_size.y,
- CANVAS_WIDTH, pr->pr_size.x,
- CANVAS_AUTO_SHRINK, FALSE,
- WIN_EVENT_PROC, canvas_event_proc,
- WIN_CONSUME_PICK_EVENT, LOC_MOVE,
- 0);
-
- if (pr->pr_depth > 8)
- window_set(canvas, WIN_BELOW, panel, WIN_X, 0, 0);
-
- pw = canvas_pixwin(canvas);
-
- window_set(canvas,
- WIN_VERTICAL_SCROLLBAR, scrollbar_create(0),
- WIN_HORIZONTAL_SCROLLBAR, scrollbar_create(0),
- 0);
-
- if (pr->pr_depth <= 8)
- dpr = pr;
- else {
- if ((dpr = mem_create(pr->pr_size.x, pr->pr_size.y, 8)) == NULL)
- error("mem_create returned NULL");
- min_level = 0;
- setup_table();
- convert_to_8bits(pr, dpr);
- }
-
- if (pr->pr_depth == 1 || !colour)
- window_set(frame, FRAME_ICON, &bwicon, 0);
- else {
- icon_pr = mem_create(64, 64, 8);
- paint_icon();
- }
-
- pw_rop(pw, 0, 0, dpr->pr_size.x, pr->pr_size.y, PIX_SRC, dpr, 0, 0);
- window_main_loop(frame);
- }
- aint_icon()
- {
- subsample(dpr, icon_pr);
-
- icon = icon_create(ICON_IMAGE, icon_pr, 0);
- window_set(frame, FRAME_ICON, icon, 0);
- }
- ubsample(in, out)
- Pixrect *in, *out;
- {
- int cvx, cvy, lcx, lcy, hcx, hcy;
- register int i, j, i1, j1;
- int total;
-
- cvx = (100 * in->pr_size.x) / out->pr_size.x;
- cvy = (100 * in->pr_size.y) / out->pr_size.y;
-
- for (j = 0; j < out->pr_size.y; j++)
- for (i = 0; i < out->pr_size.x; i++) {
- hcx = i * cvx / 100;
- hcy = j * cvy / 100;
- lcx = (i - 1) * cvx / 100 + 1;
- lcy = (j - 1) * cvy / 100 + 1;
- lcx = (lcx < 0) ? 0 : (lcx > hcx) ? hcx : lcx;
- lcy = (lcy < 0) ? 0 : (lcy > hcy) ? hcy : lcy;
-
- total = 0;
- for (j1 = lcy; j1 <= hcy; j1++)
- for (i1 = lcx; i1 <= hcx; i1++)
- total += pr_get(in, i1, j1);
- pr_put(out, i, j, (total / ((hcx + 1 - lcx) * (hcy + 1 - lcy))));
- }
- }
- etup_scrollbars()
- {
- setup_font();
-
- panel = window_create(frame, PANEL,
- WIN_WIDTH, WIN_EXTEND_TO_EDGE,
- 0);
-
- window_slider = panel_create_item(panel, PANEL_SLIDER,
- PANEL_ITEM_X, ATTR_COL(0),
- PANEL_ITEM_Y, ATTR_ROW(0),
- PANEL_LABEL_FONT, font,
- PANEL_LABEL_STRING, "Window:",
- PANEL_VALUE, window,
- PANEL_MIN_VALUE, 0,
- PANEL_MAX_VALUE, max_level,
- PANEL_NOTIFY_PROC, window_proc,
- 0);
-
- level_slider = panel_create_item(panel, PANEL_SLIDER,
- PANEL_ITEM_X, ATTR_COL(0),
- PANEL_ITEM_Y, ATTR_ROW(1),
- PANEL_LABEL_FONT, font,
- PANEL_LABEL_STRING, "Level :",
- PANEL_VALUE, level,
- PANEL_MIN_VALUE, 0,
- PANEL_MAX_VALUE, max_level,
- PANEL_NOTIFY_PROC, level_proc,
- 0);
-
- window_fit_height(panel);
- }
-
- tatic void
- indow_proc(item, value, event)
- Panel_item item;
- int value;
- Event *event;
- {
- int ol;
-
- ol = level;
- window = value;
-
- if (level + window / 2 >= max_level)
- level = max_level - window / 2;
- if (level - window / 2 < min_level)
- level = window / 2;
- if (ol != level)
- panel_set(level_slider, PANEL_VALUE, level, 0);
- setup_table();
- convert_to_8bits(pr, dpr);
- pw_rop(pw, 0, 0, dpr->pr_size.x, pr->pr_size.y, PIX_SRC, dpr, 0, 0);
- paint_icon();
- }
-
- tatic void
- evel_proc(item, value, event)
- Panel_item item;
- int value;
- Event *event;
- {
- level = value;
-
- if (level + window / 2 >= max_level)
- level = max_level - window / 2;
- if (level - window / 2 < min_level)
- level = window / 2;
- if (level != value)
- panel_set(level_slider, PANEL_VALUE, level, 0);
- setup_table();
- convert_to_8bits(pr, dpr);
- pw_rop(pw, 0, 0, dpr->pr_size.x, pr->pr_size.y, PIX_SRC, dpr, 0, 0);
- paint_icon();
- }
- /* initialise lookup table for current window & level */
- etup_table()
- {
- register int i;
- register int *t;
- register int new_lower, new_upper;
- int old_lower, old_upper;
- double m, cumulative_greylevel;
-
- if (window != 0)
- m = (253.) / (float) (window); /* 253 = No. greylevels
- * - 1 */
-
- cumulative_greylevel = 1.;
- new_lower = level - window / 2;
- new_upper = level + window / 2;
- old_lower = old_level - old_window / 2;
- old_upper = old_level + old_window / 2;
-
- lower = MIN(old_lower, new_lower);
- upper = MAX(old_upper, new_upper);
-
- lower = 0;
- upper = max_level;
- t = &table[lower];
- for (i = lower; i < upper; i++)
- if (i <= new_lower)
- *t++ = 1;
- else if (i >= new_upper)
- *t++ = 254;
- else {
- *t++ = cumulative_greylevel;
- cumulative_greylevel += m;
- }
- old_level = level;
- old_window = window;
- }
- onvert_to_8bits(in, out)
- Pixrect *in, *out;
- {
- short *ptr16;
- int *ptr32;
- char *ptr8;
- register int i;
- int n;
- int mode = TRUE;
-
- #define ALL_PIXELS TRUE
-
- ptr8 = (char *) mpr_d(out)->md_image;
- n = in->pr_size.x * in->pr_size.x;
-
- switch (in->pr_depth) {
- case 16:
- ptr16 = (short *) mpr_d(in)->md_image;
- for (i = 0; i < n; i++) {
- if ((mode == ALL_PIXELS) || ((*ptr16 >= lower) && (*ptr16 <= upper)))
- *ptr8 = *(table + (*ptr16));
- ptr8++;
- ptr16++;
- }
- break;
- case 32:
- ptr32 = (int *) mpr_d(in)->md_image;
- for (i = 0; i < n; i++) {
- if ((mode == ALL_PIXELS) || ((*ptr32 >= lower) && (*ptr32 <= upper)))
- *ptr8 = *(table + (*ptr32));
- ptr8++;
- ptr16++;
- }
- break;
- }
- }
- etup_windowsizes()
- {
- if (pr->pr_size.x > DEFAULT_WIN_XSIZE)
- winxsize = DEFAULT_WIN_XSIZE;
- else
- winxsize = MAX(pr->pr_size.x, MIN_WIN_XSIZE)+3;
-
- if (pr->pr_size.y > DEFAULT_WIN_YSIZE)
- winysize = DEFAULT_WIN_YSIZE;
- else
- winysize = MAX(pr->pr_size.y, MIN_WIN_YSIZE)+17;
- }
- etup_colourmap()
- {
- register int i;
-
- for (i = 0; i < 256; i++) {
- red[i] = green[i] = blue[i] = -1;
- }
- fpw = (Pixwin *) window_get(frame, WIN_PIXWIN);
-
- if (colormap.type == RMT_NONE || colormap.length == 0) {
- sprintf(cmsname, "greyscale%d", pr->pr_depth);
-
- pw_setcmsname(fpw, cmsname);
-
- for (i = 1; i < 255; i++) {
- red[i] = i;
- green[i] = i;
- blue[i] = i;
- }
- if (mono_override) {
- red[255] = blue[255] = green[255] = 255;
- red[0] = blue[0] = green[0] = 0;
- }
- pw_putcolormap(fpw, 0, 256, red, green, blue);
- } else {
- pw_setcmsname(fpw, "non_greyscale");
- pw_putcolormap(fpw, 0, colormap.length, colormap.map[0], colormap.map[1], colormap.map[2]);
- }
- window_set(frame, FRAME_INHERIT_COLORS, TRUE, 0);
- }
-
- loat
- alc_mean(pr)
- Pixrect *pr;
- {
- register int i, j;
- int sum;
-
- sum = 0;
- for (j = 0; j < pr->pr_size.y; j++)
- for (i = 0; i < pr->pr_size.x; i++)
- sum += pr_get(pr, i, j);
-
- return (sum / (pr->pr_size.x * pr->pr_size.y));
- }
-
- tatic void
- anvas_event_proc(canvas, event, arg)
- Canvas canvas;
- Event *event;
- caddr_t arg;
- {
- char buf[BUFSIZ];
-
- if (event_id(event) == LOC_MOVE || event_is_button(event)) {
- sprintf(buf, "%s - %d, %d = %d", filename, event_x(event), event_y(event), pr_get(pr, event_x(event), event_y(event)));
- window_set(frame, FRAME_LABEL, buf, 0);
- }
- }
- scolour(pw)
- Pixwin *pw;
- {
-
- return ((pw->pw_pixrect->pr_depth > 1) ? TRUE : FALSE);
- }
-
- ixrect *
- all_dither(in)
- Pixrect *in;
- {
- Pixrect *out, *pr_load();
- FILE *fp_tochild;
- FILE *fp_fromchild;
- int childpid;
- int pfdout[2], pfdin[2];
- int c, numfds;
-
- if (pipe(pfdout) == -1 || pipe(pfdin) == -1) {
- perror(progname);
- exit(1);
- }
- switch (childpid = fork()) {
- case -1:
- perror(progname);
- exit(1);
- case 0:
- if (close(0) == -1)
- perror(progname);
- if (dup(pfdout[0]) != 0)
- perror(progname);
- if (close(1) == -1)
- perror(progname);
- if (dup(pfdin[1]) != 1)
- perror(progname);
- if (close(pfdout[0]) == -1 || close(pfdout[1]) == -1 || close(pfdin[0]) == -1 || close(pfdin[1]) == -1)
- perror(progname);
- execlp(eight_to_one, eight_to_one, 0);
- perror(eight_to_one);
- exit(1);
- default:
- if (close(pfdout[0]) == -1 || close(pfdin[1]) == -1)
- perror(progname);
-
- if ((fp_tochild = fdopen(pfdout[1], "w")) == NULL)
- error("Can't get file descriptor to write to child process");
- if (pr_dump(in, fp_tochild, NULL, RT_STANDARD, 0) == PIX_ERR)
- error("pr_dump returned PIX_ERR");
- fclose(fp_tochild);
-
- if ((fp_fromchild = fdopen(pfdin[0], "r")) == NULL)
- error("Can't get file descriptor to read from child process");
- if ((out = pr_load(fp_fromchild, NULL)) == NULL)
- error("pr_load returned NULL");
- fclose(fp_tochild);
- }
- return out;
- }
-
- llow_mono(pr)
- ixrect *pr;
- {
- register int i, j, pix;
-
- for(i=0;i<pr->pr_size.x;i++)
- for(j=0;j<pr->pr_size.y;j++)
- if ((pix = pr_get(pr, i, j)) == 255 || pix == 254)
- pr_put(pr, i, j, 253);
- else if (pix == 0)
- pr_put(pr, i, j, 1);
- }
-