gtk/gsk/gpu/gskgpuprint.c
Benjamin Otte 53821da4d6 gpu: Refactor image handling
Introduce a new GskGpuImageDescriptors object that tracks descriptors
for a set of images that can be managed by the GPU.
Then have each GskGpuShaderOp just reference the descriptors object they are
using, so that the coe can set things up properly.

To reference an image, the ops now just reference their descriptor -
which is the uint32 we've been sending to the shaders since forever.
2024-01-07 07:22:50 +01:00

116 lines
2.9 KiB
C

#include "config.h"
#include "gskgpuprintprivate.h"
#include "gskgpudescriptorsprivate.h"
#include "gskgpuimageprivate.h"
void
gsk_gpu_print_indent (GString *string,
guint indent)
{
g_string_append_printf (string, "%*s", 2 * indent, "");
}
void
gsk_gpu_print_op (GString *string,
guint indent,
const char *op_name)
{
gsk_gpu_print_indent (string, indent);
g_string_append (string, op_name);
g_string_append_c (string, ' ');
}
void
gsk_gpu_print_rect (GString *string,
const float rect[4])
{
g_string_append_printf (string, "%g %g %g %g ",
rect[0], rect[1],
rect[2], rect[3]);
}
void
gsk_gpu_print_int_rect (GString *string,
const cairo_rectangle_int_t *rect)
{
g_string_append_printf (string, "%d %d %d %d ",
rect->x, rect->y,
rect->width, rect->height);
}
void
gsk_gpu_print_rounded_rect (GString *string,
const float rect[12])
{
gsk_gpu_print_rect (string, (const float *) rect);
if (rect[4] == 0.0 && rect[5] == 0.0 &&
rect[6] == 0.0 && rect[7] == 0.0 &&
rect[8] == 0.0 && rect[9] == 0.0 &&
rect[10] == 0.0 && rect[11] == 0.0)
return;
g_string_append (string, "/ ");
if (rect[4] != rect[5] ||
rect[6] != rect[7] ||
rect[8] != rect[9] ||
rect[10] != rect[11])
{
g_string_append (string, "variable ");
}
else if (rect[4] != rect[6] ||
rect[4] != rect[8] ||
rect[4] != rect[10])
{
g_string_append_printf (string, "%g %g %g %g ",
rect[4], rect[6],
rect[8], rect[10]);
}
else
{
g_string_append_printf (string, "%g ", rect[4]);
}
}
void
gsk_gpu_print_rgba (GString *string,
const float rgba[4])
{
GdkRGBA color = { rgba[0], rgba[1], rgba[2], rgba[3] };
char *s = gdk_rgba_to_string (&color);
g_string_append (string, s);
g_string_append_c (string, ' ');
g_free (s);
}
void
gsk_gpu_print_newline (GString *string)
{
if (string->len && string->str[string->len - 1] == ' ')
string->str[string->len - 1] = '\n';
else
g_string_append_c (string, '\n');
}
void
gsk_gpu_print_image (GString *string,
GskGpuImage *image)
{
g_string_append_printf (string, "%zux%zu ",
gsk_gpu_image_get_width (image),
gsk_gpu_image_get_height (image));
}
void
gsk_gpu_print_image_descriptor (GString *string,
GskGpuDescriptors *desc,
guint32 descriptor)
{
gsize id = gsk_gpu_descriptors_find_image (desc, descriptor);
gsk_gpu_print_image (string, gsk_gpu_descriptors_get_image (desc, id));
}