diff --git a/include/codeb.c b/include/codeb.c index 1b9e842b8..1ef91df6a 100755 --- a/include/codeb.c +++ b/include/codeb.c @@ -459,7 +459,7 @@ int DB_add(int handle) if (rt == 0 && is_locked == 0) { while ((rt = d4flush(data)) == r4locked) - u4delaySec(); + u4delaySec(); } } DB_unlock(handle); @@ -1168,7 +1168,7 @@ int DB_memowrite( const int handle, const char * fieldname, const char * data ) if (ret == 0 && !DB_file_locked(handle)) { d4flush(dbdata[handle]); - d4unlock(dbdata[handle]); + d4unlock(dbdata[handle]); } return ret; } diff --git a/include/colors.cpp b/include/colors.cpp index 3337e53f3..33ae82c3a 100755 --- a/include/colors.cpp +++ b/include/colors.cpp @@ -46,8 +46,16 @@ COLOR blend_colors(COLOR col1, COLOR col2, double 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 + return MAKE_COLOR(r, g, b); +} + +COLOR grayed_color(COLOR col) +{ + const unsigned int r = XVT_COLOR_GET_RED(col); + const unsigned int g = XVT_COLOR_GET_GREEN(col); + const unsigned int b = XVT_COLOR_GET_BLUE(col); + const unsigned int k = (unsigned int)(0.299 * r + 0.587 * g + 0.114 * b); + return MAKE_COLOR(k, k, k); } unsigned int color_distance(COLOR col1, COLOR col2) diff --git a/include/colors.h b/include/colors.h index 84fa3c655..dc68a99f9 100755 --- a/include/colors.h +++ b/include/colors.h @@ -12,6 +12,7 @@ COLOR RGB2COLOR(unsigned char red, unsigned char green, unsigned char blue); COLOR choose_color(COLOR col = COLOR_BLACK, WINDOW win = NULL_WIN); COLOR blend_colors(COLOR col1, COLOR col2, double perc = 0.5); +COLOR grayed_color(COLOR col); unsigned int color_distance(COLOR col1, COLOR col2); extern COLOR MASK_BACK_COLOR; diff --git a/include/controls.cpp b/include/controls.cpp index 41fff8cfe..c97bec19e 100755 --- a/include/controls.cpp +++ b/include/controls.cpp @@ -85,22 +85,25 @@ KEY TControl::xiev_to_key(const XI_EVENT* xiev) // TPicture_array /////////////////////////////////////////////////////////// -class TPicture_array : public TArray +class TPicture_array { + TArray _enabled, _disabled; + public: bool add(short id); - const TImage& image(short id) const { return (const TImage&)operator[](id); } - bool exist(short id) const { return objptr(id) != NULL; } + const TImage& image(short id) const { return (const TImage&)_enabled[id]; } + const TImage& disabled_image(short id) const { return (const TImage&)_disabled[id]; } + bool exist(short id) const { return _enabled.objptr(id) != NULL; } void reload(); - TPicture_array() : TArray(128) {} + TPicture_array() {} virtual ~TPicture_array() {} }; bool TPicture_array::add(short id) { - TImage* i = (TImage*)objptr(id); + TImage* i = (TImage*)_enabled.objptr(id); if (i == NULL) { if (SMALL_ICONS) @@ -117,7 +120,11 @@ bool TPicture_array::add(short id) if (i->ok()) { i->convert_transparent_color(BTN_BACK_COLOR); - TArray::add(i, id); + _enabled.add(i, id); + + TImage* d = new TImage(*i); + d->fade_to_gray(COLOR_GRAY); + _disabled.add(d, id); } else { @@ -130,9 +137,10 @@ bool TPicture_array::add(short id) void TPicture_array::reload() { - for (short id = last(); id > 0; id--) if (exist(id)) + _disabled.destroy(); + for (int id = _enabled.last(); id > 0; id = _enabled.pred(id)) { - destroy(id); + _enabled.destroy(id); add(id); } } @@ -1675,7 +1683,7 @@ void TPushbutton_control::update() const short bmp = (_bmp_dn > 0 && _obj->v.btn->down) ? _bmp_dn : _bmp_up; if (bmp > 0) { - const TImage& i = _picture->image(bmp); + const TImage& i = attrib & XI_ATR_ENABLED ? _picture->image(bmp) : _picture->disabled_image(bmp); if (!SMALL_ICONS || i.width() > i.height()*2) { int x = (rct.right + rct.left - i.width()) / 2; @@ -1687,8 +1695,7 @@ void TPushbutton_control::update() } i.draw(win, x, y); - - if (!(attrib & XI_ATR_ENABLED)) + /* if (!(attrib & XI_ATR_ENABLED)) { CPEN pen; pen.width = 1; @@ -1710,7 +1717,7 @@ void TPushbutton_control::update() p.v += i.height(); xvt_dwin_draw_line(win, p); } - } + } */ } else { @@ -2501,4 +2508,4 @@ TListbox_control::TListbox_control(WINDOW win, short cid, TListbox_control::~TListbox_control() { delete _ddl; _ddl = NULL; -} \ No newline at end of file +} diff --git a/include/dongle.h b/include/dongle.h index 35ca703e7..bdbce3a7b 100755 --- a/include/dongle.h +++ b/include/dongle.h @@ -10,7 +10,7 @@ #endif enum TDongleHardware { _dongle_unknown, _dongle_hardlock, _dongle_eutron, _dongle_network }; -enum TDongleType { _no_dongle, _user_dongle, _developer_dongle, _aga_dongle, _prassi_dongle }; +enum TDongleType { _no_dongle, _user_dongle, _developer_dongle, _aga_dongle }; enum { MAX_DONGLE_ASSIST = 8 }; class TDongle : public TObject diff --git a/include/image.cpp b/include/image.cpp index 9a212914a..2270c9936 100755 --- a/include/image.cpp +++ b/include/image.cpp @@ -78,18 +78,7 @@ TImage::TImage(const TImage& im, short w, short h) : _image(NULL) set(xvt_image_create(fmt, w, h, 0L)); 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% @@ -288,3 +277,49 @@ void TImage::convert_transparent_color(COLOR transparent) } } +void TImage::fade_to_gray(int gray) + // @comm Legge nell'immagine i pixel diversi da quello in alto a sinistra e li setta + // in grigio +{ + if (_image == NULL) + return; // Null image + + const COLOR trans = get_pixel(0,0) & 0x00FFFFFF; + if (xvt_image_get_format(_image) == XVT_IMAGE_CL8) + { + for (int index = xvt_image_get_ncolors(_image)-1; index >=0; index--) + { + COLOR pixie = xvt_image_get_clut(_image, index) & 0x00FFFFFF; + if (pixie != trans) + { + pixie = grayed_color(pixie); + if (gray >= 0) + { + const int k = (XVT_COLOR_GET_RED(pixie) + gray) / 2; + pixie = MAKE_COLOR(k,k,k); + } + xvt_image_set_clut(_image, index, pixie); + } + } + } + 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++) + { + COLOR pixie = get_pixel(x, y) & 0x00FFFFFF; + if (pixie != trans) + { + pixie = grayed_color(pixie); + if (gray >= 0) + { + const int k = (XVT_COLOR_GET_RED(pixie) + gray) / 2; + pixie = MAKE_COLOR(k,k,k); + } + set_pixel(x, y, pixie); + } + } + } +} + + diff --git a/include/image.h b/include/image.h index ad31a5d6e..f64e9bd92 100755 --- a/include/image.h +++ b/include/image.h @@ -80,6 +80,10 @@ public: // @cmember Setta i colori dell'immagine in modo da renderla trasparente // usando l'angolo in alto a sinistra dell'imagine stessa void convert_transparent_color(COLOR transparent); + + // Trasforma l'immagine in toni di grigio. + // Se gray>=0 sfuma ulteriormente verso il tono specificato + void fade_to_gray(int gray = -1); // @cmember Setta l'
.esime entry della paletta al colore
void set_clut(byte n, COLOR c); diff --git a/include/reprint.cpp b/include/reprint.cpp index 44c115948..9ebe2cabe 100755 --- a/include/reprint.cpp +++ b/include/reprint.cpp @@ -1452,9 +1452,8 @@ bool TBook::print_page(TWindow& win, size_t page) bool TBook::export_text(const TFilename& fname) { - const TFixed_string ext(fname.ext()); - if (ext.compare("pdf", true) == 0) - export_pdf(fname); + if (fname.ends_with(".pdf", true)) + return export_pdf(fname); TString str(1024); char* buffer = str.get_buffer();