From d7af16c8e421ffb151d8a5330d69827fc6778fe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Wed, 11 Apr 2018 11:20:50 +0200 Subject: [PATCH] gl renderer: Render everyhing according to MV scale And not the surface's scale factor. This way the magnifier works. --- gsk/gl/gskglrenderer.c | 59 ++++++++++-------- gsk/gl/gskglrenderops.c | 9 +++ gsk/gl/gskglrenderopsprivate.h | 2 + .../gsk/gl/cross_fade_transformed.gl.png | Bin 1628 -> 1681 bytes 4 files changed, 44 insertions(+), 26 deletions(-) diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c index 5fdc73dd38..3f7c670f8d 100644 --- a/gsk/gl/gskglrenderer.c +++ b/gsk/gl/gskglrenderer.c @@ -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); diff --git a/gsk/gl/gskglrenderops.c b/gsk/gl/gskglrenderops.c index c7134297a4..ea5c525635 100644 --- a/gsk/gl/gskglrenderops.c +++ b/gsk/gl/gskglrenderops.c @@ -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) diff --git a/gsk/gl/gskglrenderopsprivate.h b/gsk/gl/gskglrenderopsprivate.h index 5cd9177dda..917c3fc8de 100644 --- a/gsk/gl/gskglrenderopsprivate.h +++ b/gsk/gl/gskglrenderopsprivate.h @@ -235,6 +235,8 @@ typedef struct +float ops_get_scale (const RenderOpBuilder *builder); + void ops_set_program (RenderOpBuilder *builder, const Program *program); diff --git a/testsuite/gsk/gl/cross_fade_transformed.gl.png b/testsuite/gsk/gl/cross_fade_transformed.gl.png index 2fcdb3f70fab4f2d2631b36fe14e639b973c5907..2c3cf4ed41110276f61f06f3d31764f7a6f64177 100644 GIT binary patch literal 1681 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4mO}jWo=(6kYY>nc6VX;4}uH!E}sk(aPxF= z45^s&_RhghWj7Jmz>_{geit~;+-tsEuwl~lw}$@=tnacvcTv!I^=&oV%b#`o|5q^l zfBm!O-`|(#4@|#r_m`2OZfXLfF$?z$#fSqu2bt11#0;D_G)OkFo)OSVXd9IxDKtL5 zy)57G|Hr?-$CukP#oy~c{(k;Ho*Kb5Grm9m`Lh4O{ynx%L37v)4j<~;xFIU;-?HT# zVLb_3Il{UxGo(dC7>b2;w_a6>Fw{TjCAdaxIpdiP8xLv2AQ1&I z=VR(^h!{{E%j%<<48}TZB)C@}J(MN5M&cllfEokV3YE6kznqi^w6#Y)u{&X_1#d!I zt7vlK)`$q*Ceg>cTXdVQJ~C;L6a&kH-O~hgl&&B1jKsvFKt(`TqB<8z`p4Eb+|Jp5 z?E>7K3ZZR4qma!^I0_60@|=@!bdUXC#vdnN14Dm4M_Awf7rN&byMV(E7%cDr2Zq7H zE?|fp%qo;Rz{9P5>`)dk8d$WCtvB5QkArzFAP*)S{gLI@z5W?cys!0YQsPudXaNHZ z;`RJ`=OD0gA60Tt!x%MsfaXJ#g-#HAeo-mH5){Ruz$gY<14KCe|M|h&_v_=!^9-S4Vg`r*Z%F!co+YnIR5_xc z*czM^T3OA3VW+cWrz|Aonq~vzOYF`aK1kv@c=jzM1&iHb(RSPL;8__YA#xKmWDl?m zQt;VOq@%L~6vm1OBYlAhojWg&9g8)qjxjff}!CUt)& zoKC|uXWuMl^Mj{0Zg>EW2x7g6W)AUQq(V5|2A2iEFyaIj7(@p)a$p^7nvKhle~dDV WPQ=ETE9V327zR&QKbLh*2~7a~?vpS8 literal 1628 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4mO}jWo=(6kYY>nc6VX;4}uH!E}sk(5cG6$ z45^s&_U^&nlu!Yei&_UbWsWr7G(N#x7= zXa6vN-udVE-`BD2`}64?JHwCtEMgNBH#G1xvZiq8C^#oDN-}Yu5QuPSJHTW#Dn(Lg z^xVJqm*LOp?fLib|K+Huw3XYx|F`6iMTv}(QrBkqTc?~_E;uvEs)6Tq@|o8kYrZRg z5biDSzRX}`vc^#Aniy|3lx=UaMpM4*m&kI)l#GbvxUv%>_Y-psWgXhS8Xk*2q& zuTaXNtl#*65h_N`Fo z*L&}9eSG(kNdpgWcF*<}6jeYMK!UI*KKlm3Tx8pUh9bKJXg?`B?Bw_F`z`pR^F1is zz+nyyW}ve%LlYQ)72Z3bZr*=w19mqf`|`)uHeFC~08<1omVk!dNz8@Br5i{T3;S8S ztkF@RLLc@CiM2h2z#sy;1`^1~-ux4FSPT^DXbw)C+yC?P$LrtA?U~nH0_O4Zh~zsn z51a)i5>PDvJ>Ywo$!N`I!*?4Vqydv9FtFQL%`byf-5%AJ*=?*T5zmwFBp!rn;N{L+ z293A^V_+G1x2TCxDG1dRz9H^#Q^HDX}}iKn7-*kFsL8 z9rWxlU*lwmi{|&S_(6R2ahd?S!;h^u#S^*+&jW)k6BucwcE^CWLhQc?kB$Gcn4!_} r=ei6`U9=NMK<~fCV9v{Z;s^UtwRuv@H%j>ds|yBCS3j3^P6