From d3211838bf578eb8ada5a608b66626a6bde6846a Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Thu, 14 Jun 2001 10:06:47 +0000 Subject: [PATCH] Added SetOption,GetOption[Int] to wxSystemSettings. Made native MaskBlt optional. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10563 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/settings.h | 10 ++++++++ src/msw/dc.cpp | 28 +++++++++++++++------ src/msw/settings.cpp | 51 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 7 deletions(-) diff --git a/include/wx/msw/settings.h b/include/wx/msw/settings.h index 5dad2084f5..a940901740 100644 --- a/include/wx/msw/settings.h +++ b/include/wx/msw/settings.h @@ -32,6 +32,16 @@ public: // Get a system metric, e.g. scrollbar size static int GetSystemMetric(int index); + + // User-customizable hints to wxWindows or associated libraries + // These could also be used to influence GetSystem... calls, indeed + // to implement SetSystemColour/Font/Metric + + static void SetOption(const wxString& name, const wxString& value); + static void SetOption(const wxString& name, int value); + static wxString GetOption(const wxString& name) ; + static int GetOptionInt(const wxString& name) ; + static bool HasOption(const wxString& name) ; }; #endif diff --git a/src/msw/dc.cpp b/src/msw/dc.cpp index 2a79ff7f85..edd4fe4fa5 100644 --- a/src/msw/dc.cpp +++ b/src/msw/dc.cpp @@ -781,16 +781,23 @@ void wxDC::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask if ( useMask ) { #ifdef __WIN32__ - HDC hdcMem = ::CreateCompatibleDC(GetHdc()); - ::SelectObject(hdcMem, GetHbitmapOf(bmp)); - // use MaskBlt() with ROP which doesn't do anything to dst in the mask // points - bool ok = ::MaskBlt(GetHdc(), x, y, width, height, + // On some systems, MaskBlt succeeds yet is much much slower + // than the wxWindows fall-back implementation. So we need + // to be able to switch this on and off at runtime. + bool ok = FALSE; + if (wxSystemSettings::GetOptionInt(wxT("no-maskblt")) == 0) + { + HDC hdcMem = ::CreateCompatibleDC(GetHdc()); + ::SelectObject(hdcMem, GetHbitmapOf(bmp)); + + ok = ::MaskBlt(GetHdc(), x, y, width, height, hdcMem, 0, 0, hbmpMask, 0, 0, MAKEROP4(SRCCOPY, DSTCOPY)) != 0; - ::DeleteDC(hdcMem); + ::DeleteDC(hdcMem); + } if ( !ok ) #endif // Win32 @@ -1471,7 +1478,7 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest, return FALSE; } - bool success; + bool success = FALSE; if (useMask) { @@ -1480,10 +1487,17 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest, // transparent, so use "DSTCOPY" ROP for the mask points (the usual // meaning of fg and bg is inverted which corresponds to wxWin notion // of the mask which is also contrary to the Windows one) - success = ::MaskBlt(GetHdc(), xdest, ydest, width, height, + + // On some systems, MaskBlt succeeds yet is much much slower + // than the wxWindows fall-back implementation. So we need + // to be able to switch this on and off at runtime. + if (wxSystemSettings::GetOptionInt(wxT("no-maskblt")) == 0) + { + success = ::MaskBlt(GetHdc(), xdest, ydest, width, height, GetHdcOf(*source), xsrc, ysrc, (HBITMAP)mask->GetMaskBitmap(), xsrc, ysrc, MAKEROP4(dwRop, DSTCOPY)) != 0; + } if ( !success ) #endif // Win32 diff --git a/src/msw/settings.cpp b/src/msw/settings.cpp index 9d868d66b7..133c23ab95 100644 --- a/src/msw/settings.cpp +++ b/src/msw/settings.cpp @@ -49,12 +49,16 @@ // singleton class so it can't be done in the dtor) class wxSystemSettingsModule : public wxModule { + friend class wxSystemSettings; public: virtual bool OnInit(); virtual void OnExit(); private: DECLARE_DYNAMIC_CLASS(wxSystemSettingsModule) + + static wxArrayString sm_optionNames; + static wxArrayString sm_optionValues; }; // ---------------------------------------------------------------------------- @@ -73,6 +77,9 @@ static wxFont *gs_fontDefault = NULL; IMPLEMENT_DYNAMIC_CLASS(wxSystemSettingsModule, wxModule) +wxArrayString wxSystemSettingsModule::sm_optionNames; +wxArrayString wxSystemSettingsModule::sm_optionValues; + bool wxSystemSettingsModule::OnInit() { return TRUE; @@ -80,6 +87,8 @@ bool wxSystemSettingsModule::OnInit() void wxSystemSettingsModule::OnExit() { + sm_optionNames.Clear(); + sm_optionValues.Clear(); delete gs_fontDefault; } @@ -243,3 +252,45 @@ int wxSystemSettings::GetSystemMetric(int index) } } +// Option functions (arbitrary name/value mapping) +void wxSystemSettings::SetOption(const wxString& name, const wxString& value) +{ + int idx = wxSystemSettingsModule::sm_optionNames.Index(name, FALSE); + if (idx == wxNOT_FOUND) + { + wxSystemSettingsModule::sm_optionNames.Add(name); + wxSystemSettingsModule::sm_optionValues.Add(value); + } + else + { + wxSystemSettingsModule::sm_optionNames[idx] = name; + wxSystemSettingsModule::sm_optionValues[idx] = value; + } +} + +void wxSystemSettings::SetOption(const wxString& name, int value) +{ + wxString valStr; + valStr.Printf(wxT("%d"), value); + SetOption(name, valStr); +} + +wxString wxSystemSettings::GetOption(const wxString& name) +{ + int idx = wxSystemSettingsModule::sm_optionNames.Index(name, FALSE); + if (idx == wxNOT_FOUND) + return wxEmptyString; + else + return wxSystemSettingsModule::sm_optionValues[idx]; +} + +int wxSystemSettings::GetOptionInt(const wxString& name) +{ + return wxAtoi(GetOption(name)); +} + +bool wxSystemSettings::HasOption(const wxString& name) +{ + return (wxSystemSettingsModule::sm_optionNames.Index(name, FALSE) != wxNOT_FOUND); +} + -- 2.45.2