ASPiK SDK
gdiplusdrawcontext.h
1 // This file is part of VSTGUI. It is subject to the license terms
2 // in the LICENSE file found in the top-level directory of this
3 // distribution and at http://github.com/steinbergmedia/vstgui/LICENSE
4 
5 #ifndef __gdiplusdrawcontext__
6 #define __gdiplusdrawcontext__
7 
8 #include "../../coffscreencontext.h"
9 
10 #if WINDOWS
11 
12 #include "win32support.h"
13 
14 namespace VSTGUI {
15 class GdiplusBitmap;
16 
17 //-----------------------------------------------------------------------------
18 class GdiplusDrawContext : public COffscreenContext
19 {
20 public:
21  GdiplusDrawContext (HWND window, const CRect& drawSurface);
22  GdiplusDrawContext (GdiplusBitmap* bitmap);
23  ~GdiplusDrawContext () noexcept;
24 
25  Gdiplus::Graphics* getGraphics () const { return pGraphics; }
26  Gdiplus::Pen* getPen () const { return pPen; }
27  Gdiplus::SolidBrush* getBrush () const { return pBrush; }
28  Gdiplus::SolidBrush* getFontBrush () const { return pFontBrush; }
29 
30  // CDrawContext
31  void drawLine (const LinePair& line) override;
32  void drawLines (const LineList& lines) override;
33  void drawPolygon (const PointList& polygonPointList, const CDrawStyle drawStyle = kDrawStroked) override;
34  void drawRect (const CRect &rect, const CDrawStyle drawStyle = kDrawStroked) override;
35  void drawArc (const CRect &rect, const float startAngle1, const float endAngle2, const CDrawStyle drawStyle = kDrawStroked) override;
36  void drawEllipse (const CRect &rect, const CDrawStyle drawStyle = kDrawStroked) override;
37  void drawPoint (const CPoint &point, const CColor& color) override;
38  void drawBitmap (CBitmap* bitmap, const CRect& dest, const CPoint& offset = CPoint (0, 0), float alpha = 1.f) override;
39  void clearRect (const CRect& rect) override;
40  void setLineStyle (const CLineStyle& style) override;
41  void setLineWidth (CCoord width) override;
42  void setDrawMode (CDrawMode mode) override;
43  void setClipRect (const CRect &clip) override;
44  void resetClipRect () override;
45  void setFillColor (const CColor& color) override;
46  void setFrameColor (const CColor& color) override;
47  void setFontColor (const CColor& color) override;
48  void setGlobalAlpha (float newAlpha) override;
49  void saveGlobalState () override;
50  void restoreGlobalState () override;
51  CGraphicsPath* createGraphicsPath () override;
52  CGraphicsPath* createTextPath (const CFontRef font, UTF8StringPtr text) override;
53  void drawGraphicsPath (CGraphicsPath* path, PathDrawMode mode = kPathFilled, CGraphicsTransform* transformation = nullptr) override;
54  void fillLinearGradient (CGraphicsPath* path, const CGradient& gradient, const CPoint& startPoint, const CPoint& endPoint, bool evenOdd = false, CGraphicsTransform* transformation = nullptr) override;
55  void fillRadialGradient (CGraphicsPath* path, const CGradient& gradient, const CPoint& center, CCoord radius, const CPoint& originOffset = CPoint (0, 0), bool evenOdd = false, CGraphicsTransform* transformation = nullptr) override;
56 
57  void endDraw () override;
58 //-----------------------------------------------------------------------------
59 protected:
60  void init () override;
61 
62  void setFillColorInternal (const CColor& color);
63  void setFrameColorInternal (const CColor& color);
64  void setFontColorInternal (const CColor& color);
65  void setLineStyleInternal (const CLineStyle& style);
66  void setLineWidthInternal (CCoord width);
67  void setDrawModeInternal (CDrawMode mode);
68 
69  HWND window;
70  Gdiplus::Graphics *pGraphics;
71  Gdiplus::Pen *pPen;
72  Gdiplus::SolidBrush *pBrush;
73  Gdiplus::SolidBrush *pFontBrush;
74 };
75 
76 //-----------------------------------------------------------------------------
77 struct GdiplusDrawScope
78 {
79  GdiplusDrawScope (Gdiplus::Graphics* graphics, const CRect& clipRect, const CGraphicsTransform& transform)
80  : graphics (graphics)
81  {
82  graphics->SetClip (Gdiplus::RectF ((Gdiplus::REAL)clipRect.left, (Gdiplus::REAL)clipRect.top, (Gdiplus::REAL)clipRect.getWidth (), (Gdiplus::REAL)clipRect.getHeight ()), Gdiplus::CombineModeReplace);
83  if (transform.isInvariant () == false)
84  {
85  Gdiplus::Matrix matrix ((Gdiplus::REAL)transform.m11, (Gdiplus::REAL)transform.m12, (Gdiplus::REAL)transform.m21, (Gdiplus::REAL)transform.m22, (Gdiplus::REAL)transform.dx, (Gdiplus::REAL)transform.dy);
86  graphics->SetTransform (&matrix);
87  }
88  }
89 
90  ~GdiplusDrawScope () noexcept
91  {
92  Gdiplus::Matrix matrix;
93  graphics->SetTransform (&matrix);
94  }
95 
96  Gdiplus::Graphics* graphics;
97 };
98 
99 //-----------------------------------------------------------------------------
100 inline void convert (Gdiplus::Matrix& matrix, const CGraphicsTransform& t)
101 {
102  matrix.SetElements ((Gdiplus::REAL)t.m11, (Gdiplus::REAL)t.m21, (Gdiplus::REAL)t.m12, (Gdiplus::REAL)t.m22, (Gdiplus::REAL)t.dx, (Gdiplus::REAL)t.dy);
103 }
104 
105 
106 } // namespace
107 
108 #endif // WINDOWS
109 
110 #endif // __gdiplusdrawcontext__
Definition: customcontrols.cpp:8