CMedit.H 3.07 KiB
#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*/