campo-sirio/include/colors.cpp
guy 99fbfa77a3 Patch level : 2.1 nopatch
Files correlati     :
Ricompilazione Demo : [ ]
Commento            :

Aggiunte per reports


git-svn-id: svn://10.65.10.50/trunk@12164 c028cbd2-c16b-5b4b-a496-9718f37d4682
2004-06-08 10:05:24 +00:00

350 lines
9.3 KiB
C++
Executable File

#include <colmask.h>
#include <colors.h>
#include <config.h>
COLOR RGB2COLOR(unsigned char red, unsigned char green, unsigned char blue)
{
COLOR def = MAKE_COLOR(red, green, blue);
// Se nel colore non compare l'indice cerca di calcolarlo
const unsigned char color_index = (unsigned char)(def >> 12);
if (color_index <= 0x0 || color_index > 0xF)
{
const COLOR native_color[11] = { COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_CYAN,
COLOR_MAGENTA, COLOR_YELLOW, COLOR_BLACK, COLOR_DKGRAY,
COLOR_GRAY, COLOR_LTGRAY, COLOR_WHITE };
def &= 0x00FFFFFF;
for (int c = 0; c < 11; c++)
{
// Confronta solo la terna R,G,B
if (def == (native_color[c] & 0x00FFFFFF))
{
def = native_color[c];
break;
}
}
}
return def;
}
COLOR choose_color(COLOR col, WINDOW win)
{
return xvt_dm_post_choose_color(win, col);
}
COLOR blend_colors(COLOR col1, COLOR col2, double perc)
{
const unsigned int r1 = XVT_COLOR_GET_RED(col1);
const unsigned int g1 = XVT_COLOR_GET_GREEN(col1);
const unsigned int b1 = XVT_COLOR_GET_BLUE(col1);
const unsigned int r2 = XVT_COLOR_GET_RED(col2);
const unsigned int g2 = XVT_COLOR_GET_GREEN(col2);
const unsigned int b2 = XVT_COLOR_GET_BLUE(col2);
const byte r = byte(r1 * perc + r2*(1.0-perc));
const byte g = byte(g1 * perc + g2*(1.0-perc));
const byte b = byte(b1 * perc + b2*(1.0-perc));
// return RGB2COLOR(r, g, b);
return MAKE_COLOR(r, g, b); // Faster
}
unsigned int color_distance(COLOR col1, COLOR col2)
{
if ((col1 & 0x00FFFFFF) == (col2 & 0x00FFFFFF))
return 0;
const int r1 = XVT_COLOR_GET_RED(col1);
const int g1 = XVT_COLOR_GET_GREEN(col1);
const int b1 = XVT_COLOR_GET_BLUE(col1);
const int r2 = XVT_COLOR_GET_RED(col2);
const int g2 = XVT_COLOR_GET_GREEN(col2);
const int b2 = XVT_COLOR_GET_BLUE(col2);
const int r = abs(r1-r2);
const int g = abs(g1-g2);
const int b = abs(b1-b2);
return (r > g && r > b) ? r : (g > b ? g : b);
}
class TColor_row_mask : public TMask
{
public:
virtual void update();
TColor_row_mask();
virtual ~TColor_row_mask() { }
};
///////////////////////////////////////////////////////////
// TColor_row_mask
///////////////////////////////////////////////////////////
TColor_row_mask::TColor_row_mask()
: TMask("bagn007", 1)
{
}
void TColor_row_mask::update()
{
TSheet_field* s = get_sheet();
if (s == NULL)
return;
TSelect_color_mask& m = (TSelect_color_mask&)s->mask();
COLOR back, fore;
m.get_cur_colors(back, fore);
_pixmap = TRUE;
set_pen(COLOR_BLACK);
RCT rct; field(100).get_rect(rct);
set_brush(back);
frame(rct.left, 2*rct.top - rct.bottom - CHARY/2, rct.right, rct.top - CHARY/2, 0);
field(99).get_rect(rct);
set_brush(fore);
frame(rct.left, 2*rct.top - rct.bottom - CHARY/2, rct.right, rct.top - CHARY/2, 0);
_pixmap = FALSE;
}
///////////////////////////////////////////////////////////
// TColor_object_props
///////////////////////////////////////////////////////////
class TColor_object_props : public TObject
{
TString _key;
TString _prompt;
COLOR _back;
COLOR _fore;
COLOR _back_def;
COLOR _fore_def;
protected:
public:
void set_key(const char * key) { _key = key; }
void set_prompt(const char * prompt) { _prompt = prompt; }
void set_back(COLOR back) { _back = back; }
void set_fore(COLOR fore) { _fore = fore; }
void set_back_def(COLOR back) { _back_def = back; }
void set_fore_def(COLOR fore) { _fore_def = fore; }
const TString & get_key() const { return _key; }
const TString & get_prompt() const { return _prompt; }
COLOR get_back() const { return _back; }
COLOR get_fore() const { return _fore; }
COLOR get_back_def() const { return _back_def; }
COLOR get_fore_def() const { return _fore_def; }
TColor_object_props(const char * key, const char * prompt, COLOR back, COLOR fore);
virtual ~TColor_object_props() {}
};
TColor_object_props::TColor_object_props(const char * key, const char * prompt, COLOR back, COLOR fore)
: _key(key), _prompt(prompt), _back(back), _fore(fore), _back_def(back), _fore_def(fore)
{
}
///////////////////////////////////////////////////////////
// TSelect_color_mask
///////////////////////////////////////////////////////////
bool TSelect_color_mask::color_handler(TMask_field& f, KEY k)
{
if (k == K_SPACE)
{
TMask& m = f.mask();
TSelect_color_mask& cm = (TSelect_color_mask&)m.get_sheet()->mask();
TSheet_field& s = cm.sfield(101);
const int cur = s.selected();
TColor_object_props & p = *cm.row(cur);
const bool use_back = f.dlg() == 100;
COLOR col = use_back ? p.get_back() : p.get_fore();
col = choose_color(col, m.win());
if (col != COLOR_INVALID)
{
if (use_back)
p.set_back(col);
else
p.set_fore(col);
cm._sheet_mask->update();
m.set_focus();
s.set_back_and_fore_color(p.get_back(), p.get_fore(), cur);
s.force_update();
}
}
return TRUE;
}
bool TSelect_color_mask::reset_handler(TMask_field& f, KEY k)
{
if (k == K_SPACE && f.yesno_box("Si desidera azzerare tutti i colori?"))
{
TSelect_color_mask& cm = (TSelect_color_mask&)f.mask();
TSheet_field& s = cm.sfield(101);
const int items = cm.items();
for (int i = 0; i < items; i++)
{
TColor_object_props & p = *cm.row(i);
const COLOR back = p.get_back_def();
const COLOR fore = p.get_fore_def();
p.set_back(back);
p.set_fore(fore);
s.set_back_and_fore_color(back, fore, i);
}
s.force_update();
}
if (k == K_ENTER)
{
TSelect_color_mask& cm = (TSelect_color_mask&)f.mask();
cm.save();
}
return TRUE;
}
int TSelect_color_mask::add_color_def(const char * key, const char * prompt, COLOR back, COLOR fore)
{
TColor_object_props * p = new TColor_object_props(key, prompt, back, fore);
TSheet_field& s = sfield(101);
const int row = _color_defs.add(p);
TToken_string& riga = s.row(-1);
riga << p->get_prompt();
TString tmp(_mask_name) ; tmp << "_" << _paragraph;
TConfig conf(CONFIG_GUI, tmp);
tmp = p->get_key();
if (conf.exist(tmp))
p->set_fore(conf.get_color(tmp));
tmp << "_Bg";
if (conf.exist(tmp))
p->set_back(conf.get_color(tmp));
s.set_back_and_fore_color(p->get_back(), p->get_fore(), row);
return row;
}
void TSelect_color_mask::get_color_def(const char * key, COLOR & back, COLOR & fore) const
{
const int pos = key2pos(key);
if (pos >= 0)
{
back = get_back_color(pos);
fore = get_fore_color(pos);
}
else
{
back = NORMAL_BACK_COLOR;
fore = NORMAL_COLOR;
}
}
int TSelect_color_mask::key2pos(const char * key) const
{
const int items = _color_defs.items();
for (int i = 0; i < items; i++)
if (((TColor_object_props &) _color_defs[i]).get_key() == key)
return i;
return -1;
}
COLOR TSelect_color_mask::get_back_color(int pos) const
{
return ((TColor_object_props &) _color_defs[pos]).get_back();
}
COLOR TSelect_color_mask::get_fore_color(int pos) const
{
return ((TColor_object_props &) _color_defs[pos]).get_fore();
}
TMask * TSelect_color_mask::get_mask(int, TMask& m)
{
return ((TSelect_color_mask &) m.get_sheet()->mask())._sheet_mask;
}
void TSelect_color_mask::get_cur_colors(COLOR & back, COLOR & fore) const
{
TSheet_field& s = sfield(101);
int cur = s.selected();
TColor_object_props & p = *row(cur);
back = p.get_back();
fore = p.get_fore();
}
void TSelect_color_mask::init(const char * mask_name, const char * para)
{
set_handler(102, reset_handler);
_sheet_mask = new TColor_row_mask;
_sheet_mask->set_handler(99, color_handler);
_sheet_mask->set_handler(100, color_handler);
TVariable_sheet_field& s = (TVariable_sheet_field&) sfield(101);
s.set_getmask(get_mask);
_mask_name = mask_name;
_mask_name.ext("");
_paragraph = para;
}
TSelect_color_mask::TSelect_color_mask(const TSheet_field & field)
: TVariable_mask("bagn007")
{
const TMask& m = field.mask();
TString16 para("Colors");
const int num = field.sheet_mask().number() - 1;
if (num > 0)
para << num;
init(m.source_file(), para);
}
void TSelect_color_mask::save() const
{
TString tmp(_mask_name) ; tmp << "_" << _paragraph;
TConfig conf(CONFIG_GUI, tmp);
const int items = _color_defs.items();
for (int i = 0; i < items; i++)
{
TColor_object_props & p = *row(i);
tmp = p.get_key();
if (p.get_fore() == p.get_fore_def())
conf.remove(tmp);
else
conf.set_color(tmp, p.get_fore());
tmp << "_Bg";
if (p.get_back() == p.get_back_def())
conf.remove(tmp);
else
conf.set_color(tmp, p.get_back());
}
}
TSelect_color_mask::TSelect_color_mask(const char * mask_name, const char * para)
: TVariable_mask("bagn007")
{
init(mask_name, para);
}
TSelect_color_mask::~TSelect_color_mask()
{
delete _sheet_mask;
}