buffer: reduce unnecessary painting to new cairo surfaces

Add buffer_adopt_cairo_surface(), which allows wrapping an existing
cairo image surface in a struct lab_data_buffer. This is useful when
loading PNGs since most will be loaded as ARGB32 already.

Fix a memory leak in the non-ARGB32 PNG case, where we do still need to
paint to a new image surface -- we were leaking the original surface.

Eliminate an unnecessary temporary image surface in SVG loading and just
render the SVG to the image surface held by the lab_data_buffer.

I also cleaned up and clarified the buffer API a bit:

- Add a pointer to the held cairo_surface_t (so we can still access it
  if there is no cairo_t).
- Remove the free_on_destroy bool (it was always true).
- Rename unscaled_width/height to logical_width/height and add an
  explanatory comment. It was unclear what "unscaled" meant.
- Rename buffer_create_wrap() to buffer_create_from_data().

This is laying groundwork for some more icon fixes I am working on
(making sure icons are loaded and rendered at the correct scale).
This commit is contained in:
John Lindgren 2024-10-06 01:42:54 -04:00 committed by Johan Malm
parent 328f873db3
commit d2b161bdf8
14 changed files with 123 additions and 84 deletions

View file

@ -266,8 +266,8 @@ img_xbm_from_bitmap(const char *bitmap, struct lab_data_buffer **buffer,
}
color = argb32(rgba);
pixmap = parse_xbm_builtin(bitmap, 6);
*buffer = buffer_create_wrap(pixmap.data, pixmap.width, pixmap.height,
pixmap.width * 4, /* free_on_destroy */ true);
*buffer = buffer_create_from_data(pixmap.data, pixmap.width, pixmap.height,
pixmap.width * 4);
}
void
@ -298,9 +298,9 @@ img_xbm_load(const char *filename, struct lab_data_buffer **buffer,
return;
}
/* Create buffer with free_on_destroy being true */
/* Create buffer */
if (pixmap.data) {
*buffer = buffer_create_wrap(pixmap.data, pixmap.width,
pixmap.height, pixmap.width * 4, true);
*buffer = buffer_create_from_data(pixmap.data, pixmap.width,
pixmap.height, pixmap.width * 4);
}
}