DISTRHO Plugin Framework
Cairo.hpp
1 /*
2  * DISTRHO Plugin Framework (DPF)
3  * Copyright (C) 2012-2022 Filipe Coelho <falktx@falktx.com>
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any purpose with
6  * or without fee is hereby granted, provided that the above copyright notice and this
7  * permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
10  * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
11  * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
12  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
13  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 #ifndef DGL_CAIRO_HPP_INCLUDED
18 #define DGL_CAIRO_HPP_INCLUDED
19 
20 #include "ImageBase.hpp"
21 #include "ImageBaseWidgets.hpp"
22 
23 #include <cairo.h>
24 
25 START_NAMESPACE_DGL
26 
27 // --------------------------------------------------------------------------------------------------------------------
28 
29 /**
30  Cairo Graphics context.
31  */
33 {
34  cairo_t* handle;
35 };
36 
37 // --------------------------------------------------------------------------------------------------------------------
38 
39 /**
40  Cairo Image class.
41 
42  TODO ...
43  */
44 class CairoImage : public ImageBase
45 {
46 public:
47  /**
48  Constructor for a null Image.
49  */
51 
52  /**
53  Constructor using raw image data.
54  @note @a rawData must remain valid for the lifetime of this Image.
55  */
56  CairoImage(const char* rawData, uint width, uint height, ImageFormat format);
57 
58  /**
59  Constructor using raw image data.
60  @note @a rawData must remain valid for the lifetime of this Image.
61  */
62  CairoImage(const char* rawData, const Size<uint>& size, ImageFormat format);
63 
64  /**
65  Constructor using another image data.
66  */
67  CairoImage(const CairoImage& image);
68 
69  /**
70  Destructor.
71  */
72  ~CairoImage() override;
73 
74  /**
75  Load raw image data from memory.
76  @note @a rawData must remain valid for the lifetime of this Image.
77  */
78  void loadFromMemory(const char* rawData,
79  const Size<uint>& size,
80  ImageFormat format = kImageFormatBGRA) noexcept override;
81 
82  /**
83  Load PNG image from memory.
84  Image size is read from PNG contents.
85  @note @a pngData must remain valid for the lifetime of this Image.
86  */
87  void loadFromPNG(const char* pngData, uint dataSize) noexcept;
88 
89  /**
90  Draw this image at position @a pos using the graphics context @a context.
91  */
92  void drawAt(const GraphicsContext& context, const Point<int>& pos) override;
93 
94  /**
95  Get the cairo surface currently associated with this image.
96  FIXME might be removed
97  */
98  inline cairo_surface_t* getSurface() const noexcept
99  {
100  return surface;
101  }
102 
103  /**
104  TODO document this.
105  */
106  CairoImage& operator=(const CairoImage& image) noexcept;
107 
108  // FIXME this should not be needed
109  inline void loadFromMemory(const char* rdata, uint w, uint h, ImageFormat fmt = kImageFormatBGRA)
110  { loadFromMemory(rdata, Size<uint>(w, h), fmt); };
111  inline void draw(const GraphicsContext& context)
112  { drawAt(context, Point<int>(0, 0)); };
113  inline void drawAt(const GraphicsContext& context, int x, int y)
114  { drawAt(context, Point<int>(x, y)); };
115 
116 private:
117  cairo_surface_t* surface;
118  uchar* surfacedata;
119  int* datarefcount;
120 };
121 
122 // --------------------------------------------------------------------------------------------------------------------
123 
124 /**
125  CairoWidget, handy class that takes graphics context during onDisplay and passes it in a new function.
126  */
127 template <class BaseWidget>
128 class CairoBaseWidget : public BaseWidget
129 {
130 public:
131  /**
132  Constructor for a CairoSubWidget.
133  */
134  explicit CairoBaseWidget(Widget* const parentGroupWidget);
135 
136  /**
137  Constructor for a CairoTopLevelWidget.
138  */
139  explicit CairoBaseWidget(Window& windowToMapTo);
140 
141  /**
142  Constructor for a CairoStandaloneWindow without parent window.
143  */
144  explicit CairoBaseWidget(Application& app);
145 
146  /**
147  Constructor for a CairoStandaloneWindow with parent window.
148  */
149  explicit CairoBaseWidget(Application& app, Window& parentWindow);
150 
151  /**
152  Destructor.
153  */
154  ~CairoBaseWidget() override {}
155 
156 protected:
157  /**
158  New virtual onDisplay function.
159  @see onDisplay
160  */
161  virtual void onCairoDisplay(const CairoGraphicsContext& context) = 0;
162 
163 private:
164  /**
165  Widget display function.
166  Implemented internally to pass context into the drawing function.
167  */
168  void onDisplay() override
169  {
170  const CairoGraphicsContext& context((const CairoGraphicsContext&)BaseWidget::getGraphicsContext());
171  onCairoDisplay(context);
172  }
173 
174  DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CairoBaseWidget);
175 };
176 
180 
181 // --------------------------------------------------------------------------------------------------------------------
182 
188 
189 // --------------------------------------------------------------------------------------------------------------------
190 
191 END_NAMESPACE_DGL
192 
193 #endif
Definition: Application.hpp:43
Definition: Cairo.hpp:129
CairoBaseWidget(Window &windowToMapTo)
CairoBaseWidget(Application &app)
CairoBaseWidget(Widget *const parentGroupWidget)
virtual void onCairoDisplay(const CairoGraphicsContext &context)=0
~CairoBaseWidget() override
Definition: Cairo.hpp:154
CairoBaseWidget(Application &app, Window &parentWindow)
Definition: Cairo.hpp:45
CairoImage(const char *rawData, uint width, uint height, ImageFormat format)
~CairoImage() override
cairo_surface_t * getSurface() const noexcept
Definition: Cairo.hpp:98
void loadFromMemory(const char *rawData, const Size< uint > &size, ImageFormat format=kImageFormatBGRA) noexcept override
CairoImage(const CairoImage &image)
void loadFromPNG(const char *pngData, uint dataSize) noexcept
void drawAt(const GraphicsContext &context, const Point< int > &pos) override
CairoImage(const char *rawData, const Size< uint > &size, ImageFormat format)
CairoImage & operator=(const CairoImage &image) noexcept
Definition: ImageBaseWidgets.hpp:40
Definition: ImageBaseWidgets.hpp:86
Definition: ImageBaseWidgets.hpp:132
Definition: ImageBaseWidgets.hpp:172
Definition: ImageBaseWidgets.hpp:224
Definition: ImageBase.hpp:45
Definition: Widget.hpp:56
Definition: Window.hpp:63
Definition: Cairo.hpp:33
Definition: Base.hpp:253