cmed.C 3.68 KiB
#include <stdio.h>
#include <stdlib.h>
#include <GL/gl.h>
#include <string.h>
#include <stdarg.h>
#include <math.h>
#include <ctype.h>
#undef isspace
#include "cmed.H"
struct _cshow cshow;
static int cleanup(char *buf, int room, const char *str) {
char *p;
const char *q;
p = buf;
for(q = str; *q && isspace(*q); q++) ;
for( ; *q && !isspace(*q) && p < &buf[room-1]; q++)
*p++ = *q;
*p = '\0';
return(p > buf);
}
void input_cb( Fl_Input *inp, void * ) {
int nents = cmedit->cment();
if(sscanf(inp->value(), "cments %d", &nents) > 0
|| sscanf(inp->value(), "cment %d", &nents) > 0) {
cmedit->cment( nents );
}
}
void fload_cb( Fl_Button *, void * ) {
FILE *inf;
char fname[256];
fnamebox->position(strlen(fnamebox->value()), strlen(fnamebox->value()));
Fl::focus(fnamebox);
if(!cleanup(fname, sizeof(fname), fnamebox->value())) {
fnamebox->value("Type input file name here");
return;
}
if((inf = fopen(fname, "r")) == NULL) {
fprintf(stderr, "%s: can't open: ", fname);
perror("");
fnamebox->insert(" [?]");
return;
}
cmedit->snapshot();
if(!cmedit->fload( inf )) {
fprintf(stderr, "%s: can't read colormap\n", fname);
fnamebox->insert(" [?]");
}
cmedit->redraw();
fclose(inf);
}
void fsave_cb( Fl_Button *savebutton, void * ) {
FILE *outf;
char fname[256];
if(!cleanup(fname, sizeof(fname), fnamebox->value())) {
fnamebox->value("Type output file name here");
fnamebox->position(0, strlen(fnamebox->value()));
Fl::focus(fnamebox);
return;
}
if((outf = fopen(fname, "w")) == NULL) {
fprintf(stderr, "%s: can't create: ", fname);
perror("");
fnamebox->position( strlen(fnamebox->value()) );
fnamebox->insert(" [?]");
return;
}
if( cmedit->fsave( outf ) ) {
fprintf(stderr, "%s: saved\n", fname);
} else {
fprintf(stderr, "%s: write error: ", fname);
perror("");
}
fclose(outf);
}
void undo_cb( Fl_Button *, void * ) {
cmedit->undo();
}
void report_cb( Fl_Value_Input *cindex, void * ) {
cmedit->report( cindex->value() );
}
void lerp_cb( Fl_Slider *sl, void * ) {
cmedit->lerpval = sl->value();
}
void rgbmode_cb( Fl_Button *btn, void * ) {
static char *btnlbl[2] = { "RGB", "HSB" };
static char *hsblbls[3][2] = {
{ "Red(L)", "Hue(L)" },
{ "Green(M)", "Sat(M)" },
{ "Blue(R)", "Bright(R)" } };
cmedit->hsbmode = !cmedit->hsbmode;
cmedit->redraw();
btn->label( btnlbl[ cmedit->hsbmode ] );
btn->redraw();
cshow.hsblbls[0]->labelcolor( cmedit->hsbmode ? 3/*yellow*/ : 1/*red*/ );
for(int i = 0; i < 3; i++) {
cshow.hsblbls[i]->label( hsblbls[i][cmedit->hsbmode] );
cshow.hsblbls[i]->redraw();
}
}
void reporter( int x, float h,float s,float b,float a, float red,float green,float blue )
{
char msg[64];
if(cshow.cindex == NULL) return;
cshow.cindex->value( x );
sprintf(msg, "%.3f %.3f %.3f %.3f", h,s,b,a);
cshow.hsba->value( msg );
sprintf(msg, "%.3f %.3f %.3f", red,green,blue);
cshow.rgba->value( msg );
cshow.color->rgba( red, green, blue, a );
cshow.color->redraw();
}
void quietwarning( const char *fmt, ... ) {
char msg[10240];
static char avoid[] = "X_ChangeProperty: ";
va_list args;
va_start(args, fmt);
vsprintf(msg, fmt, args);
va_end(args);
if(0!=strncmp(msg, avoid, sizeof(avoid)-1))
fputs(msg, stderr);
}
int main(int argc, char *argv[]) {
Fl::warning = quietwarning;
Fl_Window *top = make_window();
cmedit->reportto( reporter );
if(argc>2 && !strcmp(argv[1], "-e")) {
cmedit->cment( atoi(argv[2]) );
argc -= 2, argv += 2;
}
if(argc>1) {
fnamebox->value( argv[argc-1] );
fload_cb( loadbtn, NULL );
}
top->show(0, argv);
cmedit->show();
return Fl::run();
}