mirror of
				https://github.com/labwc/labwc.git
				synced 2025-11-03 09:01:51 -05:00 
			
		
		
		
	ssd: rework titlebar button rendering
- fix that icons for normal/hovered/rounded buttons are not placed exactly the same position - fix blurry window button icons in scaled outputs This commit introduces lab_img and scaled_img_buffer and uses them for rendering icons in the window titlebar. Now the process of rendering button icons are split into 2 phases: loading with lab_img_load() and creating scene-nodes for them with scaled_img_buffer_create(). This might incur some additional overhead since we no longer preload icon textures, but the rendering of icon only happens for the first window as backing buffers are shared and the overhead won't be noticeable. This commit also simplifies the process of centering icon buffer in the button, by creating icon buffers in a fixed geometry via lab_img_render().
This commit is contained in:
		
							parent
							
								
									9a3412324d
								
							
						
					
					
						commit
						16dbdc64e5
					
				
					 25 changed files with 647 additions and 391 deletions
				
			
		| 
						 | 
				
			
			@ -10,24 +10,18 @@
 | 
			
		|||
#include <stdlib.h>
 | 
			
		||||
#include <wlr/util/log.h>
 | 
			
		||||
#include "buffer.h"
 | 
			
		||||
#include "img/img-svg.h"
 | 
			
		||||
#include "common/string-helpers.h"
 | 
			
		||||
#include "img/img-svg.h"
 | 
			
		||||
#include "labwc.h"
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
img_svg_load(const char *filename, struct lab_data_buffer **buffer, int size,
 | 
			
		||||
		float scale)
 | 
			
		||||
RsvgHandle *
 | 
			
		||||
img_svg_load(const char *filename)
 | 
			
		||||
{
 | 
			
		||||
	if (*buffer) {
 | 
			
		||||
		wlr_buffer_drop(&(*buffer)->base);
 | 
			
		||||
		*buffer = NULL;
 | 
			
		||||
	}
 | 
			
		||||
	if (string_null_or_empty(filename)) {
 | 
			
		||||
		return;
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	GError *err = NULL;
 | 
			
		||||
	RsvgRectangle viewport = { .width = size, .height = size };
 | 
			
		||||
	RsvgHandle *svg = rsvg_handle_new_from_file(filename, &err);
 | 
			
		||||
	if (err) {
 | 
			
		||||
		wlr_log(WLR_DEBUG, "error reading svg %s-%s", filename, err->message);
 | 
			
		||||
| 
						 | 
				
			
			@ -36,33 +30,43 @@ img_svg_load(const char *filename, struct lab_data_buffer **buffer, int size,
 | 
			
		|||
		 * rsvg_handle_new_from_file() returns NULL if an error occurs,
 | 
			
		||||
		 * so there is no need to free svg here.
 | 
			
		||||
		 */
 | 
			
		||||
		return;
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	return svg;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
	*buffer = buffer_create_cairo(size, size, scale);
 | 
			
		||||
	cairo_surface_t *image = (*buffer)->surface;
 | 
			
		||||
struct lab_data_buffer *
 | 
			
		||||
img_svg_render(RsvgHandle *svg, int w, int h, int padding, double scale)
 | 
			
		||||
{
 | 
			
		||||
	struct lab_data_buffer *buffer = buffer_create_cairo(w, h, scale);
 | 
			
		||||
	cairo_surface_t *image = buffer->surface;
 | 
			
		||||
	cairo_t *cr = cairo_create(image);
 | 
			
		||||
	GError *err = NULL;
 | 
			
		||||
 | 
			
		||||
	RsvgRectangle viewport = {
 | 
			
		||||
		.x = padding,
 | 
			
		||||
		.y = padding,
 | 
			
		||||
		.width = w - 2 * padding,
 | 
			
		||||
		.height = h - 2 * padding,
 | 
			
		||||
	};
 | 
			
		||||
	rsvg_handle_render_document(svg, cr, &viewport, &err);
 | 
			
		||||
	if (err) {
 | 
			
		||||
		wlr_log(WLR_ERROR, "error rendering svg %s-%s", filename, err->message);
 | 
			
		||||
		wlr_log(WLR_ERROR, "error rendering svg: %s", err->message);
 | 
			
		||||
		g_error_free(err);
 | 
			
		||||
		goto error;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (cairo_surface_status(image)) {
 | 
			
		||||
		wlr_log(WLR_ERROR, "error reading svg button '%s'", filename);
 | 
			
		||||
		wlr_log(WLR_ERROR, "error reading svg file");
 | 
			
		||||
		goto error;
 | 
			
		||||
	}
 | 
			
		||||
	cairo_surface_flush(image);
 | 
			
		||||
	cairo_surface_flush(buffer->surface);
 | 
			
		||||
	cairo_destroy(cr);
 | 
			
		||||
 | 
			
		||||
	g_object_unref(svg);
 | 
			
		||||
	return;
 | 
			
		||||
	return buffer;
 | 
			
		||||
 | 
			
		||||
error:
 | 
			
		||||
	wlr_buffer_drop(&(*buffer)->base);
 | 
			
		||||
	*buffer = NULL;
 | 
			
		||||
	wlr_buffer_drop(&buffer->base);
 | 
			
		||||
	cairo_destroy(cr);
 | 
			
		||||
	g_object_unref(svg);
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue