aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2023-01-02 17:04:16 -0500
committerDavid Robillard <d@drobilla.net>2023-01-02 17:04:16 -0500
commitbc50edc0c5bfc4f42289150c8b9f3556cb6bff5c (patch)
treeebfc125207847a8a5ff4b7a1c032c269ccb7e848
parent23a1b165950d2f7b738ed42144e1569f0c82793c (diff)
downloadpugl-bc50edc0c5bfc4f42289150c8b9f3556cb6bff5c.tar.gz
pugl-bc50edc0c5bfc4f42289150c8b9f3556cb6bff5c.tar.bz2
pugl-bc50edc0c5bfc4f42289150c8b9f3556cb6bff5c.zip
X11: Create Cairo drawing surface with precisely the needed size
This decouples drawing from the view frame, which can be out of sync with the drawing that is currently happening.
-rw-r--r--src/x11_cairo.c23
1 files changed, 11 insertions, 12 deletions
diff --git a/src/x11_cairo.c b/src/x11_cairo.c
index 74de735..be9ae09 100644
--- a/src/x11_cairo.c
+++ b/src/x11_cairo.c
@@ -11,6 +11,7 @@
#include <cairo-xlib.h>
#include <cairo.h>
+#include <math.h>
#include <stdlib.h>
typedef struct {
@@ -31,22 +32,20 @@ puglX11CairoClose(PuglView* view)
}
static PuglStatus
-puglX11CairoOpen(PuglView* view)
+puglX11CairoOpen(PuglView* view,
+ const double expose_width,
+ const double expose_height)
{
PuglInternals* const impl = view->impl;
PuglX11CairoSurface* const surface = (PuglX11CairoSurface*)impl->surface;
+ const int width = (int)ceil(expose_width);
+ const int height = (int)ceil(expose_height);
- surface->back = cairo_xlib_surface_create(view->world->impl->display,
- impl->win,
- impl->vi->visual,
- (int)view->frame.width,
- (int)view->frame.height);
+ surface->back = cairo_xlib_surface_create(
+ view->world->impl->display, impl->win, impl->vi->visual, width, height);
- surface->front =
- cairo_surface_create_similar(surface->back,
- cairo_surface_get_content(surface->back),
- (int)view->frame.width,
- (int)view->frame.height);
+ surface->front = cairo_surface_create_similar(
+ surface->back, cairo_surface_get_content(surface->back), width, height);
if (cairo_surface_status(surface->back) ||
cairo_surface_status(surface->front)) {
@@ -84,7 +83,7 @@ puglX11CairoEnter(PuglView* view, const PuglExposeEvent* expose)
PuglX11CairoSurface* const surface = (PuglX11CairoSurface*)impl->surface;
PuglStatus st = PUGL_SUCCESS;
- if (expose && !(st = puglX11CairoOpen(view))) {
+ if (expose && !(st = puglX11CairoOpen(view, expose->width, expose->height))) {
surface->cr = cairo_create(surface->front);
st = cairo_status(surface->cr) ? PUGL_CREATE_CONTEXT_FAILED : PUGL_SUCCESS;
}