/*
* This file is part of rasdaman community.
*
* Rasdaman community is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Rasdaman community 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with rasdaman community. If not, see .
*
* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann /
rasdaman GmbH.
*
* For more information please see
* or contact Peter Baumann via .
/
/**
* PURPOSE:
* Class definitions for the colourspace mapping.
* COMMENTS:
* No comments
*/
#ifndef _RVIEW_COLMAP_H_
#define _RVIEW_COLMAP_H_
#include "rviewUtils.hh"
class colourspaceMapper;
class colourspaceFrame;
enum cspaceType {
cst_gauss,
cst_linear,
cst_rectangle,
cst_asympt
};
typedef struct colourspace_params_s {
double peak_red, peak_green, peak_blue;
double sigm_red, sigm_green, sigm_blue;
double minVal, maxVal;
unsigned long floatRange;
cspaceType type;
} colourspace_params;
/*
* Colourspace configuration canvas
*/
class colourspaceCanvas: public wxCanvas
{
public:
colourspaceCanvas(colourspaceFrame *parent, colourspace_params *p, int x, int y, int w, int h, long style=0);
~colourspaceCanvas(void);
void enableOutlineSum(bool enable);
void setDrawingFunction(void);
void Redraw(void);
void OnSize(int w, int h);
void OnPaint(void);
void OnEvent(wxMouseEvent &mevt);
// constants
// Colourspace canvas border
static const int colcanv_cborder;
// Height of markers on colourspace canvas
static const int colcanv_mheight;
protected:
int setupRectangle(int &from, int &to, float &x, wxRect *rect);
void drawOutline(double peak, double sigma, wxPen *pen, wxRect *rect);
void drawOutlineSum(wxPen *pen, wxRect *rect);
// Function pointer
double (*conversionFunction)(double, double, double);
colourspaceFrame *parentObj;
colourspace_params *params;
int canvX, canvY;
wxBrush brush;
wxPen redPen, greenPen, bluePen, blackPen;
wxFont *font;
float *values;
float height, base, step;
int cmin, cmax;
};
/*
* Colourspace configuration window
*/
class colourspaceFrame: public rviewFrame
{
public:
colourspaceFrame(colourspaceMapper *parent, const colourspace_params *p);
~colourspaceFrame(void);
void setRange(double newMinVal, double newMaxVal);
void unlinkParent(void);
void OnSize(int w, int h);
void label(void);
int process(wxObject &obj, wxEvent &evt);
void updateSettings(void);
void updateDisplay(const colourspace_params *cp=NULL);
void processMouseEvent(wxMouseEvent &mevt);
virtual const char *getFrameName(void) const;
virtual rviewFrameType getFrameType(void) const;
// constants
// Colourspace editor borders
static const int colspc_border;
// Colourspace editor window
static const int colspc_width;
static const int colspc_height;
// Colourspace buttons
static const int colspc_bwidth;
static const int colspc_bheight;
// Colourspace text widgets
static const int colspc_twidth;
static const int colspc_theight;
// Colourspace checkbox widgets
static const int colspc_chkheight;
// Colourspace choice widgets
static const int colspc_chwidth;
static const int colspc_chheight;
// Colourspace control panel height
static const int colspc_cheight;
private:
void makeUpdate(void);
colourspaceMapper *parentObj;
colourspace_params newParams;
colourspace_params origParams; // in case of immediate update
colourspaceCanvas *canvas;
wxPanel *panel;
rviewText *posR, *posG, *posB;
rviewText *sigR, *sigG, *sigB;
rviewButton *okBut, *cancelBut, *defaultBut;
rviewCheckBox *immediateUpdate;
rviewCheckBox *drawSum;
rviewText *minVal, *maxVal;
rviewChoice *csType;
bool doImmediateUpdate;
bool doDrawSum;
cspaceType cstype;
float mousex, mousey;
int mousebut;
int dragColour;
int canvX, canvY;
int didUpdate;
};
// modes for calling processRange
#define CSPACE_RANGE_ACTUAL 0
#define CSPACE_RANGE_FULL 1
#define CSPACE_RANGE_OLD 2
/*
* Class for mapping large range values to RGB colourspace,
* implemented in rviewImage.cpp
*/
class colourspaceMapper
{
public:
colourspaceMapper(r_Ref &mdd, rviewBaseType bt, const colourspace_params *cp, bool fullrange=FALSE, const r_Minterval *domain=NULL, unsigned long frange=0x10000);
~colourspaceMapper(void);
void getObject(r_Ref &mdd, rviewBaseType &bt, bool *fullrange=NULL, r_Minterval **domain=NULL) const;
int bindMapper(r_Ref &mdd, rviewBaseType bt, bool fullrange=FALSE, const r_Minterval *domain=NULL, const colourspace_params *cp=NULL);
inline unsigned short ValToCS15(double value) {return (this->*convert15)(value);}
inline unsigned long ValToCS24(double value) {return (this->*convert24)(value);}
unsigned short *buildCSTab15(bool forceRebuild=FALSE);
unsigned long *buildCSTab24(bool forceRebuild=FALSE);
double getMinVal(void);
double getMaxVal(void);
double getScalingFactor(void);
unsigned short *getCSTab15(void);
unsigned long *getCSTab24(void);
void processRange(int rangeMode);
void updateProjection(const r_Minterval *domain);
void colourspaceChanged(const colourspace_params *newParams, bool autoUpdate=TRUE);
void openEditor(void);
void closeEditor(bool activeClose=TRUE);
void getParameters(colourspace_params *dest);
void setMappingFunctions(void);
protected:
static int getTableForType(rviewBaseType bt);
unsigned short ValToGauss15(double value);
unsigned long ValToGauss24(double value);
unsigned short ValToLinear15(double value);
unsigned long ValToLinear24(double value);
unsigned short ValToRectangle15(double value);
unsigned long ValToRectangle24(double value);
unsigned short ValToAsymptotic15(double value);
unsigned long ValToAsymptotic24(double value);
// function pointers
unsigned short (colourspaceMapper::*convert15)(double value);
unsigned long (colourspaceMapper::*convert24)(double value);
colourspace_params par; // all the important parameters
double realMinVal, realMaxVal; // actual range of object
bool didRange;
bool rangeModeFull;
double peakR, peakG, peakB;
double invSigR, invSigG, invSigB;
double scalingFactor;
int dimMDD;
int tableKind; // 15 or 24bpp tables?
unsigned short *IntToRGBTab15;
unsigned long *IntToRGBTab24;
cspaceType tableType;
colourspaceFrame *csFrame;
r_Ref mddObj;
rviewBaseType baseType;
long projPixels;
r_Minterval objInterv;
r_Minterval lastInterv;
const r_Minterval *useInterv;
};
#endif