CYD-UI
A C++ library for building native graphic user interfaces
Loading...
Searching...
No Matches
compositing.cppm
Go to the documentation of this file.
1
// Copyright (c) 2024, Víctor Castillo Agüero.
2
// SPDX-License-Identifier: GPL-3.0-or-later
3
4
module
;
5
#include <cairomm-1.16/cairomm/cairomm.h>
6
#include <tracy/Tracy.hpp>
7
8
#define SDL_MAIN_HANDLED
9
#include <SDL3/SDL.h>
10
11
export
module
cydui.graphics:compositing
;
12
13
import
std;
14
15
import
fabric.profiling;
16
17
import
:api;
18
export
import
cydui.graphics.vector
;
19
20
import
cydui.application
;
21
import
cydui.graphics.window
;
22
23
export
import
:dev_texture;
24
25
export
namespace
cydui::compositing
{
26
using namespace
vg
;
27
using namespace
std::chrono_literals;
28
29
struct
compositing_operation_t
{
30
enum
{
31
OVERLAY
,
32
}
op
=
OVERLAY
;
33
34
int
x
,
y
,
orig_x
,
orig_y
;
35
int
w
,
h
;
36
double
rot
= 0.0;
37
double
scale_x
= 1.0;
38
double
scale_y
= 1.0;
39
bool
animated
=
false
;
40
41
std::function<void(
compositing_operation_t
&
op
)>
_fix_dimensions
= [](
compositing_operation_t
&
op
) {
42
};
43
44
bool
operator==
(
const
compositing_operation_t
&other)
const
{
45
return
x
== other.
x
&&
y
== other.
y
&&
orig_x
== other.
orig_x
&&
orig_y
== other.
orig_y
46
&&
w
== other.
w
&&
h
== other.
h
&&
scale_x
== other.
scale_x
&&
scale_y
== other.
scale_y
47
&&
rot
== other.
rot
&&
animated
== other.
animated
;
48
49
}
50
};
51
52
struct
compositing_node_t
{
53
void
set_parent
(
compositing_node_t
* parent_) {
54
parent = parent_;
55
is_flattened = (not
op
.animated)
56
and ((
op
.op ==
compositing_operation_t::OVERLAY
)
57
and (parent !=
nullptr
)
58
and (
op
.x >= 0) && (
op
.y >= 0)
59
and ((
op
.x +
op
.w) <= parent->op.w)
60
and ((
op
.y +
op
.h) <= parent->op.h));
61
62
if
(is_flattened) {
63
flattening_target = parent->flattening_target;
64
flatten_x = parent->flatten_x +
op
.x;
65
flatten_y = parent->flatten_y +
op
.y;
66
}
else
{
67
flattening_target =
this
;
68
flatten_x = 0;
69
flatten_y = 0;
70
}
71
}
72
73
bool
is_flattened_node
()
const
{
74
return
is_flattened;
75
}
76
77
void
mark_flattening_target_dirty
() {
78
flattening_target->flattening_dirty =
true
;
79
}
80
81
bool
is_dirty_from_flattening
()
const
{
82
return
flattening_target->flattening_dirty;
83
}
84
85
void
start_render
(
graphics::window_t
* render_target) {
86
if
(is_flattened) {
87
pixel_stride = flattening_target->pixel_stride;
88
pixels
= &parent->pixels[
op
.x + (pixel_stride >> 2) *
op
.y];
89
}
else
{
90
ZoneScopedN(
"Start render"
);
91
92
if
(
rendered_texture
.is_locked()) {
93
rendered_texture
.unlock();
94
}
95
if
(
op
.w == 0 or
op
.h == 0) {
96
rendered_texture
.resize(render_target->
renderer
, 1, 1);
97
}
else
if
(
op
.w !=
rendered_texture
.width() ||
op
.h !=
rendered_texture
.height()) {
98
rendered_texture
.resize(render_target->
renderer
,
op
.w,
op
.h);
99
}
100
101
pixel_stride =
rendered_texture
.width() *
sizeof
(pixel_t);
102
pixels
=
static_cast<
pixel_t*
>
(
rendered_texture
.lock());
103
}
104
}
105
106
void
render
(
graphics::window_t
* render_target) {
107
if
(
op
.w == 0 or
op
.h == 0) {
108
return
;
109
}
110
ZoneScopedN(
"Render Node"
);
111
112
pixelmap_editor_t
editor {
op
.w,
op
.h,
pixels
, pixel_stride};
113
114
if
(not is_flattened) {
115
editor.clear();
116
}
117
editor->begin_new_path();
118
editor->rectangle(0, 0,
op
.w,
op
.h);
119
editor->clip();
120
121
if
(not
graphics
.empty()) {
122
for
(
const
auto
&element:
graphics
.elements) {
123
element->_internal_set_origin(
124
op
.orig_x,
125
op
.orig_y
126
);
127
element->apply_to(editor);
128
}
129
}
130
131
flattening_target->dirty_ =
true
;
132
}
133
134
void
flush_rendered_texture
(
graphics::window_t
* render_target) {
135
if
(dirty_) {
136
ZoneScopedN(
"Flush Rendered Texture"
);
137
rendered_texture
.unlock();
138
composite_texture
.resize(render_target->
renderer
,
rendered_texture
.width(),
rendered_texture
.height());
139
dirty_ =
false
;
140
}
141
}
142
143
void
clear_composite_texture
(
graphics::window_t
* render_target) {
144
ZoneScopedN(
"Clear Composite Texture"
);
145
if
(not is_flattened) {
146
composite_texture
.clear(render_target->
renderer
);
147
}
148
}
149
150
void
compose_own
(
graphics::window_t
* render_target) {
151
ZoneScopedN(
"Compose Own"
);
152
if
(is_flattened)
return
;
153
flush_rendered_texture
(render_target);
154
SDL_FRect dst {
155
.x = 0,
156
.y = 0,
157
.w =
rendered_texture
.width(),
158
.h =
rendered_texture
.height(),
159
};
160
rendered_texture
.copy_into(render_target->
renderer
,
composite_texture
, &dst,
false
);
161
}
162
163
void
compose
(
graphics::window_t
* render_target,
compositing_node_t
* other) {
164
ZoneScopedN(
"Compose Child"
);
165
SDL_Renderer* renderer = render_target->
renderer
;
166
167
auto
& target = is_flattened? flattening_target->composite_texture :
composite_texture
;
168
169
float
w_ = other->
composite_texture
.
width
();
170
float
h_ = other->
composite_texture
.
height
();
171
172
target.resize(
173
renderer,
174
std::max(
float
{target.width()}, flatten_x + other->
op
.
x
+ w_),
175
std::max(target.height(), flatten_y + other->
op
.
y
+ h_),
176
true
177
);
178
179
SDL_FRect src {
180
.x = 0,
181
.y = 0,
182
.w = w_,
183
.h = h_,
184
};
185
SDL_FRect dst {
186
.x =
static_cast<
float
>
(flatten_x + other->
op
.
x
),
187
.y =
static_cast<
float
>
(flatten_y + other->
op
.
y
),
188
.w = w_,
189
.h = h_,
190
};
191
other->
composite_texture
.
copy_into
(renderer, target, &dst,
true
, &src);
192
}
193
194
private
:
195
bool
dirty_ =
true
;
196
197
compositing_node_t
* parent =
nullptr
;
198
compositing_node_t
* flattening_target =
nullptr
;
199
bool
flattening_dirty =
false
;
200
bool
is_flattened =
false
;
201
int
pixel_stride = 0;
202
203
int
flatten_x = 0;
204
int
flatten_y = 0;
205
public
:
206
unsigned
long
id
= 0;
207
compositing_operation_t
op
{ };
208
fragment_t
graphics
{ };
209
210
device_texture_t
rendered_texture
{
true
};
211
device_texture_t
composite_texture
{ };
212
pixel_t*
pixels
;
213
};
214
215
class
LayoutCompositor
{
216
graphics::window_t
* render_target =
nullptr
;
217
prof::context_t* profiler =
nullptr
;
218
219
public
:
220
LayoutCompositor
() {
221
}
222
223
~LayoutCompositor
() {
224
}
225
226
void
set_render_target
(
graphics::window_t
* _render_target, prof::context_t* _profiler) {
227
render_target = _render_target;
228
profiler = _profiler;
229
}
230
231
void
compose
(
compositing_node_t
* root) {
232
auto
* rtarget = render_target;
233
if
(root !=
nullptr
) {
234
SDL_SetRenderDrawColor(rtarget->renderer, 0, 0, 0, 0);
235
SDL_RenderClear(rtarget->renderer);
236
237
SDL_Texture* texture = root->
composite_texture
.
sdl_texture
();
238
SDL_FRect src {
239
.x = 0,
240
.y = 0,
241
.w = root->
composite_texture
.
width
(),
242
.h = root->
composite_texture
.
height
()
243
};
244
SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND_PREMULTIPLIED);
245
246
SDL_RenderTexture(rtarget->renderer, texture, &src, &src);
247
SDL_RenderPresent(rtarget->renderer);
248
}
249
}
250
};
251
}
cydui::compositing::LayoutCompositor::~LayoutCompositor
~LayoutCompositor()
Definition
compositing.cppm:223
cydui::compositing::LayoutCompositor::compose
void compose(compositing_node_t *root)
Definition
compositing.cppm:231
cydui::compositing::LayoutCompositor::LayoutCompositor
LayoutCompositor()
Definition
compositing.cppm:220
cydui::compositing::LayoutCompositor::set_render_target
void set_render_target(graphics::window_t *_render_target, prof::context_t *_profiler)
Definition
compositing.cppm:226
pixelmap_editor_t
Definition
pixelmap_editor.cppm:14
cydui.application
cydui.graphics.vector
cydui.graphics.window
cydui.graphics
cydui::compositing
Definition
compositing.cppm:25
vg
Definition
attributes.cppm:14
cydui::compositing::compositing_node_t
Definition
compositing.cppm:52
cydui::compositing::compositing_node_t::compose_own
void compose_own(graphics::window_t *render_target)
Definition
compositing.cppm:150
cydui::compositing::compositing_node_t::start_render
void start_render(graphics::window_t *render_target)
Definition
compositing.cppm:85
cydui::compositing::compositing_node_t::is_flattened_node
bool is_flattened_node() const
Definition
compositing.cppm:73
cydui::compositing::compositing_node_t::set_parent
void set_parent(compositing_node_t *parent_)
Definition
compositing.cppm:53
cydui::compositing::compositing_node_t::rendered_texture
device_texture_t rendered_texture
Definition
compositing.cppm:210
cydui::compositing::compositing_node_t::flush_rendered_texture
void flush_rendered_texture(graphics::window_t *render_target)
Definition
compositing.cppm:134
cydui::compositing::compositing_node_t::is_dirty_from_flattening
bool is_dirty_from_flattening() const
Definition
compositing.cppm:81
cydui::compositing::compositing_node_t::composite_texture
device_texture_t composite_texture
Definition
compositing.cppm:211
cydui::compositing::compositing_node_t::compose
void compose(graphics::window_t *render_target, compositing_node_t *other)
Definition
compositing.cppm:163
cydui::compositing::compositing_node_t::render
void render(graphics::window_t *render_target)
Definition
compositing.cppm:106
cydui::compositing::compositing_node_t::clear_composite_texture
void clear_composite_texture(graphics::window_t *render_target)
Definition
compositing.cppm:143
cydui::compositing::compositing_node_t::mark_flattening_target_dirty
void mark_flattening_target_dirty()
Definition
compositing.cppm:77
cydui::compositing::compositing_node_t::pixels
pixel_t * pixels
Definition
compositing.cppm:212
cydui::compositing::compositing_node_t::op
compositing_operation_t op
Definition
compositing.cppm:207
cydui::compositing::compositing_node_t::graphics
fragment_t graphics
Definition
compositing.cppm:208
cydui::compositing::compositing_operation_t
Definition
compositing.cppm:29
cydui::compositing::compositing_operation_t::x
int x
Definition
compositing.cppm:34
cydui::compositing::compositing_operation_t::y
int y
Definition
compositing.cppm:34
cydui::compositing::compositing_operation_t::operator==
bool operator==(const compositing_operation_t &other) const
Definition
compositing.cppm:44
cydui::compositing::compositing_operation_t::h
int h
Definition
compositing.cppm:35
cydui::compositing::compositing_operation_t::animated
bool animated
Definition
compositing.cppm:39
cydui::compositing::compositing_operation_t::op
enum cydui::compositing::compositing_operation_t::@321126061026340171363272107326127342244210103306 op
cydui::compositing::compositing_operation_t::scale_x
double scale_x
Definition
compositing.cppm:37
cydui::compositing::compositing_operation_t::orig_y
int orig_y
Definition
compositing.cppm:34
cydui::compositing::compositing_operation_t::scale_y
double scale_y
Definition
compositing.cppm:38
cydui::compositing::compositing_operation_t::rot
double rot
Definition
compositing.cppm:36
cydui::compositing::compositing_operation_t::_fix_dimensions
std::function< void(compositing_operation_t &op)> _fix_dimensions
Definition
compositing.cppm:41
cydui::compositing::compositing_operation_t::orig_x
int orig_x
Definition
compositing.cppm:34
cydui::compositing::compositing_operation_t::w
int w
Definition
compositing.cppm:35
cydui::compositing::compositing_operation_t::OVERLAY
@ OVERLAY
Definition
compositing.cppm:31
cydui::compositing::device_texture_t
Definition
device_texture.cppm:21
cydui::compositing::device_texture_t::width
float width() const
Definition
device_texture.cppm:176
cydui::compositing::device_texture_t::height
float height() const
Definition
device_texture.cppm:179
cydui::compositing::device_texture_t::copy_into
void copy_into(SDL_Renderer *renderer, device_texture_t &other, SDL_FRect *dst, bool blend=true, SDL_FRect *src_=nullptr)
Definition
device_texture.cppm:137
cydui::compositing::device_texture_t::sdl_texture
SDL_Texture * sdl_texture()
Definition
device_texture.cppm:183
cydui::graphics::window_t
Definition
window.cppm:21
cydui::graphics::window_t::renderer
SDL_Renderer * renderer
Definition
window.cppm:41
vg::fragment_t
Definition
fragment.cppm:19
include
cyd_ui
graphics
compositing.cppm
Generated by
1.13.2