[gtk/ngl-less-shaders: 8/17] ngl: Refactor gsk_ngl_render_job_visit_border_node
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/ngl-less-shaders: 8/17] ngl: Refactor gsk_ngl_render_job_visit_border_node
- Date: Sun, 14 Mar 2021 20:17:22 +0000 (UTC)
commit 5f3c271f9d57f75eaa046791e82503f92151fe48
Author: Matthias Clasen <mclasen redhat com>
Date: Sat Mar 13 13:40:04 2021 -0500
ngl: Refactor gsk_ngl_render_job_visit_border_node
With color sorting out of the picture, this can
be much simpler.
gsk/ngl/gsknglrenderjob.c | 181 ++++++++++++++++++++--------------------------
1 file changed, 78 insertions(+), 103 deletions(-)
---
diff --git a/gsk/ngl/gsknglrenderjob.c b/gsk/ngl/gsknglrenderjob.c
index 8f67575564..94f56f63de 100644
--- a/gsk/ngl/gsknglrenderjob.c
+++ b/gsk/ngl/gsknglrenderjob.c
@@ -1740,128 +1740,103 @@ gsk_ngl_render_job_visit_border_node (GskNglRenderJob *job,
float w;
float h;
} sizes[4];
+ float min_x = job->offset_x + node->bounds.origin.x;
+ float min_y = job->offset_y + node->bounds.origin.y;
+ float max_x = min_x + node->bounds.size.width;
+ float max_y = min_y + node->bounds.size.height;
+ GskRoundedRect outline;
- /* Top left */
- if (widths[3] > 0)
- sizes[0].w = MAX (widths[3], rounded_outline->corner[0].width);
- else
- sizes[0].w = 0;
+ memset (sizes, 0, sizeof sizes);
if (widths[0] > 0)
- sizes[0].h = MAX (widths[0], rounded_outline->corner[0].height);
- else
- sizes[0].h = 0;
+ {
+ sizes[0].h = MAX (widths[0], rounded_outline->corner[0].height);
+ sizes[1].h = MAX (widths[0], rounded_outline->corner[1].height);
+ }
- /* Top right */
if (widths[1] > 0)
- sizes[1].w = MAX (widths[1], rounded_outline->corner[1].width);
- else
- sizes[1].w = 0;
+ {
+ sizes[1].w = MAX (widths[1], rounded_outline->corner[1].width);
+ sizes[2].w = MAX (widths[1], rounded_outline->corner[2].width);
+ }
- if (widths[0] > 0)
- sizes[1].h = MAX (widths[0], rounded_outline->corner[1].height);
- else
- sizes[1].h = 0;
+ if (widths[2] > 0)
+ {
+ sizes[2].h = MAX (widths[2], rounded_outline->corner[2].height);
+ sizes[3].h = MAX (widths[2], rounded_outline->corner[3].height);
+ }
- /* Bottom right */
- if (widths[1] > 0)
- sizes[2].w = MAX (widths[1], rounded_outline->corner[2].width);
- else
- sizes[2].w = 0;
+ if (widths[3] > 0)
+ {
+ sizes[0].w = MAX (widths[3], rounded_outline->corner[0].width);
+ sizes[3].w = MAX (widths[3], rounded_outline->corner[3].width);
+ }
- if (widths[2] > 0)
- sizes[2].h = MAX (widths[2], rounded_outline->corner[2].height);
- else
- sizes[2].h = 0;
+ gsk_ngl_render_job_transform_rounded_rect (job, rounded_outline, &outline);
+ gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, border));
- /* Bottom left */
- if (widths[3] > 0)
- sizes[3].w = MAX (widths[3], rounded_outline->corner[3].width);
- else
- sizes[3].w = 0;
+ gsk_ngl_program_set_uniform4fv (job->current_program,
+ UNIFORM_BORDER_WIDTHS, 0,
+ 1,
+ widths);
+ gsk_ngl_program_set_uniform_rounded_rect (job->current_program,
+ UNIFORM_BORDER_OUTLINE_RECT, 0,
+ &outline);
- if (widths[2] > 0)
- sizes[3].h = MAX (widths[2], rounded_outline->corner[3].height);
- else
- sizes[3].h = 0;
+ if (widths[0] > 0)
+ {
+ GskNglDrawVertex *vertices = gsk_ngl_command_queue_add_vertices (job->command_queue);
- {
- float min_x = job->offset_x + node->bounds.origin.x;
- float min_y = job->offset_y + node->bounds.origin.y;
- float max_x = min_x + node->bounds.size.width;
- float max_y = min_y + node->bounds.size.height;
- const GskNglDrawVertex side_data[4][6] = {
- /* Top */
- {
- { { min_x, min_y }, { 0, 1 }, { c[0].red, c[0].green, c[0].blue,
c[0].alpha } }, /* Upper left */
- { { min_x + sizes[0].w, min_y + sizes[0].h }, { 0, 0 }, { c[0].red, c[0].green, c[0].blue,
c[0].alpha } }, /* Lower left */
- { { max_x, min_y }, { 1, 1 }, { c[0].red, c[0].green, c[0].blue,
c[0].alpha } }, /* Upper right */
-
- { { max_x - sizes[1].w, min_y + sizes[1].h }, { 1, 0 }, { c[0].red, c[0].green, c[0].blue,
c[0].alpha } }, /* Lower right */
- { { min_x + sizes[0].w, min_y + sizes[0].h }, { 0, 0 }, { c[0].red, c[0].green, c[0].blue,
c[0].alpha } }, /* Lower left */
- { { max_x, min_y }, { 1, 1 }, { c[0].red, c[0].green, c[0].blue,
c[0].alpha } }, /* Upper right */
- },
- /* Right */
- {
- { { max_x - sizes[1].w, min_y + sizes[1].h }, { 0, 1 }, { c[1].red, c[1].green, c[1].blue,
c[1].alpha } }, /* Upper left */
- { { max_x - sizes[2].w, max_y - sizes[2].h }, { 0, 0 }, { c[1].red, c[1].green, c[1].blue,
c[1].alpha } }, /* Lower left */
- { { max_x, min_y }, { 1, 1 }, { c[1].red, c[1].green, c[1].blue,
c[1].alpha } }, /* Upper right */
-
- { { max_x, max_y }, { 1, 0 }, { c[1].red, c[1].green, c[1].blue,
c[1].alpha } }, /* Lower right */
- { { max_x - sizes[2].w, max_y - sizes[2].h }, { 0, 0 }, { c[1].red, c[1].green, c[1].blue,
c[1].alpha } }, /* Lower left */
- { { max_x, min_y }, { 1, 1 }, { c[1].red, c[1].green, c[1].blue,
c[1].alpha } }, /* Upper right */
- },
- /* Bottom */
- {
- { { min_x + sizes[3].w, max_y - sizes[3].h }, { 0, 1 }, { c[2].red, c[2].green, c[2].blue,
c[2].alpha } }, /* Upper left */
- { { min_x, max_y }, { 0, 0 }, { c[2].red, c[2].green, c[2].blue,
c[2].alpha } }, /* Lower left */
- { { max_x - sizes[2].w, max_y - sizes[2].h }, { 1, 1 }, { c[2].red, c[2].green, c[2].blue,
c[2].alpha } }, /* Upper right */
-
- { { max_x, max_y }, { 1, 0 }, { c[2].red, c[2].green, c[2].blue,
c[2].alpha } }, /* Lower right */
- { { min_x , max_y }, { 0, 0 }, { c[2].red, c[2].green, c[2].blue,
c[2].alpha } }, /* Lower left */
- { { max_x - sizes[2].w, max_y - sizes[2].h }, { 1, 1 }, { c[2].red, c[2].green, c[2].blue,
c[2].alpha } }, /* Upper right */
- },
- /* Left */
- {
- { { min_x, min_y }, { 0, 1 }, { c[3].red, c[3].green, c[3].blue,
c[3].alpha } }, /* Upper left */
- { { min_x, max_y }, { 0, 0 }, { c[3].red, c[3].green, c[3].blue,
c[3].alpha } }, /* Lower left */
- { { min_x + sizes[0].w, min_y + sizes[0].h }, { 1, 1 }, { c[3].red, c[3].green, c[3].blue,
c[3].alpha } }, /* Upper right */
+ vertices[0] = (GskNglDrawVertex) { { min_x, min_y }, { 0, 1 }, { c[0].red,
c[0].green, c[0].blue, c[0].alpha } };
+ vertices[1] = (GskNglDrawVertex) { { min_x + sizes[0].w, min_y + sizes[0].h }, { 0, 0 }, { c[0].red,
c[0].green, c[0].blue, c[0].alpha } };
+ vertices[2] = (GskNglDrawVertex) { { max_x, min_y }, { 1, 1 }, { c[0].red,
c[0].green, c[0].blue, c[0].alpha } };
- { { min_x + sizes[3].w, max_y - sizes[3].h }, { 1, 0 }, { c[3].red, c[3].green, c[3].blue,
c[3].alpha } }, /* Lower right */
- { { min_x, max_y }, { 0, 0 }, { c[3].red, c[3].green, c[3].blue,
c[3].alpha } }, /* Lower left */
- { { min_x + sizes[0].w, min_y + sizes[0].h }, { 1, 1 }, { c[3].red, c[3].green, c[3].blue,
c[3].alpha } }, /* Upper right */
- }
- };
- GskRoundedRect outline;
- GskNglProgram *program;
+ vertices[3] = (GskNglDrawVertex) { { max_x - sizes[1].w, min_y + sizes[1].h }, { 1, 0 }, { c[0].red,
c[0].green, c[0].blue, c[0].alpha } };
+ vertices[4] = (GskNglDrawVertex) { { min_x + sizes[0].w, min_y + sizes[0].h }, { 0, 0 }, { c[0].red,
c[0].green, c[0].blue, c[0].alpha } };
+ vertices[5] = (GskNglDrawVertex) { { max_x, min_y }, { 1, 1 }, { c[0].red,
c[0].green, c[0].blue, c[0].alpha } };
+ }
- /* Prepare outline */
- gsk_ngl_render_job_transform_rounded_rect (job, rounded_outline, &outline);
+ if (widths[1] > 0)
+ {
+ GskNglDrawVertex *vertices = gsk_ngl_command_queue_add_vertices (job->command_queue);
- program = CHOOSE_PROGRAM (job, border);
+ vertices[0] = (GskNglDrawVertex) { { max_x - sizes[1].w, min_y + sizes[1].h }, { 0, 1 }, { c[1].red,
c[1].green, c[1].blue, c[1].alpha } };
+ vertices[1] = (GskNglDrawVertex) { { max_x - sizes[2].w, max_y - sizes[2].h }, { 0, 0 }, { c[1].red,
c[1].green, c[1].blue, c[1].alpha } };
+ vertices[2] = (GskNglDrawVertex) { { max_x, min_y }, { 1, 1 }, { c[1].red,
c[1].green, c[1].blue, c[1].alpha } };
- gsk_ngl_program_set_uniform4fv (program,
- UNIFORM_BORDER_WIDTHS, 0,
- 1,
- widths);
- gsk_ngl_program_set_uniform_rounded_rect (program,
- UNIFORM_BORDER_OUTLINE_RECT, 0,
- &outline);
+ vertices[3] = (GskNglDrawVertex) { { max_x, max_y }, { 1, 0 }, { c[1].red,
c[1].green, c[1].blue, c[1].alpha } };
+ vertices[4] = (GskNglDrawVertex) { { max_x - sizes[2].w, max_y - sizes[2].h }, { 0, 0 }, { c[1].red,
c[1].green, c[1].blue, c[1].alpha } };
+ vertices[5] = (GskNglDrawVertex) { { max_x, min_y }, { 1, 1 }, { c[1].red,
c[1].green, c[1].blue, c[1].alpha } };
+ }
- for (guint i = 0; i < 4; i++)
- {
- GskNglDrawVertex *vertices;
+ if (widths[2] > 0)
+ {
+ GskNglDrawVertex *vertices = gsk_ngl_command_queue_add_vertices (job->command_queue);
- if (widths[i] <= 0)
- continue;
+ vertices[0] = (GskNglDrawVertex) { { min_x + sizes[3].w, max_y - sizes[3].h }, { 0, 1 }, { c[2].red,
c[2].green, c[2].blue, c[2].alpha } };
+ vertices[1] = (GskNglDrawVertex) { { min_x, max_y }, { 0, 0 }, { c[2].red,
c[2].green, c[2].blue, c[2].alpha } };
+ vertices[2] = (GskNglDrawVertex) { { max_x - sizes[2].w, max_y - sizes[2].h }, { 1, 1 }, { c[2].red,
c[2].green, c[2].blue, c[2].alpha } };
- gsk_ngl_render_job_begin_draw (job, program);
- vertices = gsk_ngl_command_queue_add_vertices (job->command_queue);
- memcpy (vertices, side_data[i], sizeof (GskNglDrawVertex) * GSK_NGL_N_VERTICES);
- gsk_ngl_render_job_end_draw (job);
- }
- }
+ vertices[3] = (GskNglDrawVertex) { { max_x, max_y }, { 1, 0 }, { c[2].red,
c[2].green, c[2].blue, c[2].alpha } };
+ vertices[4] = (GskNglDrawVertex) { { min_x , max_y }, { 0, 0 }, { c[2].red,
c[2].green, c[2].blue, c[2].alpha } };
+ vertices[5] = (GskNglDrawVertex) { { max_x - sizes[2].w, max_y - sizes[2].h }, { 1, 1 }, { c[2].red,
c[2].green, c[2].blue, c[2].alpha } };
+ }
+
+ if (widths[3] > 0)
+ {
+ GskNglDrawVertex *vertices = gsk_ngl_command_queue_add_vertices (job->command_queue);
+
+ vertices[0] = (GskNglDrawVertex) { { min_x, min_y }, { 0, 1 }, { c[3].red,
c[3].green, c[3].blue, c[3].alpha } };
+ vertices[1] = (GskNglDrawVertex) { { min_x, max_y }, { 0, 0 }, { c[3].red,
c[3].green, c[3].blue, c[3].alpha } };
+ vertices[2] = (GskNglDrawVertex) { { min_x + sizes[0].w, min_y + sizes[0].h }, { 1, 1 }, { c[3].red,
c[3].green, c[3].blue, c[3].alpha } };
+
+ vertices[3] = (GskNglDrawVertex) { { min_x + sizes[3].w, max_y - sizes[3].h }, { 1, 0 }, { c[3].red,
c[3].green, c[3].blue, c[3].alpha } };
+ vertices[4] = (GskNglDrawVertex) { { min_x, max_y }, { 0, 0 }, { c[3].red,
c[3].green, c[3].blue, c[3].alpha } };
+ vertices[5] = (GskNglDrawVertex) { { min_x + sizes[0].w, min_y + sizes[0].h }, { 1, 1 }, { c[3].red,
c[3].green, c[3].blue, c[3].alpha } };
+ }
+
+ gsk_ngl_render_job_end_draw (job);
}
/* Returns TRUE if applying @transform to @bounds
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]