Skip to content
Snippets Groups Projects
Commit fa3ab7df authored by slevy's avatar slevy
Browse files

"cmed" colormap editor.

Allows painting tabular plain-text colormaps
readable with partiview's "cmap" command.
parent dbb9b0c6
No related branches found
No related tags found
No related merge requests found
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <memory.h>
#include <string.h>
#include <ctype.h>
#undef isspace
#include "CMedit.H"
CMedit :: CMedit(int x, int y, int w, int h, const char *label)
: Fl_Gl_Window(x,y,w,h,label) {
init();
end();
}
int CMedit::fload( FILE *inf ) {
char line[256];
char *cp;
int count = -1;
int ix, ox, nix, prevox;
float rgba[4], hsba[4], phsba[4];
int lno;
static enum CMfield flds[4] = { HUE, SAT, BRIGHT, ALPHA };
int f;
char tc[2];
lno = 0;
while(fgets(line, sizeof(line), inf) != NULL) {
lno++;
for(cp = line; *cp && isspace(*cp); cp++)
;
if(*cp == '\0' || *cp == '\n')
continue;
if(*cp == '#') {
if(ncomments >= maxcomments) {
maxcomments *= 2;
comments = (char **)realloc( comments, maxcomments * sizeof(char *) );
}
comments[ncomments++] = strdup( line );
continue;
}
/* ``nnn:'' entries set the colormap pointer ... */
if(sscanf(line, "%d%1[:]", &nix, tc) == 2) {
ix = nix;
cp = strchr(line, ':') + 1;
while(*cp && isspace(*cp)) cp++;
if(*cp == '\0' || *cp == '\n' || *cp == '#')
continue;
}
if(count == -1) {
if(!sscanf(line, "%d", &count) || count < 1) {
fprintf(stderr, "Not a .cmap file? Doesn't begin with a number.\n");
return 0;
}
cment( count );
ix = 0, prevox = 0;
continue;
} else {
if(ix >= count)
break;
rgba[3] = 1;
if(sscanf(cp, "%f%f%f%f", &rgba[0],&rgba[1],&rgba[2],&rgba[3]) < 3) {
fprintf(stderr, "Couldn't read colormap line %d (cmap entry %d of 0..%d)\n",
lno, ix, count-1);
return 0;
}
rgb2hsb( rgba[0],rgba[1],rgba[2], &hsba[0],&hsba[1],&hsba[2] );
hsba[3] = rgba[3];
if(ox == 0)
memcpy(phsba, hsba, sizeof(phsba));
else
phsba[0] = huenear(phsba[0], hsba[0]);
ox = (cment_-1) * ix / count + 1;
for(f = 0; f < 4; f++) {
dragrange( prevox, ox, flds[f], phsba[f], hsba[f], 1.0 );
phsba[f] = hsba[f];
}
prevox = ox;
ix++;
}
}
if(count <= 0) {
fprintf(stderr, "Empty colormap file?\n");
return 0;
}
if(ix < count)
fprintf(stderr, "Only got %d colormap entries, expected %d\n", ix, count);
for(f = 0; f < 4; f++)
dragrange( prevox, cment_, flds[f], phsba[f], phsba[f], 1.0 );
return ix > 0;
}
int CMedit::fsave( FILE *outf ) {
float r,g,b;
int i, ok = 1;
for(i = 0; i < ncomments; i++)
fputs(comments[i], outf);
if(ncomments > 0)
fputs("\n", outf);
fprintf(outf, "%d\n", cment_);
for(i = 0; i < cment_; i++) {
hsb2rgb( vh[i], vs[i], vb[i], &r, &g, &b );
if(fprintf(outf, "%f %f %f %f\n", r, g, b, alpha[i]) <= 0)
ok = 0;
}
return ok;
}
#define YMAX (1.0)
#define YMIN (-.25)
#define YBAR0 (-.01)
#define YBAR1 (-.06)
#define XMIN (-cment_ / 16.f)
#define XMAX cment_
int CMedit::wx2x( int wx ) {
return XMIN + wx * (XMAX-XMIN) / w();
}
float CMedit::wy2y( int wy ) {
return YMAX - wy * (YMAX-YMIN) / h();
}
void CMedit::draw() {
int i;
float v;
int coarse = (w() >= 2*cment());
if(!valid() || damage()/* == FL_DAMAGE_ALL*/) {
/* Assume reshaped */
valid(1);
remin = 0; remax = cment()-1;
glViewport( 0, 0, w(), h() );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( XMIN, XMAX, YMIN, 1, -1, 1 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
}
if(remax-remin < cment()-1) {
glEnable( GL_SCISSOR_TEST );
glScissor( remin*w()/cment(), (remax+1)*w()/cment(), 0, h() );
} else {
glDisable( GL_SCISSOR_TEST );
}
glClearColor( 0,0,0,0 );
glClear( GL_COLOR_BUFFER_BIT );
glDisable( GL_DEPTH_TEST );
glDisable( GL_LIGHTING );
glDisable( GL_TEXTURE_2D );
glDisable( GL_COLOR_MATERIAL );
glBegin( GL_QUADS );
glColor3f( 0,0,0 );
glVertex2f( remin, -.05 );
glVertex2f( remax+1, -.05 );
glColor3f( 1,1,1 );
glVertex2f( remax+1, YMIN );
glVertex2f( remin, YMIN );
glEnd();
glLineWidth( 1 );
glDisable( GL_BLEND );
if(hsbmode) {
glColor3f( 1,1,0 ); /* Hue: yellow */
float midhue = y2hue(.5);
glBegin( GL_LINE_STRIP );
for(i = remin; i <= remax; i++) {
glVertex2f( i, v = hue2y( huenear( vh[i], midhue ) ) );
if(coarse) glVertex2f( i+1, v );
}
glEnd();
glColor3f( .3,1,.25 ); /* Saturation: teal */
glBegin( GL_LINE_STRIP );
for(i = remin; i <= remax; i++) {
glVertex2f( i, vs[i] );
if(coarse) glVertex2f( i+1, vs[i] );
}
glEnd();
glColor3f( .5,.2,1 ); /* Brightness: purple */
glBegin( GL_LINE_STRIP );
for(i = remin; i <= remax; i++) {
glVertex2f( i, vb[i] );
if(coarse) glVertex2f( i+1, vb[i] );
}
glEnd();
} else {
float r[CMENTMAX], g[CMENTMAX], b[CMENTMAX];
for(i = remin; i <= remax; i++)
hsb2rgb( vh[i], vs[i], vb[i], &r[i], &g[i], &b[i] );
glColor3f( 1,0,0 ); /* red */
glBegin( GL_LINE_STRIP );
for(i = remin; i <= remax; i++) {
glVertex2f( i, r[i] );
if(coarse) glVertex2f( i+1, r[i] );
}
glEnd();
glColor3f( 0,1,0 ); /* green */
glBegin( GL_LINE_STRIP );
for(i = remin; i <= remax; i++) {
glVertex2f( i, g[i] );
if(coarse) glVertex2f( i+1, g[i] );
}
glEnd();
glColor3f( 0,0,1 ); /* blue */
glBegin( GL_LINE_STRIP );
for(i = remin; i <= remax; i++) {
glVertex2f( i, b[i] );
if(coarse) glVertex2f( i+1, b[i] );
}
glEnd();
}
glColor3f( .7,.7,.7 ); /* alpha: gray */
glBegin( GL_LINE_STRIP );
for(i = remin; i <= remax-coarse; i++) {
glVertex2f( i, alpha[i] );
if(coarse) glVertex2f( i+1, alpha[i] );
}
glEnd();
glDisable( GL_BLEND );
glShadeModel( GL_SMOOTH );
glBegin( GL_QUAD_STRIP );
for(i = remin; i <= remax; i++) {
float rgb[3];
hsb2rgb( vh[i], vs[i], vb[i], &rgb[0],&rgb[1],&rgb[2] );
glColor3fv( rgb );
glVertex2f( i, YBAR0 );
glVertex2f( i, YBAR1 );
if(coarse) {
glVertex2f( i+1, YBAR0 );
glVertex2f( i+1, YBAR1 );
}
}
glEnd();
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glShadeModel( GL_SMOOTH );
glBegin( GL_QUAD_STRIP );
for(i = remin; i <= remax; i++) {
float rgba[4];
hsb2rgb( vh[i], vs[i], vb[i], &rgba[0],&rgba[1],&rgba[2] );
rgba[3] = alpha[i];
glColor4fv( rgba );
glVertex2f( i, YBAR1 );
glVertex2f( i, YMIN );
if(coarse) {
glVertex2f( i+1, YBAR1 );
glVertex2f( i+1, YMIN );
}
}
glEnd();
glDisable( GL_BLEND );
if(remin <= 0) {
glBegin( GL_QUAD_STRIP );
for(i = 0; i < 128; i++) {
float rgb[3];
float y = i / 127.;
hsb2rgb( y2hue(y), 1, 1, &rgb[0],&rgb[1],&rgb[2] );
glColor3fv( rgb );
glVertex2f( XMIN, y );
glVertex2f( XMIN/4, y );
}
glEnd();
}
glFinish();
/* draw (I hope) any children lying on top of us */
if(children()) Fl_Gl_Window::draw();
}
float CMedit::drag( int x, enum CMfield field, float y, float lerp ) {
float ny, oy, *vp;
float rgb[3];
int usergb = 0;
if(x < 0 || x >= cment())
return 0;
if(locked && (x < lockmin || x > lockmax))
return 0;
switch(field) {
case HUE: vp = &vh[x]; break;
case SAT: vp = &vs[x]; break;
case BRIGHT: vp = &vb[x]; break;
case ALPHA: vp = &alpha[x]; break;
default:
hsb2rgb( vh[x],vs[x],vb[x], &rgb[0],&rgb[1],&rgb[2] );
vp = &rgb[ field - RED ];
usergb = 1;
}
if(field == HUE) {
oy = hue2y(*vp);
y = hue2y( huenear( y2hue(y), *vp ) );
ny = (1-lerp) * oy + lerp * y;
*vp = y2hue(ny);
} else {
oy = *vp;
ny = (1-lerp) * oy + lerp * y;
if(ny < 0) ny = 0;
else if(ny > 1) ny = 1;
*vp = ny;
if(usergb)
rgb2hsb( rgb[0],rgb[1],rgb[2], &vh[x],&vs[x],&vb[x] );
}
return ny;
}
void CMedit::dragrange( int x0, int x1, enum CMfield field, float y0, float y1, float lerp ) {
int x;
float dy;
if(x0 == x1 || x0 < 0 && x1 < 0 || x0 >= cment() && x1 >= cment())
return;
dy = (y1 - y0) / (x1 - x0);
if(x0 < x1)
for(x = x0; x < x1; x++)
drag( x, field, y0 + dy*(x-x0), lerp );
else
for(x = x0; x > x1; x--)
drag( x, field, y0 + dy*(x-x0), lerp );
}
int CMedit::handle(int ev) {
int x = wx2x( Fl::event_x() );
float y = wy2y( Fl::event_y() );
int xmin, xmax;
switch(ev) {
case FL_SHORTCUT:
if(Fl::event_key() == 'u') {
undo();
return 1;
}
return 0;
case FL_PUSH:
dragfrom = x, dragval = y, dragamount = 0;
draghue = ( (x - XMIN) * (x - (XMIN/4)) < 0 ); /* If dragging on hue strip */
if(Fl::event_state(FL_SHIFT)) {
dragfield = ALPHA;
} else {
if(hsbmode) {
if(Fl::event_state(FL_BUTTON1)) dragfield = HUE;
else if(Fl::event_state(FL_BUTTON2)) dragfield = SAT;
else dragfield = BRIGHT;
} else {
if(Fl::event_state(FL_BUTTON1)) dragfield = RED;
else if(Fl::event_state(FL_BUTTON2)) dragfield = GREEN;
else dragfield = BLUE;
}
}
if(Fl::event_key('l')) {
/*...*/
} else if(Fl::event_key('r')) {
/*...*/
} else {
snapshot();
}
/* Fall into ... */
case FL_DRAG:
case FL_RELEASE:
#ifdef NOTYET
if(draghue) {
float h0 = y2hue( y );
hueshift += (y - dragval) / huezoom;
huezoom *= (x - dragfrom)
} else { ... }
#endif
dragrange( dragfrom, x, dragfield, dragval, y,
Fl::event_state(FL_CTRL) ? 1.0 : lerpval );
xmin = (dragfrom<x) ? dragfrom : x;
xmax = dragfrom+x-xmin;
if(damage() == 0) {
remin = xmin, remax = xmax;
} else {
if(remin > xmin) remin = xmin;
if(remax < xmax) remax = xmax;
}
damage(1);
if(dragfrom != x)
dragamount = 1;
if(ev == FL_RELEASE && dragamount == 0)
drag( x, dragfield, y, Fl::event_state(FL_CTRL) ? 1.0 : lerpval );
dragfrom = x, dragval = y;
report( x );
return 1;
case FL_ENTER:
case FL_LEAVE:
report( x );
return 1;
case FL_MOVE:
report( x );
return 1;
}
return 0;
}
float CMedit::huenear( float hue, float hueref ) {
float h = hue;
if(h - hueref > .5f)
do { h -= 1.0f; } while (h - hueref > .5);
else
while(h - hueref < -.5f) h += 1.0f;
return h;
}
float CMedit::hue2y( float hue ) {
/* Find closest multiple of given hue to reference y-position y0 */
return (hue - hueshift) * huezoom;
}
float CMedit::y2hue( float y ) {
return y / huezoom + hueshift;
}
static float sample( float *a, int ents, float at, int smooth ) {
if(at <= 0 || ents <= 1) return a[0];
if(at >= 1) return a[ents-1];
float eat = at * ents;
int iat = (int)eat;
return smooth ? a[iat]*(1 - (eat-iat)) + a[iat+1]*(eat-iat)
: a[iat];
}
void CMedit::cment( int newcment ) {
if(newcment < 1) return;
if(newcment > CMENTMAX) {
fprintf(stderr, "Oops, can't ask for more than %d colormap entries -- using %d\n",
CMENTMAX,CMENTMAX);
newcment = CMENTMAX;
}
if(cment_ == newcment)
return;
/* Resample */
snapshot();
int smooth = 0; // (cment_ < newcment);
for(int o = 0; o < newcment; o++) {
float at = newcment > 1 ? (float)o / (newcment-1) : 0;
vh[o] = sample( &snap[0][0], cment_, at, smooth );
vs[o] = sample( &snap[1][0], cment_, at, smooth );
vb[o] = sample( &snap[2][0], cment_, at, smooth );
alpha[o] = sample( &snap[3][0], cment_, at, smooth );
}
cment_ = newcment;
remin = 0;
remax = cment_ - 1;
lockmin = 0;
lockmax = cment_ - 1;
redraw();
}
void CMedit::reportto( void (*func)(int x, float h,float s,float b,float a, float red,float green,float blue) ) {
reportfunc = func;
}
void CMedit::report( int x ) {
float r,g,b;
if(x < 0 || x > cment()-1 || reportfunc == NULL)
return;
hsb2rgb( vh[x], vs[x], vb[x], &r,&g,&b );
(*reportfunc)( x, vh[x], vs[x], vb[x], alpha[x], r,g,b );
}
#ifndef _GVIEW_H
#define _GVIEW_H
/*
* Graphical colormap editor
*/
#include <GL/gl.h> /* for GLuint */
#include <stdlib.h>
#include <stdio.h>
#include <FL/Fl.H>
#include <FL/Fl_Gl_Window.H>
#define CMENTMAX 10000
extern "C" {
extern void hsb2rgb(float h, float s, float b, float *rp, float *gp, float *bp);
extern void rgb2hsb(float r, float g, float b, float *hp, float *sp, float *bp);
}
enum CMfield {
HUE, SAT, BRIGHT,
ALPHA,
RED, GREEN, BLUE
};
class CMedit : public Fl_Gl_Window {
public:
CMedit(int x, int y, int h, int w, const char *label = 0);
int cment() const { return cment_; }
void cment( int newcment );
int hsbmode;
float lerpval;
float vh[CMENTMAX], vs[CMENTMAX], vb[CMENTMAX], alpha[CMENTMAX];
float drag( int index, enum CMfield field, float value, float lerp = 1.0 );
void dragrange( int x0, int x1, enum CMfield field, float v0, float v1, float lerp = 1.0 );
float get( int index, enum CMfield field );
void getrgba( int index, float rgba[4] );
void gethsba( int index, float hsba[4] );
int fload( FILE *inf );
int fsave( FILE *outf );
void report( int x );
void reportto( void (*func)(int x, float h,float s,float b,float a, float red,float green,float blue) );
void snapshot() { /* for undo-ing */
for(int k = 0; k < CMENTMAX; k++) {
snap[0][k] = vh[k];
snap[1][k] = vs[k];
snap[2][k] = vb[k];
snap[3][k] = alpha[k];
}
snapcment_ = cment_;
}
int undo() { /* actually undo/redo */
float t;
for(int k = 0; k < CMENTMAX; k++) {
t = vh[k]; vh[k] = snap[0][k]; snap[0][k] = t;
t = vs[k]; vs[k] = snap[1][k]; snap[1][k] = t;
t = vb[k]; vb[k] = snap[2][k]; snap[2][k] = t;
t = alpha[k]; alpha[k] = snap[3][k]; snap[3][k] = t;
}
int i = cment_; cment_ = snapcment_; snapcment_ = i;
redraw();
return 1;
}
virtual void draw();
virtual int handle(int ev);
virtual void resize(int nx, int ny, int nw, int nh) {
w(nw); h(nh); hide(); show();
}
protected:
int cment_, snapcment_;
float snap[4][CMENTMAX];
float huenear(float hue, float hueref);
float hue2y(float hue);
float y2hue(float y);
int wx2x( int wx );
float wy2y( int wy );
void (*reportfunc)(int x, float h,float s,float b,float a, float red,float green,float blue);
float hueshift, huezoom;
int remin, remax; /* repair region */
int dragfrom;
int dragamount;
enum CMfield dragfield;
float dragval;
int draghue;
int locked, lockmin, lockmax;
char **comments;
int ncomments, maxcomments;
void init() {
cment_ = snapcment_ = 256;
remin = 0; remax = cment()-1;
lerpval = 0.5;
hsbmode = 1;
dragfrom = -1; dragval = 0; dragamount = 0;
locked = 0;
lockmin = 0, lockmax = cment()-1;
hueshift = 0;
huezoom = 1;
draghue = 0;
ncomments = 0;
maxcomments = 8;
comments = (char **)malloc( maxcomments * sizeof(char *) );
for(int k = 0; k < cment_; k++) {
vh[k] = 1 - .5*k / cment_;
vs[k] = .5;
vb[k] = .25 + .75*k / cment_;
alpha[k] = .33 + .67 * k*k / (cment_*cment_);
}
snapshot();
}
};
#endif /*_GVIEW_H*/
# Generated automatically from Makefile.in by configure.
# Makefile for cmed - please do not edit if the file is named "Makefile",
# since configure would overwrite it on the next configure.
# Edit "Makefile.in", and run configure instead!!!
# If you must change configure.in, run autoconf, and then configure etc.
# the following variables are under AC control
# KIRA_INC, KIRA_LIB
# FLTK_INC, FLTK_LIB
# PV_FLAGS
SHELL = /bin/sh
# TARGET
TARGET = cmed
FLTK_INC = -I/vr/data/virdir/src/fltk
FLTK_LIB = -L/vr/data/virdir/src/fltk/lib -lfltk
# FLAGS and BINARIES
CC = cc -n32
CXX = CC -n32
LINK = ${CXX} ${OTYPE}
GL_LIB = -lGLU -lGL
X_LIB = -lSM -lICE -lXext -lX11
M_LIB = -lm
LIBS = $(FLTK_LIB) $(GL_LIB) $(X_LIB) $(M_LIB)
DEFS = $(PV_FLAGS)
INCS = $(FLTK_INC)
OPT = -g -O2
CFLAGS = $(OPT) $(DEFS) $(INCS) -g
CXXFLAGS = $(OPT) $(DEFS) $(INCS) -g
APP_CSRCS = hsb.c
APP_CXXSRCS = cmed.C cmedpanel.C CMedit.C
APP_OBJS = cmed.o CMedit.o cmedpanel.o hsb.o
$(TARGET): $(APP_OBJS)
$(CXX) -o $@ $(OPT) $(OTYPE) $(APP_OBJS) $(LIBS)
dep: depend
depend: _always
rm -f Makedepend
$(CC) -M $(CFLAGS) $(APP_CSRCS) > Makedepend
$(CXX) -M $(CXXFLAGS) $(APP_CXXSRCS) >> Makedepend
_always:
include Makedepend
# Makefile for cmed - please do not edit if the file is named "Makefile",
# since configure would overwrite it on the next configure.
# Edit "Makefile.in", and run configure instead!!!
# If you must change configure.in, run autoconf, and then configure etc.
# the following variables are under AC control
# KIRA_INC, KIRA_LIB
# FLTK_INC, FLTK_LIB
# PV_FLAGS
SHELL = /bin/sh
# TARGET
TARGET = cmed
FLTK_INC = @FLTK_INC@
FLTK_LIB = @FLTK_LIB@
# FLAGS and BINARIES
CC = @CC@
CXX = @CXX@
LINK = ${CXX} ${OTYPE}
GL_LIB = @GLLIBS@
X_LIB = @XLIBS@
M_LIB = -lm
LIBS = $(FLTK_LIB) $(GL_LIB) $(X_LIB) $(M_LIB)
DEFS = $(PV_FLAGS)
INCS = $(FLTK_INC)
OPT = -g -O2
CFLAGS = $(OPT) $(DEFS) $(INCS) @CFLAGS@
CXXFLAGS = $(OPT) $(DEFS) $(INCS) @CXXFLAGS@
APP_CSRCS = hsb.c
APP_CXXSRCS = cmed.C cmedpanel.C CMedit.C
APP_OBJS = cmed.o CMedit.o cmedpanel.o hsb.o
$(TARGET): $(APP_OBJS)
$(CXX) -o $@ $(OPT) $(OTYPE) $(APP_OBJS) $(LIBS)
dep: depend
depend: _always
rm -f Makedepend
$(CC) -M $(CFLAGS) $(APP_CSRCS) > Makedepend
$(CXX) -M $(CXXFLAGS) $(APP_CXXSRCS) >> Makedepend
_always:
include Makedepend
#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();
}
#ifndef _CMED_H
#define _CMED_H
#include "cmedpanel.H"
#include "CMedit.H"
#include "colorpatch.H"
extern struct _cshow {
colorpatch* color;
Fl_Output* hsba;
Fl_Output* rgba;
Fl_Value_Input* cindex;
Fl_Box *hsblbls[3];
} cshow;
#endif /*_CMED_H*/
// generated by Fast Light User Interface Designer (fluid) version 1.00
#include "cmedpanel.H"
#include "cmed.H"
Fl_Button *undobutton=(Fl_Button *)0;
Fl_Button *loadbtn=(Fl_Button *)0;
Fl_Button *savebtn=(Fl_Button *)0;
Fl_Slider *forceslider=(Fl_Slider *)0;
Fl_Button *rgbmode=(Fl_Button *)0;
Fl_Input *fnamebox=(Fl_Input *)0;
class CMedit *cmedit=(class CMedit *)0;
Fl_Window* make_window() {
Fl_Window* w;
{ Fl_Window* o = new Fl_Window(390, 405);
w = o;
{ Fl_Button* o = undobutton = new Fl_Button(5, 0, 40, 25, "Undo");
o->down_box(FL_DOWN_BOX);
o->callback((Fl_Callback*)undo_cb);
}
{ Fl_Button* o = loadbtn = new Fl_Button(55, 0, 45, 25, "Load");
o->callback((Fl_Callback*)fload_cb);
}
{ Fl_Button* o = savebtn = new Fl_Button(110, 0, 45, 25, "Save");
o->callback((Fl_Callback*)fsave_cb);
}
{ Fl_Slider* o = forceslider = new Fl_Slider(205, 0, 75, 25, "Force");
o->type(5);
o->selection_color(1);
o->minimum(0.05);
o->value(0.5);
o->callback((Fl_Callback*)lerp_cb);
o->align(FL_ALIGN_RIGHT);
}
{ Fl_Button* o = rgbmode = new Fl_Button(330, 0, 35, 25, "HSB");
o->labelsize(12);
o->callback((Fl_Callback*)rgbmode_cb);
o->align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE);
}
{ Fl_Input* o = fnamebox = new Fl_Input(30, 35, 355, 25, "File:");
o->labeltype(FL_ENGRAVED_LABEL);
o->labelsize(12);
o->callback((Fl_Callback*)input_cb);
o->when(FL_WHEN_ENTER_KEY_ALWAYS);
}
{ Fl_Box* o = cshow.hsblbls[0] = new Fl_Box(30, 60, 80, 20, "Hue (L)");
o->box(FL_FLAT_BOX);
o->color(34);
o->labelfont(1);
o->labelsize(12);
o->labelcolor(3);
}
{ Fl_Box* o = cshow.hsblbls[1] = new Fl_Box(115, 60, 75, 20, "Sat(M)");
o->box(FL_FLAT_BOX);
o->color(34);
o->labelfont(1);
o->labelsize(12);
o->labelcolor(2);
}
{ Fl_Box* o = cshow.hsblbls[2] = new Fl_Box(195, 60, 75, 20, "Bright(R)");
o->box(FL_FLAT_BOX);
o->color(34);
o->labelfont(1);
o->labelsize(12);
o->labelcolor(235);
}
{ Fl_Box* o = new Fl_Box(275, 60, 80, 20, "Alpha(shift)");
o->box(FL_FLAT_BOX);
o->color(34);
o->labelfont(1);
o->labelsize(12);
o->labelcolor(15);
}
{ class CMedit* o = cmedit = new class CMedit(5, 85, 380, 270);
o->box(FL_FLAT_BOX);
Fl_Group::current()->resizable(o);
}
{ colorpatch* o = cshow.color = new colorpatch(65, 360, 50, 40);
o->box(FL_DOWN_BOX);
o->labeltype(FL_NO_LABEL);
}
{ Fl_Value_Input* o = cshow.cindex = new Fl_Value_Input(10, 375, 50, 25, "index");
o->maximum(0);
o->step(1);
o->textsize(12);
o->callback((Fl_Callback*)report_cb);
o->align(FL_ALIGN_TOP);
}
{ Fl_Output* o = cshow.hsba = new Fl_Output(120, 375, 145, 25, "HSBA");
o->box(FL_FLAT_BOX);
o->textsize(11);
o->align(FL_ALIGN_TOP);
}
{ Fl_Output* o = cshow.rgba = new Fl_Output(275, 375, 105, 25, "rgb");
o->box(FL_FLAT_BOX);
o->textsize(11);
o->align(FL_ALIGN_TOP);
}
o->end();
}
return w;
}
// generated by Fast Light User Interface Designer (fluid) version 1.00
#ifndef cmedpanel_H
#define cmedpanel_H
#include <FL/Fl.H>
#include <FL/Fl_Box.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_Input.H>
#include <FL/Fl_Output.H>
#include <FL/Fl_Slider.H>
#include <FL/Fl_Value_Input.H>
#include <FL/Fl_Window.H>
extern void fload_cb(Fl_Button*, void*);
extern void fsave_cb(Fl_Button*, void*);
extern void input_cb(Fl_Input*, void*);
extern void lerp_cb(Fl_Slider*, void*);
extern void report_cb(Fl_Value_Input*, void*);
extern void rgbmode_cb(Fl_Button*, void*);
extern void undo_cb(Fl_Button*, void*);
extern Fl_Button *undobutton;
extern Fl_Button *loadbtn;
extern Fl_Button *savebtn;
extern Fl_Slider *forceslider;
extern Fl_Button *rgbmode;
extern Fl_Input *fnamebox;
extern class CMedit *cmedit;
Fl_Window* make_window();
extern Fl_Button *undobutton;
extern Fl_Button *loadbtn;
extern Fl_Button *savebtn;
extern Fl_Slider *forceslider;
extern Fl_Button *rgbmode;
extern Fl_Input *fnamebox;
extern class CMedit *cmedit;
#endif
# data file for the Fltk User Interface Designer (fluid)
version 1.00
header_name {.H}
code_name {.C}
gridx 5
gridy 5
snap 3
decl {\#include "cmed.H"} {}
Function {make_window()} {open
} {
Fl_Window {} {open
xywh {798 139 390 405} resizable visible
} {
Fl_Button undobutton {
label Undo
callback undo_cb
xywh {5 0 40 25} down_box DOWN_BOX
}
Fl_Button loadbtn {
label Load
callback fload_cb
xywh {55 0 45 25}
}
Fl_Button savebtn {
label Save
callback fsave_cb
xywh {110 0 45 25}
}
Fl_Slider forceslider {
label Force
callback lerp_cb
xywh {205 0 75 25} type {Horz Knob} selection_color 1 align 8 minimum 0.05 value 0.5
}
Fl_Button rgbmode {
label HSB
callback rgbmode_cb
xywh {330 0 35 25} labelsize 12 align 16
}
Fl_Input fnamebox {
label {File:}
callback input_cb
xywh {30 35 355 25} labeltype ENGRAVED_LABEL labelsize 12 when 10
}
Fl_Box {cshow.hsblbls[0]} {
label {Hue (L)}
xywh {30 60 80 20} box FLAT_BOX color 34 labelfont 1 labelsize 12 labelcolor 3
}
Fl_Box {cshow.hsblbls[1]} {
label {Sat(M)}
xywh {115 60 75 20} box FLAT_BOX color 34 labelfont 1 labelsize 12 labelcolor 2
}
Fl_Box {cshow.hsblbls[2]} {
label {Bright(R)} selected
xywh {195 60 75 20} box FLAT_BOX color 34 labelfont 1 labelsize 12 labelcolor 235
}
Fl_Box {} {
label {Alpha(shift)}
xywh {275 60 80 20} box FLAT_BOX color 34 labelfont 1 labelsize 12 labelcolor 15
}
Fl_Box cmedit {
xywh {5 85 380 270} box FLAT_BOX resizable
class {class CMedit}
}
Fl_Box {cshow.color} {
xywh {65 360 50 40} box DOWN_BOX labeltype NO_LABEL
class colorpatch
}
Fl_Value_Input {cshow.cindex} {
label index
callback report_cb
xywh {10 375 50 25} align 1 maximum 0 step 1 textsize 12
}
Fl_Output {cshow.hsba} {
label HSBA
xywh {120 375 145 25} box FLAT_BOX align 1 textsize 11
}
Fl_Output {cshow.rgba} {
label rgb
xywh {275 375 105 25} box FLAT_BOX align 1 textsize 11
}
}
}
#ifndef _COLORPATCH_H
#define _COLORPATCH_H
#include "cmedpanel.H"
class colorpatch : public Fl_Gl_Window {
public:
float vr,vg,vb,va;
void rgba(float r,float g,float b,float a) { vr=r,vg=g,vb=b,va=a; redraw(); }
colorpatch(int x,int y,int w,int h,char *label=0) :
Fl_Gl_Window(x,y,w,h,label) {
vr = vg = vb = va = 0;
}
protected:
virtual void draw() {
glClearColor( vr,vg,vb,va );
glClear( GL_COLOR_BUFFER_BIT );
}
};
#endif
/* HSV to RGB conversion from Ken Fishkin, pixar!fishkin */
void hsb2rgb(float vH, float vS, float vB, float *rp, float *gp, float *bp)
{
float h = 6.0 * (vH < 0 ? vH + (1 - (int)vH) : vH - (int)vH);
int sextant = (int) h; /* implicit floor */
float fract = h - sextant;
float vsf = vS*vB*fract;
float min = (1-vS)*vB;
float mid1 = min + vsf;
float mid2 = vB - vsf;
switch (sextant%6) {
case 0: *rp = vB; *gp = mid1; *bp = min; break;
case 1: *rp = mid2; *gp = vB; *bp = min; break;
case 2: *rp = min; *gp = vB; *bp = mid1; break;
case 3: *rp = min; *gp = mid2; *bp = vB; break;
case 4: *rp = mid1; *gp = min; *bp = vB; break;
case 5: *rp = vB; *gp = min; *bp = mid2; break;
}
}
void rgb2hsb(float r, float g, float b, float *hp, float *sp, float *bp)
{
float cRGB[3];
int min, max;
float dv;
cRGB[0] = r, cRGB[1] = g, cRGB[2] = b;
if(cRGB[0] < cRGB[1])
min = 0, max = 1;
else
min = 1, max = 0;
if(cRGB[min] > cRGB[2]) min = 2;
else if(cRGB[max] < cRGB[2]) max = 2;
*bp = cRGB[max];
dv = cRGB[max] - cRGB[min];
if(dv == 0) {
*hp = 0; /* hue undefined, use 0 */
*sp = 0;
} else {
float dh = (cRGB[3 - max - min] - cRGB[min]) / (6*dv);
*hp = (3+max-min)%3==1 ? max/3.0 + dh : max/3.0 - dh;
if(*hp < 0) *hp += 1 + (int)*hp;
if(*hp > 1) *hp -= (int)*hp;
*sp = dv / cRGB[max];
}
}
256
1.000000 0.000000 0.000000 0.330000
1.000000 0.051487 0.062602 0.330010
1.000000 0.050936 0.073180 0.330041
1.000000 0.000000 0.035156 0.330092
1.000000 0.000000 0.046875 0.330164
1.000000 0.000000 0.058594 0.330256
1.000000 0.000000 0.070312 0.330368
1.000000 0.000000 0.082031 0.330501
1.000000 0.000000 0.093750 0.330654
1.000000 0.000000 0.105469 0.330828
1.000000 0.000000 0.117188 0.331022
0.972467 0.000000 0.125357 0.331237
0.939427 0.000000 0.132107 0.331472
0.906388 0.000000 0.138083 0.331728
1.000000 0.000000 0.164062 0.332004
1.000000 0.000000 0.175781 0.332300
1.000000 0.000000 0.187500 0.332617
1.000000 0.000000 0.199219 0.332955
1.000000 0.000000 0.210938 0.333312
1.000000 0.000000 0.222656 0.333691
0.739641 0.000000 1.000000 0.334089
0.000000 0.073638 1.000000 0.334509
0.000000 1.000000 0.150042 0.334948
0.522628 1.000000 0.000000 0.335408
0.564660 1.000000 0.000000 0.335889
0.349947 1.000000 0.000000 0.336390
0.392711 1.000000 0.000000 0.336911
0.451996 1.000000 0.000000 0.337453
0.000000 1.000000 0.427330 0.338015
0.000000 1.000000 0.465700 0.338598
0.043395 1.000000 0.000000 0.339201
1.000000 0.595963 0.000000 0.339825
1.000000 0.609822 0.000000 0.340469
1.000000 0.619552 0.000000 0.341133
1.000000 0.670582 0.000000 0.341818
1.000000 0.756028 0.000000 0.342524
1.000000 0.837344 0.000000 0.343249
1.000000 0.959960 0.000000 0.343996
1.000000 0.966248 0.000000 0.344763
1.000000 0.972537 0.000000 0.345550
1.000000 0.995345 0.000000 0.346357
0.655580 1.000000 0.000000 0.347186
0.533790 1.000000 0.000000 0.348034
0.461560 1.000000 0.000000 0.348903
0.485965 1.000000 0.000000 0.349792
0.406781 1.000000 0.000000 0.350702
0.310254 1.000000 0.000000 0.351633
0.173460 1.000000 0.000000 0.352583
0.103876 1.000000 0.000000 0.353555
0.079160 1.000000 0.000000 0.354546
0.000000 1.000000 0.030852 0.355558
0.000000 1.000000 0.105534 0.356591
0.000000 1.000000 0.283493 0.357644
0.000000 1.000000 0.365815 0.358718
0.011013 1.000000 0.453056 0.359811
0.044053 1.000000 0.544686 0.360926
0.077093 1.000000 0.631155 0.362061
0.000000 1.000000 0.694366 0.363216
0.000000 1.000000 0.822126 0.364391
0.000000 1.000000 0.899595 0.365588
0.000000 1.000000 0.976372 0.366804
0.000000 0.946985 1.000000 0.368041
0.000000 0.865342 1.000000 0.369299
0.000000 0.733753 1.000000 0.370577
0.000000 0.667985 1.000000 0.371875
0.000000 0.599421 1.000000 0.373194
0.000000 0.514602 1.000000 0.374533
0.000000 0.431701 1.000000 0.375893
0.000000 0.299111 1.000000 0.377273
0.000000 0.231297 1.000000 0.378674
0.000000 0.163837 1.000000 0.380095
0.000000 0.080256 1.000000 0.381536
0.000000 0.000577 1.000000 0.382998
0.095816 0.000000 1.000000 0.384480
0.161259 0.000000 1.000000 0.385983
0.226735 0.000000 1.000000 0.387507
0.308533 0.000000 1.000000 0.389050
0.389898 0.000000 1.000000 0.390614
0.454710 0.000000 1.000000 0.392199
0.519176 0.000000 1.000000 0.393804
0.618856 0.000000 1.000000 0.395430
0.687407 0.000000 1.000000 0.397076
0.755582 0.000000 1.000000 0.398742
0.856840 0.000000 1.000000 0.400429
0.925234 0.000000 1.000000 0.402136
0.970627 0.000000 1.000000 0.403864
1.000000 0.000000 0.984239 0.405612
1.000000 0.000000 0.886989 0.407381
1.000000 0.000000 0.839254 0.409170
1.000000 0.000000 0.101884 0.410979
1.000000 0.000000 0.000000 0.412809
1.000000 0.000000 0.000000 0.414660
1.000000 0.000000 0.000000 0.416531
1.000000 0.000000 0.000000 0.418422
1.000000 0.000000 0.000000 0.420334
1.000000 0.000000 0.000000 0.422266
1.000000 0.000000 0.000000 0.424219
1.000000 0.000000 0.000000 0.426192
1.000000 0.000000 0.000000 0.428185
1.000000 0.000000 0.000000 0.430199
1.000000 0.000000 0.000000 0.432234
1.000000 0.000000 0.000000 0.434289
1.000000 0.000000 0.000000 0.436364
1.000000 0.000000 0.000000 0.438460
1.000000 0.000000 0.000000 0.440576
1.000000 0.000000 0.000000 0.442713
1.000000 0.000000 0.000000 0.444870
1.000000 0.000000 0.000000 0.447048
1.000000 0.000000 0.000000 0.449246
1.000000 0.000000 0.000000 0.451464
0.000000 0.795154 1.000000 0.453703
0.000000 1.000000 0.022027 0.455962
0.000000 1.000000 0.484582 0.458242
0.000000 1.000000 0.864537 0.460542
0.000000 0.772027 1.000000 0.462863
0.000000 0.441630 1.000000 0.465204
0.268722 0.000000 1.000000 0.467566
1.000000 0.000000 0.713656 0.469948
1.000000 0.000000 0.000000 0.472350
1.000000 0.000000 0.000000 0.474773
1.000000 0.000000 0.000000 0.477217
1.000000 0.000000 0.000000 0.479681
1.000000 0.000000 0.019824 0.482165
1.000000 0.000000 0.000000 0.484670
1.000000 0.000000 0.000000 0.487195
1.000000 0.000000 0.000000 0.489740
1.000000 0.000000 0.000000 0.492307
1.000000 0.000000 0.000000 0.494893
1.000000 0.000000 0.000000 0.497500
1.000000 0.000000 0.000000 0.500127
1.000000 0.000000 0.000000 0.502775
1.000000 0.000000 0.000000 0.505444
1.000000 0.000000 0.000000 0.508132
1.000000 0.000000 0.000000 0.510842
1.000000 0.000000 0.000000 0.513571
1.000000 0.000000 0.000000 0.516321
1.000000 0.000000 0.000000 0.519092
1.000000 0.000000 0.000000 0.521883
1.000000 0.000000 0.000000 0.524694
1.000000 0.000000 0.000000 0.527526
1.000000 0.000000 0.000000 0.530378
1.000000 0.000000 0.000000 0.533251
1.000000 0.000000 0.000000 0.536144
1.000000 0.000000 0.000000 0.539058
1.000000 0.000000 0.000000 0.541992
1.000000 0.000000 0.000000 0.544947
1.000000 0.000000 0.000000 0.547922
1.000000 0.000000 0.000000 0.550917
1.000000 0.000000 0.000000 0.553933
1.000000 0.000000 0.000000 0.556969
1.000000 0.000000 0.000000 0.560026
1.000000 0.000000 0.000000 0.563103
1.000000 0.061674 0.061674 0.566201
1.000000 0.061674 0.061674 0.569319
1.000000 0.061674 0.074075 0.572458
1.000000 0.061674 0.136078 0.575617
1.000000 0.061674 0.198083 0.578796
1.000000 0.061812 0.260195 0.581996
1.000000 0.061949 0.306792 0.585217
1.000000 0.062087 0.368871 0.588457
1.000000 0.062225 0.430931 0.591719
1.000000 0.062362 0.492974 0.595000
1.000000 0.062500 0.539509 0.598303
1.000000 0.062638 0.586033 0.601625
1.000000 0.062775 0.678990 0.604968
1.000000 0.062913 0.725479 0.608332
1.000000 0.063051 0.756476 0.611716
1.000000 0.063051 0.818389 0.615120
1.000000 0.063051 0.895780 0.618545
1.000000 0.063051 0.957692 0.621990
0.980405 0.063601 1.000000 0.625456
0.794896 0.064152 1.000000 0.628942
0.748665 0.064703 1.000000 0.632449
0.656161 0.065253 1.000000 0.635976
0.548334 0.065804 1.000000 0.639523
0.455738 0.065804 1.000000 0.643091
0.347709 0.065804 1.000000 0.646680
0.224247 0.065804 1.000000 0.650289
0.123934 0.065804 1.000000 0.653918
0.065804 0.138853 1.000000 0.657568
0.065804 0.216016 1.000000 0.661238
0.065804 0.277747 1.000000 0.664928
0.065804 0.421272 1.000000 0.668640
0.065804 0.513868 1.000000 0.672371
0.065804 0.602607 1.000000 0.676123
0.065804 0.722210 1.000000 0.679895
0.066033 0.845710 1.000000 0.683688
0.066263 0.123850 1.000000 0.687502
1.000000 0.066492 0.485954 0.691335
1.000000 0.066722 0.547750 0.695190
1.000000 0.066951 0.609517 0.699064
1.000000 0.067181 0.794533 0.702959
1.000000 0.068098 0.979473 0.706875
0.835950 0.069016 1.000000 0.710811
0.651737 0.069934 1.000000 0.714767
0.528821 0.069934 1.000000 0.718744
0.405905 0.069934 1.000000 0.722742
0.221531 0.069934 1.000000 0.726759
0.098614 0.069934 1.000000 0.730798
0.069934 0.164169 1.000000 0.734856
0.069934 0.256357 1.000000 0.738936
0.069934 0.348544 1.000000 0.743035
0.069934 0.440732 1.000000 0.747155
0.069934 0.532918 1.000000 0.751296
0.069934 0.717292 1.000000 0.755457
0.070852 0.778969 1.000000 0.759638
0.071769 0.840525 1.000000 0.763840
0.072687 0.901958 1.000000 0.768062
0.072687 1.000000 0.975490 0.772305
0.073146 1.000000 0.914256 0.776568
0.073605 1.000000 0.853083 0.780851
0.074064 1.000000 0.730785 0.785155
0.074064 1.000000 0.620652 0.789480
0.074064 1.000000 0.460040 0.793825
0.074064 1.000000 0.262463 0.798190
0.074064 1.000000 0.116894 0.802576
0.074064 1.000000 0.398855 0.806982
0.074064 1.000000 0.383559 0.811409
0.368773 1.000000 0.074064 0.815856
1.000000 0.682857 0.074064 0.820324
1.000000 0.667561 0.074064 0.824812
1.000000 0.667560 0.074064 0.829321
1.000000 0.682857 0.074064 0.833849
1.000000 0.759338 0.074064 0.838399
1.000000 0.881708 0.074064 0.842969
1.000000 0.973486 0.074064 0.847559
1.000000 0.316367 0.074064 0.852170
1.000000 0.074064 0.074064 0.856801
1.000000 0.074064 0.074064 0.861453
0.074064 0.707028 1.000000 0.866125
0.074064 0.717879 1.000000 0.870817
0.074064 0.728730 1.000000 0.875530
0.074064 0.739581 1.000000 0.880264
0.074064 0.750431 1.000000 0.885018
0.074064 0.761282 1.000000 0.889792
0.074064 0.772133 1.000000 0.894587
0.074064 0.782984 1.000000 0.899402
0.074064 0.793835 1.000000 0.904238
0.074064 0.804685 1.000000 0.909094
0.074064 0.815536 1.000000 0.913970
0.071311 0.825871 1.000000 0.918867
0.071311 0.836754 1.000000 0.923785
0.071311 0.847637 1.000000 0.928723
0.071311 0.858520 1.000000 0.933681
0.071311 0.869403 1.000000 0.938660
0.071311 0.880286 1.000000 0.943659
0.071311 0.891169 1.000000 0.948679
0.071311 0.902052 1.000000 0.953719
0.071311 0.912935 1.000000 0.958779
0.071311 0.923818 1.000000 0.963860
0.071311 0.934702 1.000000 0.968962
0.071311 0.945585 1.000000 0.974084
0.071311 0.956468 1.000000 0.979226
0.071311 0.967351 1.000000 0.984389
0.071311 0.978234 1.000000 0.989572
0.214207 0.990791 1.000000 0.994776
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment