Dusk Audio Framework
Loading...
Searching...
No Matches
Cairo.hpp
1/*
2 * DISTRHO Plugin Framework (DPF)
3 * Copyright (C) 2012-2025 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
25START_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 */
44class CairoImage : public ImageBase
45{
46public:
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
116private:
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 */
127template <class BaseWidget>
128class CairoBaseWidget : public BaseWidget
129{
130public:
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 */
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
156protected:
157 /**
158 New virtual onDisplay function.
159 @see onDisplay
160 */
161 virtual void onCairoDisplay(const CairoGraphicsContext& context) = 0;
162
163private:
164 /**
165 Widget display function.
166 Implemented internally to pass context into the drawing function.
167 */
168 void onDisplay() final
169 {
170 onCairoDisplay(static_cast<const CairoGraphicsContext&>(BaseWidget::getGraphicsContext()));
171 }
172
173 DAF_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CairoBaseWidget);
174};
175
176typedef CairoBaseWidget<SubWidget> CairoSubWidget;
177typedef CairoBaseWidget<TopLevelWidget> CairoTopLevelWidget;
178typedef CairoBaseWidget<StandaloneWindow> CairoStandaloneWindow;
179
180// --------------------------------------------------------------------------------------------------------------------
181
182typedef ImageBaseAboutWindow<CairoImage> CairoImageAboutWindow;
183typedef ImageBaseButton<CairoImage> CairoImageButton;
184typedef ImageBaseKnob<CairoImage> CairoImageKnob;
185typedef ImageBaseSlider<CairoImage> CairoImageSlider;
186typedef ImageBaseSwitch<CairoImage> CairoImageSwitch;
187
188// --------------------------------------------------------------------------------------------------------------------
189
190END_NAMESPACE_DGL
191
192#endif
Definition Application.hpp:90
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)
cairo_surface_t * getSurface() const noexcept
Definition Cairo.hpp:98
CairoImage(const char *rawData, uint width, uint height, ImageFormat format)
~CairoImage() override
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 & operator=(const CairoImage &image) noexcept
CairoImage(const char *rawData, const Size< uint > &size, ImageFormat format)
Definition ImageBaseWidgets.hpp:40
Definition ImageBaseWidgets.hpp:86
Definition ImageBaseWidgets.hpp:132
Definition ImageBaseWidgets.hpp:173
Definition ImageBaseWidgets.hpp:225
Definition Geometry.hpp:41
Definition Geometry.hpp:133
Definition Window.hpp:67
Definition Cairo.hpp:33
Definition Base.hpp:287