ffccf3bbea
Files correlati : Ricompilazione Demo : [ ] Commento : colors.* Aggiunta funzione per calcolo distanza tra colori per gestione trasparenze in menu principale dongle.cpp Corretta gestione chiave Eutron normale (non SV) image.cpp Migliorata gestion etrasparenze progind.cpp Corretta gestione messaggi su piu' righe relapp.cpp Corretta traduzione messaggi di richiesta salvataggio validate.cpp Sostituita TFixed_string errata con la corretta const TString& git-svn-id: svn://10.65.10.50/trunk@11123 c028cbd2-c16b-5b4b-a496-9718f37d4682
293 lines
7.5 KiB
C++
Executable File
293 lines
7.5 KiB
C++
Executable File
#include <colors.h>
|
|
#include <image.h>
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// TImage
|
|
///////////////////////////////////////////////////////////
|
|
|
|
|
|
// Certified 99%
|
|
// @doc EXTERNAL
|
|
|
|
// @mfunc Setta l'immagine e le sue dimensioni
|
|
//
|
|
// @rdesc Ritorna l'immagine stessa
|
|
XVT_IMAGE TImage::set(
|
|
XVT_IMAGE i) // @parm Immagine da settare
|
|
|
|
// @comm L'immagine precedente viene cancellata quando viene settata una nuova
|
|
{
|
|
if (_image)
|
|
xvt_image_destroy(_image);
|
|
_image = i;
|
|
if (i)
|
|
{
|
|
_src.left = _src.top = 0;
|
|
short w, h;
|
|
xvt_image_get_dimensions(i, &w, &h);
|
|
_src.right = w;
|
|
_src.bottom = h;
|
|
_dst = _src;
|
|
}
|
|
return _image;
|
|
}
|
|
|
|
// Certified 100%
|
|
// @doc EXTERNAL
|
|
|
|
// @mfunc Legge l'immagine dal file
|
|
XVT_IMAGE TImage::load(
|
|
const char* n) // @parm Nome del file contenente l'immagine
|
|
{
|
|
// WinManager.free_handle();
|
|
XVT_IMAGE i = xvt_image_read((char*)n);
|
|
// WinManager.lock_handle();
|
|
|
|
if (i != NULL) set(i);
|
|
return i;
|
|
}
|
|
|
|
// Certified 100%
|
|
XVT_IMAGE TImage::load(short id)
|
|
{
|
|
return set(xvt_res_get_image(id));
|
|
}
|
|
|
|
|
|
// Certified 100%
|
|
TImage::TImage(const char* n) : _image(NULL)
|
|
{
|
|
if (n && *n) load(n);
|
|
}
|
|
|
|
// Certified 100%
|
|
TImage::TImage(short id) : _image(NULL)
|
|
{
|
|
if (id > 0) load(id);
|
|
}
|
|
|
|
// Certified 90%
|
|
TImage::TImage(const TImage& im, short w, short h) : _image(NULL)
|
|
{
|
|
const XVT_IMAGE_FORMAT fmt = xvt_image_get_format(im._image);
|
|
if (w < 0 || h < 0)
|
|
{
|
|
short iw, ih;
|
|
xvt_image_get_dimensions(im._image, &iw, &ih);
|
|
if (w < 0) w = iw;
|
|
if (h < 0) h = ih;
|
|
}
|
|
set(xvt_image_create(fmt, w, h, NULL));
|
|
|
|
if (ok())
|
|
{
|
|
#ifndef XVAGA
|
|
if (fmt == XVT_IMAGE_CL8)
|
|
{
|
|
const short colors = xvt_image_get_ncolors(im._image);
|
|
xvt_image_set_ncolors(_image, colors);
|
|
for (short c = 0; c < colors; c++)
|
|
xvt_image_set_clut(_image, c, xvt_image_get_clut((XVT_IMAGE)im._image, c));
|
|
}
|
|
#endif
|
|
xvt_image_transfer(_image, (XVT_IMAGE)im._image, &_src, (RCT*)&im._src);
|
|
}
|
|
}
|
|
|
|
// Certified 90%
|
|
TImage::TImage(short w, short h, XVT_IMAGE_FORMAT fmt) : _image(NULL)
|
|
{
|
|
set(xvt_image_create(fmt, w, h, NULL));
|
|
}
|
|
|
|
// Certified 100%
|
|
TImage::~TImage()
|
|
{
|
|
if (_image != NULL)
|
|
xvt_image_destroy(_image);
|
|
}
|
|
|
|
// Certified 100%
|
|
// @doc EXTERNAL
|
|
|
|
// @mfunc Permette di settare la posizione della figura
|
|
void TImage::set_pos(
|
|
int x, // @parm Coordinata x dell'immagine da settare
|
|
int y) // @parm Coordinata y dell'immagine da settare
|
|
|
|
// @comm Permette di aggiornare il mebro <p _dst> sommandogli i valori
|
|
// passati con <p x> e <p y>
|
|
{
|
|
_dst = _src;
|
|
xvt_rect_offset(&_dst, x, y);
|
|
}
|
|
|
|
// Certified 100%
|
|
void TImage::draw(WINDOW w) const
|
|
{
|
|
xvt_dwin_draw_image(w, _image, (RCT*)&_dst, (RCT*)&_src);
|
|
}
|
|
|
|
// Certified 100%
|
|
// @doc EXTERNAL
|
|
|
|
// @mfunc Permette di gestire il disegno dell'immagine sullo schermo
|
|
void TImage::draw(
|
|
WINDOW w, // @parm Immagine da disegnare
|
|
int x, // @parm Coordinata x in cui disegnare l'immagine
|
|
int y) const // @parm Coordinata y in cui disegnare l'immagine
|
|
// @parm RCT& | _src | Rettangolo contenente l'immagine da disegnare
|
|
// @parm RCT& | _dst | Rettangolo in cui disegnare l'immagine
|
|
|
|
// @syntax void draw(WINDOW w);
|
|
// @syntax void draw(WINDOW w, int x, int y);
|
|
// @syntax void draw(WINDOW w, const RCT& dst);
|
|
// @syntax void draw(WINDOW w, const RCT& dst, const RCT& src);
|
|
|
|
// @comm Nel caso utilizzo l'ultima sintassi e' possibile disegnare solo una parte
|
|
// dell'immagine, precisamente delle dimensioni <p _dst> se tale parametro e'
|
|
// minore di <p _pst>
|
|
{
|
|
RCT dst = _src;
|
|
xvt_rect_offset(&dst, x, y);
|
|
xvt_dwin_draw_image(w, _image, &dst, (RCT*)&_src);
|
|
}
|
|
|
|
// Certified 100%
|
|
void TImage::draw(WINDOW w, const RCT& dst) const
|
|
{
|
|
xvt_dwin_draw_image(w, _image, (RCT*)&dst, (RCT*)&_src);
|
|
}
|
|
|
|
// Certified 100%
|
|
void TImage::draw(WINDOW w, const RCT& dst, const RCT& src) const
|
|
{
|
|
xvt_dwin_draw_image(w, _image, (RCT*)&dst, (RCT*)&src);
|
|
}
|
|
|
|
// Certified 99%
|
|
// @doc EXTERNAL
|
|
|
|
// @mfunc Fa corrispondere la palette della finestra a quella dell'immagine
|
|
void TImage::set_palette(
|
|
WINDOW w) const // @parm Finestra a cui settare la palette
|
|
{
|
|
XVT_PALETTE wp = xvt_vobj_get_palet(w);
|
|
if (wp != NULL)
|
|
{
|
|
XVT_PALETTE p = xvt_palet_create(XVT_PALETTE_USER, NULL);
|
|
const int ncolors = xvt_palet_get_ncolors(wp);
|
|
COLOR* color = new COLOR[ncolors];
|
|
xvt_palet_get_colors(wp, color, ncolors);
|
|
xvt_palet_add_colors(p, color, ncolors);
|
|
delete color;
|
|
xvt_palet_add_colors_from_image(p, _image);
|
|
xvt_vobj_set_palet(w, p);
|
|
xvt_palet_destroy(wp);
|
|
}
|
|
}
|
|
|
|
// Certified 100%
|
|
void TImage::set_clut(byte n, COLOR c)
|
|
{
|
|
if (xvt_image_get_format(_image) == XVT_IMAGE_CL8)
|
|
xvt_image_set_clut(_image, n, c);
|
|
}
|
|
|
|
void TImage::set_pixel(int x, int y, COLOR col)
|
|
{
|
|
xvt_image_set_pixel(_image, x, y, col);
|
|
}
|
|
|
|
COLOR TImage::get_pixel(int x, int y) const
|
|
{
|
|
return xvt_image_get_pixel(_image, x, y);
|
|
}
|
|
|
|
// Certified 99%
|
|
// @doc EXTERNAL
|
|
|
|
// @mfunc Setta i colori dell'immagine in modo da renderla trasparente
|
|
void TImage::convert_to_default_colors()
|
|
|
|
// @comm Legge nell'immagine i colori CYAN e DARK_CYAN e li setta a seconda del colore
|
|
// della finestra per fare in modo di rendere trasparenti tali colori.
|
|
{
|
|
if (MASK_BACK_COLOR != COLOR_DKCYAN)
|
|
{
|
|
|
|
if (xvt_image_get_format(_image) == XVT_IMAGE_CL8)
|
|
{
|
|
for (int index = xvt_image_get_ncolors(_image)-1; index >=0; index--)
|
|
{
|
|
const COLOR c = xvt_image_get_clut(_image, index) & 0x00FFFFFF;
|
|
switch (c)
|
|
{
|
|
case COLOR_DKCYAN & 0x00FFFFFF:
|
|
xvt_image_set_clut(_image, index, MASK_BACK_COLOR); break;
|
|
case COLOR_CYAN & 0x00FFFFFF:
|
|
xvt_image_set_clut(_image, index, MASK_LIGHT_COLOR); break;
|
|
case COLOR_GRAY & 0x00FFFFFF:
|
|
xvt_image_set_clut(_image, index, MASK_DARK_COLOR); break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
short dx, dy; xvt_image_get_dimensions(_image, &dx, &dy);
|
|
for (short y = 0; y < dy; y++) for (short x = 0; x < dx; x++)
|
|
{
|
|
const COLOR c = get_pixel(x, y) & 0x00FFFFFF;
|
|
switch (c)
|
|
{
|
|
case COLOR_DKCYAN & 0x00FFFFFF:
|
|
set_pixel(x, y, MASK_BACK_COLOR); break;
|
|
case COLOR_CYAN & 0x00FFFFFF:
|
|
set_pixel(x, y, MASK_LIGHT_COLOR); break;
|
|
case COLOR_GRAY & 0x00FFFFFF:
|
|
set_pixel(x, y, MASK_DARK_COLOR); break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// @mfunc Setta i colori dell'immagine in modo da renderla trasparente
|
|
void TImage::convert_transparent_color(COLOR transparent)
|
|
|
|
// @comm Legge nell'immagine i pixel uguali a quello in alto a sinistra e li setta
|
|
// uguali allo sfondo delle maschere
|
|
{
|
|
if (_image == NULL)
|
|
return; // Null image
|
|
|
|
const COLOR trans = get_pixel(0, 0) & 0x00FFFFFF;
|
|
if (trans == (transparent & 0x00FFFFFF))
|
|
return; // Nothing to do
|
|
|
|
if (xvt_image_get_format(_image) == XVT_IMAGE_CL8)
|
|
{
|
|
for (int index = xvt_image_get_ncolors(_image)-1; index >=0; index--)
|
|
if (trans == (xvt_image_get_clut(_image, index) & 0x00FFFFFF))
|
|
{
|
|
xvt_image_set_clut(_image, index, transparent);
|
|
// break; don't break: replace all colors equal to upper left in the palette
|
|
}
|
|
}
|
|
else
|
|
{
|
|
short dx, dy; xvt_image_get_dimensions(_image, &dx, &dy);
|
|
for (short y = 0; y < dy; y++) for (short x = 0; x < dx; x++)
|
|
{
|
|
const COLOR c = get_pixel(x, y);
|
|
if (color_distance(c, trans) < 8)
|
|
set_pixel(x, y, transparent);
|
|
}
|
|
}
|
|
}
|
|
|