campo-sirio/fd/gtArt.cpp
guy 5fda198f65 Prima versione programma firma digitale
git-svn-id: svn://10.65.10.50/branches/R_10_00@22947 c028cbd2-c16b-5b4b-a496-9718f37d4682
2014-05-16 12:58:15 +00:00

408 lines
12 KiB
C++

#include "wxinc.h"
#include "gtArt.h"
#include <wx/filename.h>
#include <wx/rawbmp.h>
extern wxColor wxAuiStepColour(const wxColor& c, int ialpha);
///////////////////////////////////////////////////////////
// HSLColor
///////////////////////////////////////////////////////////
inline wxColourBase::ChannelType Y601(wxColourBase::ChannelType r,
wxColourBase::ChannelType g,
wxColourBase::ChannelType b)
{ return 0.299*r + 0.587*g + 0.114*b; }
inline wxColourBase::ChannelType Luma(const wxColour& col)
{ return Y601(col.Red(), col.Green(), col.Blue()); }
static wxColourBase::ChannelType ModulatedChannel(wxColourBase::ChannelType c, int val)
{
int k = c;
if (val > 0)
k = (c * (100-val) + 255 * val) / 100;
else
k = c * (100+val) / 100;
if (k < 0) k = 0; else
if (k > 255) k = 255;
return k;
}
// val: -100 = wxBLACK; 0 = Same color; +100 = wxWHITE
wxColour ModulatedColor(const wxColour& col, int val)
{
// return col.ChangeLightness(100 + val);
wxColourBase::ChannelType r = ModulatedChannel(col.Red(), val);
wxColourBase::ChannelType g = ModulatedChannel(col.Green(), val);
wxColourBase::ChannelType b = ModulatedChannel(col.Blue(), val);
return wxColour(r, g, b);
}
inline wxColour GrayedColor(const wxColour& col)
{
const wxColourBase::ChannelType y1 = Luma(col);
return wxColour(y1,y1,y1);
}
wxColour gtContrastingColor(const wxColour& col)
{
const wxColourBase::ChannelType y1 = Luma(col);
return y1 > 128 ? *wxBLACK : *wxWHITE;
}
///////////////////////////////////////////////////////////
// gtToolBarArt
///////////////////////////////////////////////////////////
void gtToolBarArt::DrawBackground(wxDC& dc, wxWindow* window, int orientation, const wxRect &rect)
{
if (!gtAuiManager::DrawBackground(dc, window, orientation, rect))
wxAuiDefaultDockArt::DrawBackground(dc, window, orientation, rect);
}
void gtToolBarArt::DrawSash(wxDC& dc, wxWindow *window, int orientation, const wxRect& rect)
{ DrawBackground(dc, window, orientation, rect); }
gtToolBarArt::gtToolBarArt()
{
wxColour base, light, dark, text;
if (gtAuiManager::BaseColours(base, light, dark, text))
{
SetColour(wxAUI_DOCKART_BACKGROUND_COLOUR, base);
SetColour(wxAUI_DOCKART_SASH_COLOUR, base);
SetColour(wxAUI_DOCKART_ACTIVE_CAPTION_COLOUR, base);
SetColour(wxAUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR, light);
SetColour(wxAUI_DOCKART_ACTIVE_CAPTION_TEXT_COLOUR, text);
SetColour(wxAUI_DOCKART_INACTIVE_CAPTION_COLOUR, dark);
SetColour(wxAUI_DOCKART_INACTIVE_CAPTION_GRADIENT_COLOUR, base);
const wxColourBase::ChannelType g = Luma(dark) > 128 ? 64 : 192;
SetColour(wxAUI_DOCKART_INACTIVE_CAPTION_TEXT_COLOUR, wxColour(g,g,g));
SetColour(wxAUI_DOCKART_BORDER_COLOUR, dark);
}
}
///////////////////////////////////////////////////////////
// gtTabArt
///////////////////////////////////////////////////////////
wxAuiTabArt* gtTabArt::Clone()
{
gtTabArt* ta = new gtTabArt;
return ta;
}
gtTabArt::gtTabArt()
{
wxColour base, light, dark, text;
if (gtAuiManager::BaseColours(base, light, dark, text))
{
m_border_pen = wxPen(ModulatedColor(base, 75));
m_base_colour = base;
m_base_colour_pen = wxPen(base);
m_base_colour_brush = wxBrush(base);
}
}
///////////////////////////////////////////////////////////
// gtAuiManager
///////////////////////////////////////////////////////////
bool gtAuiManager::BaseColours(wxColour& base, wxColour& light, wxColour& dark, wxColour& text)
{
const wxSize sz(256,256);
wxBitmap bmp = wxArtProvider::GetBitmap(wxArtID(wxT("Skin")), wxART_OTHER, sz);
if (bmp.IsOk())
{
wxColourBase::ChannelType ldark = 255, llight = 0;
dark = *wxWHITE;
light = *wxBLACK;
wxNativePixelData data(bmp);
const int dim = data.GetHeight();
wxNativePixelData::Iterator p(data);
double r = 0, g = 0, b = 0;
for (int i = 0; i < dim; i++)
{
p.MoveTo(data, i, i);
r += p.Red();
g += p.Green();
b += p.Blue();
const wxColour col(p.Red(), p.Green(), p.Blue());
const wxColourBase::ChannelType lcol = Luma(col);
if (lcol < ldark)
{
dark = col;
ldark = lcol;
}
if (lcol > llight)
{
light = col;
llight = lcol;
}
}
r /= dim; g /= dim; b /= dim;
base = wxColour(r, g, b);
const wxColourBase::ChannelType lbase = Luma(base);
if (lbase - ldark < 40)
dark = ModulatedColor(dark, -(40 - lbase + ldark));
if (llight - lbase < 40)
light = ModulatedColor(light, +(40 - llight + lbase));
text = gtContrastingColor(base);
}
return bmp.IsOk();
}
bool gtAuiManager::DrawBackground(wxDC& dc, wxWindow* WXUNUSED(window),
int WXUNUSED(orientation), const wxRect &rect)
{
const wxBitmap bmp = wxArtProvider::GetBitmap(wxArtID(wxT("Skin")), wxART_OTHER, wxSize(256,256));
if (bmp.IsOk())
{
const wxSize szBm(bmp.GetWidth(), bmp.GetHeight());
for (wxCoord y = rect.y; y < rect.GetBottom(); y += szBm.y)
{
for (wxCoord x = rect.x; x < rect.GetRight(); x += szBm.x)
dc.DrawBitmap(bmp, x, y);
}
}
return bmp.IsOk();
}
gtAuiManager::gtAuiManager()
{
SetArtProvider(new gtToolBarArt);
}
///////////////////////////////////////////////////////////
// plnHolidayAutority
///////////////////////////////////////////////////////////
class gtHolidayAutority : public wxDateTimeWorkDays
{
protected:
virtual bool DoIsHoliday(const wxDateTime& dt) const;
virtual size_t DoGetHolidaysInRange(const wxDateTime& dtStart, const wxDateTime& dtEnd,
wxDateTimeArray& holidays) const;
};
bool gtHolidayAutority::DoIsHoliday(const wxDateTime& dt) const
{
const wxDateTime::Month m = dt.GetMonth();
const wxDateTime::wxDateTime_t d = dt.GetDay();
switch (m)
{
case wxDateTime::Jan:
if (d == 1 || d == 6) // Capodanno ed Epifania
return true;
break;
case wxDateTime::Apr:
if (d == 25) // 25 Aprile
return true;
break;
case wxDateTime::May:
if (d == 1)
return true; // I Maggio
break;
case wxDateTime::Jun:
if (d == 2) // Festa della Repubblica
return true;
break;
case wxDateTime::Aug:
if (d == 15) // Ferragosto
return true;
break;
case wxDateTime::Nov:
if (d == 1) // Ognissanti
return true;
break;
case wxDateTime::Dec:
if (d == 8 || d == 25 || d == 26) // Immacolata, Natale e Santo Stefano
return true;
break;
default: break;
}
const wxDateTime::WeekDay wd = dt.GetWeekDay();
if (wd == wxDateTime::Sun || wd == wxDateTime::Sat)
return true;
if (wd == wxDateTime::Mon && (m == wxDateTime::Mar || m == wxDateTime::Apr))
{
const int y = dt.GetYear();
const int correction = y < 2100 ? 0 : 1; // Semplificazione tabella dal 1600 al 2500
int d = (19 * (y%19) + 24) % 30;
d += 22 + ((2*(y%4) + 4*(y%7) + 6*d + 5 + correction) % 7);
int m = 3;
if (d > 31)
{
d -= 31;
m++;
}
const wxDateTime easter(d, wxDateTime::Month(m-1), y);
if (easter == dt - wxDateSpan(0,0,0,1))
return true;
}
return false;
}
size_t gtHolidayAutority::DoGetHolidaysInRange(const wxDateTime& dtStart, const wxDateTime& dtEnd,
wxDateTimeArray& holidays) const
{
for (wxDateTime dt = dtStart; dt <= dtEnd; dt += wxDateSpan(0,0,0,1))
{
if (DoIsHoliday(dt))
holidays.Add(dt);
}
return holidays.GetCount();
}
///////////////////////////////////////////////////////////
// gtArtProvider
///////////////////////////////////////////////////////////
class gtArtProvider : public wxArtProvider
{
wxString m_strSkin;
protected:
wxSize AdjustedSize(const wxArtClient& client, const wxSize& size) const;
virtual wxBitmap CreateBitmap(const wxArtID& id, const wxArtClient& client, const wxSize& size);
public:
gtArtProvider();
};
wxSize gtArtProvider::AdjustedSize(const wxArtClient& client, const wxSize& size) const
{
if (size != wxDefaultSize)
return size;
if (client == wxART_MENU)
return wxSize(16,16);
if (client == wxART_TOOLBAR)
return wxSize(48,48);
wxSize sz = wxArtProvider::GetSizeHint(client);
if (sz == wxDefaultSize)
{
if (client == wxART_OTHER)
sz = size;
else
sz.x = sz.y = 32;
}
return sz;
}
wxBitmap gtArtProvider::CreateBitmap(const wxArtID& id, const wxArtClient& client, const wxSize& size)
{
const wxSize sz = AdjustedSize(client, size);
wxString strName = id;
long tool = 0;
bool bOverriding = false;
if (strName.StartsWith(wxT("wxART")))
{
if (id == wxART_FILE_OPEN) tool = wxID_OPEN; else
if (id == wxART_FILE_SAVE) tool = wxID_SAVE; else
if (id == wxART_FILE_SAVE_AS) tool = wxID_SAVEAS; else
if (id == wxART_NEW) tool = wxID_NEW; else
if (id == wxART_HELP) tool = wxID_HELP; else
return wxNullBitmap;
bOverriding = true;
}
else
{
if (strName.CmpNoCase(wxT("Skin"))==0 && !m_strSkin.IsEmpty())
strName = m_strSkin;
}
if (tool > 0 || id.ToLong(&tool))
{
if (client == wxART_TOOLBAR || client == wxART_BUTTON)
strName.Printf(wxT("res/tool_%ld.png"), tool); else
if (client == wxART_OTHER)
strName.Printf(wxT("res/image_%ld.png"), tool);
else
strName.Printf(wxT("res/icon_%ld.png"), tool);
}
else
strName.MakeLower();
if (!strName.EndsWith(wxT(".png")))
strName << wxT(".png");
bool bFound = wxFileName::FileExists(strName);
if (!bFound && !strName.StartsWith(wxT("res/")))
{
strName.Prepend(wxT("res/"));
bFound = wxFileName::FileExists(strName);
}
if (!bFound && !bOverriding && tool > wxID_LOWEST && tool < wxID_HIGHEST)
{
switch (tool)
{
case wxID_OPEN : strName = wxART_FILE_OPEN; break;
case wxID_SAVE : strName = wxART_FILE_SAVE; break;
case wxID_SAVEAS : strName = wxART_FILE_SAVE_AS; break;
case wxID_NEW : strName = wxART_NEW; break;
case wxID_HELP : strName = wxART_HELP; break;
case wxID_PREFERENCES : strName = wxART_HELP_SETTINGS; break;
default : strName = wxEmptyString; break;
}
if (strName.StartsWith(wxT("wxART")))
return wxArtProvider::GetBitmap(strName, client, sz);
}
if (!bFound)
return wxNullBitmap;
wxBitmap bmp;
if (bmp.LoadFile(strName, wxBITMAP_TYPE_ANY))
{
const wxSize szOld(bmp.GetWidth(), bmp.GetHeight());
if (szOld != sz)
{
wxSize szNew = sz;
if (szOld.x >= szOld.y)
szNew.y = sz.x * szOld.y / szOld.x;
else
szNew.x = sz.y * szOld.x / szOld.y;
bmp = wxBitmap(bmp.ConvertToImage().Scale(szNew.x, szNew.y, wxIMAGE_QUALITY_HIGH));
}
}
else
bmp.Create(sz.x, sz.y);
return bmp;
}
gtArtProvider::gtArtProvider()
{
const wxString strSkin = wxT("res/skin.png");
if (wxFileName::FileExists(strSkin))
m_strSkin = strSkin;
}
void gtInitArtProvider()
{
::wxInitAllImageHandlers();
wxArtProvider::Push(new gtArtProvider);
wxDateTimeHolidayAuthority::AddAuthority(new gtHolidayAutority);
}