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