Gfx: Implement GDI+ fallback

This commit is contained in:
Birunthan Mohanathas 2013-07-29 20:54:20 +03:00
parent 44300e2f41
commit 20cac72e9b
6 changed files with 52 additions and 11 deletions

View File

@ -17,6 +17,9 @@
*/ */
#include "Canvas.h" #include "Canvas.h"
#include "CanvasD2D.h"
#include "CanvasGDIP.h"
#include "../Platform.h"
namespace Gfx { namespace Gfx {
@ -31,6 +34,34 @@ Canvas::~Canvas()
{ {
} }
Canvas* Canvas::Create(Renderer renderer)
{
if (renderer == Renderer::GDIP)
{
return new CanvasGDIP();
}
else if (renderer == Renderer::D2D && Platform::IsAtLeastWin7())
{
if (CanvasD2D::Initialize())
{
return new CanvasD2D();
}
CanvasD2D::Finalize();
}
else if (renderer == Renderer::PreferD2D)
{
if (Canvas* canvas = Create(Renderer::D2D))
{
return canvas;
}
return Create(Renderer::GDIP);
}
return nullptr;
};
void Canvas::Resize(int w, int h) void Canvas::Resize(int w, int h)
{ {
m_W = w; m_W = w;

View File

@ -26,12 +26,24 @@
namespace Gfx { namespace Gfx {
enum class Renderer
{
GDIP,
D2D,
// Attempts to use D2D. If D2D is not available, fallbacks to use GDI+.
PreferD2D
};
// Provides methods for drawing text, bitmaps, etc. // Provides methods for drawing text, bitmaps, etc.
class __declspec(novtable) Canvas class __declspec(novtable) Canvas
{ {
public: public:
virtual ~Canvas(); virtual ~Canvas();
// Creates the canvas using the specified rendering engine. May return nullptr.
static Canvas* Create(Renderer renderer);
int GetW() const { return m_W; } int GetW() const { return m_W; }
int GetH() const { return m_H; } int GetH() const { return m_H; }

View File

@ -53,7 +53,6 @@ CanvasD2D::CanvasD2D() : Canvas(),
m_Bitmap(), m_Bitmap(),
m_TextAntiAliasing(false) m_TextAntiAliasing(false)
{ {
Initialize();
} }
CanvasD2D::~CanvasD2D() CanvasD2D::~CanvasD2D()

View File

@ -38,9 +38,6 @@ namespace Gfx {
class CanvasD2D : public Canvas class CanvasD2D : public Canvas
{ {
public: public:
CanvasD2D();
~CanvasD2D();
virtual void Resize(int w, int h); virtual void Resize(int w, int h);
virtual bool BeginDraw(); virtual bool BeginDraw();
@ -75,9 +72,12 @@ public:
virtual void FillRectangle(Gdiplus::Rect& rect, const Gdiplus::SolidBrush& brush) override; virtual void FillRectangle(Gdiplus::Rect& rect, const Gdiplus::SolidBrush& brush) override;
private: private:
friend class Canvas;
friend class FontCollectionD2D; friend class FontCollectionD2D;
friend class TextFormatD2D; friend class TextFormatD2D;
CanvasD2D();
~CanvasD2D();
CanvasD2D(const CanvasD2D& other) {} CanvasD2D(const CanvasD2D& other) {}
static bool Initialize(); static bool Initialize();

View File

@ -32,9 +32,6 @@ namespace Gfx {
class CanvasGDIP : public Canvas class CanvasGDIP : public Canvas
{ {
public: public:
CanvasGDIP();
~CanvasGDIP();
virtual void Resize(int w, int h); virtual void Resize(int w, int h);
virtual bool BeginDraw(); virtual bool BeginDraw();
@ -69,6 +66,10 @@ public:
virtual void FillRectangle(Gdiplus::Rect& rect, const Gdiplus::SolidBrush& brush) override; virtual void FillRectangle(Gdiplus::Rect& rect, const Gdiplus::SolidBrush& brush) override;
private: private:
friend class Canvas;
CanvasGDIP();
~CanvasGDIP();
CanvasGDIP(const CanvasGDIP& other) {} CanvasGDIP(const CanvasGDIP& other) {}
void Dispose(); void Dispose();

View File

@ -37,8 +37,7 @@
#include "MeasureScript.h" #include "MeasureScript.h"
#include "../Version.h" #include "../Version.h"
#include "../Common/PathUtil.h" #include "../Common/PathUtil.h"
#include "../Common/Gfx/CanvasD2D.h" #include "../Common/Gfx/Canvas.h"
#include "../Common/Gfx/CanvasGDIP.h"
using namespace Gdiplus; using namespace Gdiplus;
@ -2078,8 +2077,7 @@ bool MeterWindow::ReadSkin()
useD2D = 0!=m_Parser.ReadInt(L"Rainmeter", L"__UseD2D", useD2D ? 1 : 0); useD2D = 0!=m_Parser.ReadInt(L"Rainmeter", L"__UseD2D", useD2D ? 1 : 0);
} }
m_Canvas = (Platform::IsAtLeastWinVista() && useD2D) ? m_Canvas = Gfx::Canvas::Create(useD2D ? Gfx::Renderer::PreferD2D : Gfx::Renderer::GDIP);
(Gfx::Canvas*)new Gfx::CanvasD2D() : (Gfx::Canvas*)new Gfx::CanvasGDIP();
// Gotta have some kind of buffer during initialization // Gotta have some kind of buffer during initialization
CreateDoubleBuffer(1, 1); CreateDoubleBuffer(1, 1);