93 GLint general_format = GL_RGBA;
95 general_format = GL_BGRA_EXT;
101 GLint saved_texture_binding;
102 glGetIntegerv(GL_TEXTURE_BINDING_2D, &saved_texture_binding);
103 GLint saved_vao_binding;
104 glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &saved_vao_binding);
105 GLint saved_array_buffer_binding;
106 glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &saved_array_buffer_binding);
107 GLint saved_draw_framebuffer_binding;
108 glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &saved_draw_framebuffer_binding);
109 GLint saved_read_framebuffer_binding;
110 glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &saved_read_framebuffer_binding);
111 GLint saved_current_program;
112 glGetIntegerv(GL_CURRENT_PROGRAM, &saved_current_program);
113 GLboolean saved_scissor_test = glIsEnabled(GL_SCISSOR_TEST);
114 GLboolean saved_blend = glIsEnabled(GL_BLEND);
116 glGetIntegerv(GL_BLEND_SRC_RGB, &saved_src_rgb);
117 GLint saved_src_alpha;
118 glGetIntegerv(GL_BLEND_SRC_ALPHA, &saved_src_alpha);
120 glGetIntegerv(GL_BLEND_DST_RGB, &saved_dst_rgb);
121 GLint saved_dst_alpha;
122 glGetIntegerv(GL_BLEND_DST_ALPHA, &saved_dst_alpha);
127 if (
self->framebuffer ==
nullptr ||
130 g_clear_object(&
self->framebuffer);
135 if (!
self->shareable) {
138 static_cast<uint8_t*
>(g_realloc(
self->pixels, data_length));
145 glGenVertexArrays(1, &vao);
146 glBindVertexArray(vao);
149 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
156 glDisable(GL_SCISSOR_TEST);
158 glBindFramebuffer(GL_DRAW_FRAMEBUFFER,
160 gboolean first_layer =
TRUE;
163 switch (layer->
type) {
166 FlFramebuffer* framebuffer =
168 glBindFramebuffer(GL_READ_FRAMEBUFFER,
190 glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
193 glDeleteVertexArrays(1, &vao);
200 if (saved_scissor_test) {
201 glEnable(GL_SCISSOR_TEST);
203 glDisable(GL_SCISSOR_TEST);
206 glBindTexture(GL_TEXTURE_2D, saved_texture_binding);
207 glBindVertexArray(saved_vao_binding);
208 glBindBuffer(GL_ARRAY_BUFFER, saved_array_buffer_binding);
209 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, saved_draw_framebuffer_binding);
210 glUseProgram(saved_current_program);
211 glBlendFuncSeparate(saved_src_rgb, saved_dst_rgb, saved_src_alpha,
214 if (!
self->shareable) {
215 glBindFramebuffer(GL_READ_FRAMEBUFFER,
217 glReadPixels(0, 0,
width,
height, GL_RGBA, GL_UNSIGNED_BYTE,
self->pixels);
218 glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
220 glBindFramebuffer(GL_READ_FRAMEBUFFER, saved_read_framebuffer_binding);
243 if (
self->framebuffer ==
nullptr) {
257 GLint saved_texture_binding;
258 glGetIntegerv(GL_TEXTURE_BINDING_2D, &saved_texture_binding);
263 GLsizei fb_width = 0;
264 GLsizei fb_height = 0;
265 if (
self->framebuffer !=
nullptr) {
271 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, fb_width, fb_height, 0, GL_RGBA,
272 GL_UNSIGNED_BYTE,
self->pixels);
279 glBindTexture(GL_TEXTURE_2D, saved_texture_binding);
void gdk_cairo_draw_from_gl(cairo_t *cr, GdkWindow *window, int source, int source_type, int buffer_scale, int x, int y, int width, int height)