gl renderer: Render everyhing according to MV scale
authorTimm Bäder <mail@baedert.org>
Wed, 11 Apr 2018 09:20:50 +0000 (11:20 +0200)
committerTimm Bäder <mail@baedert.org>
Wed, 11 Apr 2018 13:31:22 +0000 (15:31 +0200)
And not the surface's scale factor. This way the magnifier works.

gsk/gl/gskglrenderer.c
gsk/gl/gskglrenderops.c
gsk/gl/gskglrenderopsprivate.h
testsuite/gsk/gl/cross_fade_transformed.gl.png

index 5fdc73dd380fd91eae04683c31abe6752ceaa9e8..3f7c670f8d012cb19f8066dbad0f656fb0e0381d 100644 (file)
@@ -241,6 +241,7 @@ rounded_rect_to_floats (GskGLRenderer        *self,
                         float                *corner_widths,
                         float                *corner_heights)
 {
+  const float scale = ops_get_scale (builder);
   int i;
   graphene_rect_t transformed_bounds;
 
@@ -253,8 +254,8 @@ rounded_rect_to_floats (GskGLRenderer        *self,
 
   for (i = 0; i < 4; i ++)
     {
-      corner_widths[i] = rect->corner[i].width * self->scale_factor;
-      corner_heights[i] = rect->corner[i].height * self->scale_factor;
+      corner_widths[i] = rect->corner[i].width * scale;
+      corner_heights[i] = rect->corner[i].height * scale;
     }
 }
 
@@ -317,6 +318,7 @@ render_text_node (GskGLRenderer   *self,
 {
   const PangoFont *font = gsk_text_node_peek_font (node);
   const PangoGlyphInfo *glyphs = gsk_text_node_peek_glyphs (node);
+  const float text_scale = ops_get_scale (builder);
   guint num_glyphs = gsk_text_node_get_num_glyphs (node);
   int i;
   int x_position = 0;
@@ -352,7 +354,7 @@ render_text_node (GskGLRenderer   *self,
                                          TRUE,
                                          (PangoFont *)font,
                                          gi->glyph,
-                                         self->scale_factor);
+                                         text_scale);
 
       /* e.g. whitespace */
       if (glyph->draw_width <= 0 || glyph->draw_height <= 0)
@@ -362,7 +364,7 @@ render_text_node (GskGLRenderer   *self,
       cy = (double)(gi->geometry.y_offset) / PANGO_SCALE;
 
       ops_set_texture (builder, gsk_gl_glyph_cache_get_glyph_image (&self->glyph_cache,
-                                                                   glyph)->texture_id);
+                                                                    glyph)->texture_id);
 
       tx  = glyph->tx;
       ty  = glyph->ty;
@@ -394,6 +396,7 @@ render_border_node (GskGLRenderer   *self,
                     GskRenderNode   *node,
                     RenderOpBuilder *builder)
 {
+  const float scale = ops_get_scale (builder);
   const float min_x = node->bounds.origin.x;
   const float min_y = node->bounds.origin.y;
   const float max_x = min_x + node->bounds.size.width;
@@ -459,7 +462,7 @@ render_border_node (GskGLRenderer   *self,
     sizes[3].h = 0;
 
   for (i = 0; i < 4; i ++)
-    widths[i] *= self->scale_factor;
+    widths[i] *= scale;
 
   {
     const GskQuadVertex side_data[4][6] = {
@@ -516,8 +519,8 @@ render_border_node (GskGLRenderer   *self,
                                       &outline.bounds, &outline.bounds);
     for (i = 0; i < 4; i ++)
       {
-        outline.corner[i].width *= self->scale_factor;
-        outline.corner[i].height *= self->scale_factor;
+        outline.corner[i].width *= scale;
+        outline.corner[i].height *= scale;
       }
 
     ops_set_program (builder, &self->border_program);
@@ -737,6 +740,7 @@ render_rounded_clip_node (GskGLRenderer       *self,
                           GskRenderNode       *node,
                           RenderOpBuilder     *builder)
 {
+  const float scale = ops_get_scale (builder);
   const float min_x = node->bounds.origin.x;
   const float min_y = node->bounds.origin.y;
   const float max_x = min_x + node->bounds.size.width;
@@ -756,14 +760,14 @@ render_rounded_clip_node (GskGLRenderer       *self,
    *       We do, however, apply the scale factor to the child clip of course.
    */
 
-  graphene_matrix_init_scale (&scale_matrix, self->scale_factor, self->scale_factor, 1.0f);
+  graphene_matrix_init_scale (&scale_matrix, scale, scale, 1.0f);
   graphene_matrix_transform_bounds (&scale_matrix, &child_clip.bounds, &child_clip.bounds);
 
   /* Increase corner radius size by scale factor */
   for (i = 0; i < 4; i ++)
     {
-      child_clip.corner[i].width *= self->scale_factor;
-      child_clip.corner[i].height *= self->scale_factor;
+      child_clip.corner[i].width *= scale;
+      child_clip.corner[i].height *= scale;
     }
 
   prev_clip = ops_set_clip (builder, &child_clip);
@@ -881,6 +885,7 @@ render_inset_shadow_node (GskGLRenderer       *self,
                           RenderOpBuilder     *builder,
                           const GskQuadVertex *vertex_data)
 {
+  const float scale = ops_get_scale (builder);
   RenderOp op;
 
   /* TODO: Implement blurred inset shadows as well */
@@ -897,10 +902,10 @@ render_inset_shadow_node (GskGLRenderer       *self,
                           op.inset_shadow.outline,
                           op.inset_shadow.corner_widths,
                           op.inset_shadow.corner_heights);
-  op.inset_shadow.radius = gsk_inset_shadow_node_get_blur_radius (node) * self->scale_factor;
-  op.inset_shadow.spread = gsk_inset_shadow_node_get_spread (node) * self->scale_factor;
-  op.inset_shadow.offset[0] = gsk_inset_shadow_node_get_dx (node) * self->scale_factor;
-  op.inset_shadow.offset[1] = -gsk_inset_shadow_node_get_dy (node) * self->scale_factor;
+  op.inset_shadow.radius = gsk_inset_shadow_node_get_blur_radius (node) * scale;
+  op.inset_shadow.spread = gsk_inset_shadow_node_get_spread (node) * scale;
+  op.inset_shadow.offset[0] = gsk_inset_shadow_node_get_dx (node) * scale;
+  op.inset_shadow.offset[1] = -gsk_inset_shadow_node_get_dy (node) * scale;
 
   ops_set_program (builder, &self->inset_shadow_program);
   ops_add (builder, &op);
@@ -913,6 +918,7 @@ render_unblurred_outset_shadow_node (GskGLRenderer       *self,
                                      RenderOpBuilder     *builder,
                                      const GskQuadVertex *vertex_data)
 {
+  const float scale = ops_get_scale (builder);
   const float spread = gsk_outset_shadow_node_get_spread (node);
   GskRoundedRect r = *gsk_outset_shadow_node_peek_outline (node);
   RenderOp op;
@@ -928,9 +934,9 @@ render_unblurred_outset_shadow_node (GskGLRenderer       *self,
                           op.unblurred_outset_shadow.corner_widths,
                           op.unblurred_outset_shadow.corner_heights);
 
-  op.unblurred_outset_shadow.spread = gsk_outset_shadow_node_get_spread (node) * self->scale_factor;
-  op.unblurred_outset_shadow.offset[0] = gsk_outset_shadow_node_get_dx (node) * self->scale_factor;
-  op.unblurred_outset_shadow.offset[1] = -gsk_outset_shadow_node_get_dy (node) * self->scale_factor;
+  op.unblurred_outset_shadow.spread = gsk_outset_shadow_node_get_spread (node) * scale;
+  op.unblurred_outset_shadow.offset[0] = gsk_outset_shadow_node_get_dx (node) * scale;
+  op.unblurred_outset_shadow.offset[1] = -gsk_outset_shadow_node_get_dy (node) * scale;
 
   ops_set_program (builder, &self->unblurred_outset_shadow_program);
   ops_add (builder, &op);
@@ -2145,8 +2151,9 @@ add_offscreen_ops (GskGLRenderer   *self,
                    gboolean         force_offscreen,
                    gboolean         reset_clip)
 {
-  const float width = (max_x - min_x) * self->scale_factor;
-  const float height = (max_y - min_y) * self->scale_factor;
+  const float scale = ops_get_scale (builder);
+  const float width = (max_x - min_x) * scale;
+  const float height = (max_y - min_y) * scale;
   int render_target;
   int prev_render_target;
   RenderOp op;
@@ -2180,12 +2187,12 @@ add_offscreen_ops (GskGLRenderer   *self,
   render_target = gsk_gl_driver_create_render_target (self->gl_driver, *texture_id, TRUE, TRUE);
 
   graphene_matrix_init_ortho (&item_proj,
-                              min_x * self->scale_factor, max_x * self->scale_factor,
-                              min_y * self->scale_factor, max_y * self->scale_factor,
+                              min_x * scale, max_x * scale,
+                              min_y * scale, max_y * scale,
                               ORTHO_NEAR_PLANE, ORTHO_FAR_PLANE);
   graphene_matrix_scale (&item_proj, 1, -1, 1);
   graphene_matrix_init_identity (&identity);
-  graphene_matrix_scale (&identity, self->scale_factor, self->scale_factor, 1);
+  graphene_matrix_scale (&identity, scale, scale, 1);
 
   prev_render_target = ops_set_render_target (builder, render_target);
   /* Clear since we use this rendertarget for the first time */
@@ -2193,13 +2200,13 @@ add_offscreen_ops (GskGLRenderer   *self,
   ops_add (builder, &op);
   prev_projection = ops_set_projection (builder, &item_proj);
   prev_modelview = ops_set_modelview (builder, &identity);
-  prev_viewport = ops_set_viewport (builder, &GRAPHENE_RECT_INIT (min_x * self->scale_factor,
-                                                                  min_y * self->scale_factor,
+  prev_viewport = ops_set_viewport (builder, &GRAPHENE_RECT_INIT (min_x * scale,
+                                                                  min_y * scale,
                                                                   width, height));
   if (reset_clip)
     prev_clip = ops_set_clip (builder,
-                              &GSK_ROUNDED_RECT_INIT (min_x * self->scale_factor,
-                                                      min_y * self->scale_factor,
+                              &GSK_ROUNDED_RECT_INIT (min_x * scale,
+                                                      min_y * scale,
                                                       width, height));
 
   gsk_gl_renderer_add_render_ops (self, child_node, builder);
index c7134297a45b5e22cc36dada0fc8cf88aa62c2a4..ea5c525635927e45b0a9992f75429445140ceaff 100644 (file)
@@ -10,6 +10,15 @@ rgba_to_float (const GdkRGBA *c,
   f[3] = c->alpha;
 }
 
+float
+ops_get_scale (const RenderOpBuilder *builder)
+{
+  const graphene_matrix_t *mv = &builder->current_modelview;
+
+  return MAX (graphene_matrix_get_x_scale (mv),
+              graphene_matrix_get_y_scale (mv));
+}
+
 void
 ops_set_program (RenderOpBuilder *builder,
                  const Program   *program)
index 5cd9177dda0950ec989ceec3c2bebe61f4a0aac7..917c3fc8de03d92010a931d000835892e43c44fa 100644 (file)
@@ -235,6 +235,8 @@ typedef struct
 
 
 
+float             ops_get_scale          (const RenderOpBuilder   *builder);
+
 void              ops_set_program        (RenderOpBuilder         *builder,
                                           const Program           *program);
 
index 2fcdb3f70fab4f2d2631b36fe14e639b973c5907..2c3cf4ed41110276f61f06f3d31764f7a6f64177 100644 (file)
Binary files a/testsuite/gsk/gl/cross_fade_transformed.gl.png and b/testsuite/gsk/gl/cross_fade_transformed.gl.png differ