comparison DPF-Prymula-audioplugins/dpf/dgl/Cairo.hpp @ 3:84e66ea83026

DPF-Prymula-audioplugins-0.231015-2
author prymula <prymula76@outlook.com>
date Mon, 16 Oct 2023 21:53:34 +0200
parents
children
comparison
equal deleted inserted replaced
2:cf2cb71d31dd 3:84e66ea83026
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 */
32 struct CairoGraphicsContext : GraphicsContext
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 */
50 CairoImage();
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
177 typedef CairoBaseWidget<SubWidget> CairoSubWidget;
178 typedef CairoBaseWidget<TopLevelWidget> CairoTopLevelWidget;
179 typedef CairoBaseWidget<StandaloneWindow> CairoStandaloneWindow;
180
181 // --------------------------------------------------------------------------------------------------------------------
182
183 typedef ImageBaseAboutWindow<CairoImage> CairoImageAboutWindow;
184 typedef ImageBaseButton<CairoImage> CairoImageButton;
185 typedef ImageBaseKnob<CairoImage> CairoImageKnob;
186 typedef ImageBaseSlider<CairoImage> CairoImageSlider;
187 typedef ImageBaseSwitch<CairoImage> CairoImageSwitch;
188
189 // --------------------------------------------------------------------------------------------------------------------
190
191 END_NAMESPACE_DGL
192
193 #endif