Skip to content

Commit d7af16c

Browse files
committed
gl renderer: Render everyhing according to MV scale
And not the surface's scale factor. This way the magnifier works.
1 parent cc66b50 commit d7af16c

File tree

4 files changed

+44
-26
lines changed

4 files changed

+44
-26
lines changed

gsk/gl/gskglrenderer.c

Lines changed: 33 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ rounded_rect_to_floats (GskGLRenderer *self,
241241
float *corner_widths,
242242
float *corner_heights)
243243
{
244+
const float scale = ops_get_scale (builder);
244245
int i;
245246
graphene_rect_t transformed_bounds;
246247

@@ -253,8 +254,8 @@ rounded_rect_to_floats (GskGLRenderer *self,
253254

254255
for (i = 0; i < 4; i ++)
255256
{
256-
corner_widths[i] = rect->corner[i].width * self->scale_factor;
257-
corner_heights[i] = rect->corner[i].height * self->scale_factor;
257+
corner_widths[i] = rect->corner[i].width * scale;
258+
corner_heights[i] = rect->corner[i].height * scale;
258259
}
259260
}
260261

@@ -317,6 +318,7 @@ render_text_node (GskGLRenderer *self,
317318
{
318319
const PangoFont *font = gsk_text_node_peek_font (node);
319320
const PangoGlyphInfo *glyphs = gsk_text_node_peek_glyphs (node);
321+
const float text_scale = ops_get_scale (builder);
320322
guint num_glyphs = gsk_text_node_get_num_glyphs (node);
321323
int i;
322324
int x_position = 0;
@@ -352,7 +354,7 @@ render_text_node (GskGLRenderer *self,
352354
TRUE,
353355
(PangoFont *)font,
354356
gi->glyph,
355-
self->scale_factor);
357+
text_scale);
356358

357359
/* e.g. whitespace */
358360
if (glyph->draw_width <= 0 || glyph->draw_height <= 0)
@@ -362,7 +364,7 @@ render_text_node (GskGLRenderer *self,
362364
cy = (double)(gi->geometry.y_offset) / PANGO_SCALE;
363365

364366
ops_set_texture (builder, gsk_gl_glyph_cache_get_glyph_image (&self->glyph_cache,
365-
glyph)->texture_id);
367+
glyph)->texture_id);
366368

367369
tx = glyph->tx;
368370
ty = glyph->ty;
@@ -394,6 +396,7 @@ render_border_node (GskGLRenderer *self,
394396
GskRenderNode *node,
395397
RenderOpBuilder *builder)
396398
{
399+
const float scale = ops_get_scale (builder);
397400
const float min_x = node->bounds.origin.x;
398401
const float min_y = node->bounds.origin.y;
399402
const float max_x = min_x + node->bounds.size.width;
@@ -459,7 +462,7 @@ render_border_node (GskGLRenderer *self,
459462
sizes[3].h = 0;
460463

461464
for (i = 0; i < 4; i ++)
462-
widths[i] *= self->scale_factor;
465+
widths[i] *= scale;
463466

464467
{
465468
const GskQuadVertex side_data[4][6] = {
@@ -516,8 +519,8 @@ render_border_node (GskGLRenderer *self,
516519
&outline.bounds, &outline.bounds);
517520
for (i = 0; i < 4; i ++)
518521
{
519-
outline.corner[i].width *= self->scale_factor;
520-
outline.corner[i].height *= self->scale_factor;
522+
outline.corner[i].width *= scale;
523+
outline.corner[i].height *= scale;
521524
}
522525

523526
ops_set_program (builder, &self->border_program);
@@ -737,6 +740,7 @@ render_rounded_clip_node (GskGLRenderer *self,
737740
GskRenderNode *node,
738741
RenderOpBuilder *builder)
739742
{
743+
const float scale = ops_get_scale (builder);
740744
const float min_x = node->bounds.origin.x;
741745
const float min_y = node->bounds.origin.y;
742746
const float max_x = min_x + node->bounds.size.width;
@@ -756,14 +760,14 @@ render_rounded_clip_node (GskGLRenderer *self,
756760
* We do, however, apply the scale factor to the child clip of course.
757761
*/
758762

759-
graphene_matrix_init_scale (&scale_matrix, self->scale_factor, self->scale_factor, 1.0f);
763+
graphene_matrix_init_scale (&scale_matrix, scale, scale, 1.0f);
760764
graphene_matrix_transform_bounds (&scale_matrix, &child_clip.bounds, &child_clip.bounds);
761765

762766
/* Increase corner radius size by scale factor */
763767
for (i = 0; i < 4; i ++)
764768
{
765-
child_clip.corner[i].width *= self->scale_factor;
766-
child_clip.corner[i].height *= self->scale_factor;
769+
child_clip.corner[i].width *= scale;
770+
child_clip.corner[i].height *= scale;
767771
}
768772

769773
prev_clip = ops_set_clip (builder, &child_clip);
@@ -881,6 +885,7 @@ render_inset_shadow_node (GskGLRenderer *self,
881885
RenderOpBuilder *builder,
882886
const GskQuadVertex *vertex_data)
883887
{
888+
const float scale = ops_get_scale (builder);
884889
RenderOp op;
885890

886891
/* TODO: Implement blurred inset shadows as well */
@@ -897,10 +902,10 @@ render_inset_shadow_node (GskGLRenderer *self,
897902
op.inset_shadow.outline,
898903
op.inset_shadow.corner_widths,
899904
op.inset_shadow.corner_heights);
900-
op.inset_shadow.radius = gsk_inset_shadow_node_get_blur_radius (node) * self->scale_factor;
901-
op.inset_shadow.spread = gsk_inset_shadow_node_get_spread (node) * self->scale_factor;
902-
op.inset_shadow.offset[0] = gsk_inset_shadow_node_get_dx (node) * self->scale_factor;
903-
op.inset_shadow.offset[1] = -gsk_inset_shadow_node_get_dy (node) * self->scale_factor;
905+
op.inset_shadow.radius = gsk_inset_shadow_node_get_blur_radius (node) * scale;
906+
op.inset_shadow.spread = gsk_inset_shadow_node_get_spread (node) * scale;
907+
op.inset_shadow.offset[0] = gsk_inset_shadow_node_get_dx (node) * scale;
908+
op.inset_shadow.offset[1] = -gsk_inset_shadow_node_get_dy (node) * scale;
904909

905910
ops_set_program (builder, &self->inset_shadow_program);
906911
ops_add (builder, &op);
@@ -913,6 +918,7 @@ render_unblurred_outset_shadow_node (GskGLRenderer *self,
913918
RenderOpBuilder *builder,
914919
const GskQuadVertex *vertex_data)
915920
{
921+
const float scale = ops_get_scale (builder);
916922
const float spread = gsk_outset_shadow_node_get_spread (node);
917923
GskRoundedRect r = *gsk_outset_shadow_node_peek_outline (node);
918924
RenderOp op;
@@ -928,9 +934,9 @@ render_unblurred_outset_shadow_node (GskGLRenderer *self,
928934
op.unblurred_outset_shadow.corner_widths,
929935
op.unblurred_outset_shadow.corner_heights);
930936

931-
op.unblurred_outset_shadow.spread = gsk_outset_shadow_node_get_spread (node) * self->scale_factor;
932-
op.unblurred_outset_shadow.offset[0] = gsk_outset_shadow_node_get_dx (node) * self->scale_factor;
933-
op.unblurred_outset_shadow.offset[1] = -gsk_outset_shadow_node_get_dy (node) * self->scale_factor;
937+
op.unblurred_outset_shadow.spread = gsk_outset_shadow_node_get_spread (node) * scale;
938+
op.unblurred_outset_shadow.offset[0] = gsk_outset_shadow_node_get_dx (node) * scale;
939+
op.unblurred_outset_shadow.offset[1] = -gsk_outset_shadow_node_get_dy (node) * scale;
934940

935941
ops_set_program (builder, &self->unblurred_outset_shadow_program);
936942
ops_add (builder, &op);
@@ -2145,8 +2151,9 @@ add_offscreen_ops (GskGLRenderer *self,
21452151
gboolean force_offscreen,
21462152
gboolean reset_clip)
21472153
{
2148-
const float width = (max_x - min_x) * self->scale_factor;
2149-
const float height = (max_y - min_y) * self->scale_factor;
2154+
const float scale = ops_get_scale (builder);
2155+
const float width = (max_x - min_x) * scale;
2156+
const float height = (max_y - min_y) * scale;
21502157
int render_target;
21512158
int prev_render_target;
21522159
RenderOp op;
@@ -2180,26 +2187,26 @@ add_offscreen_ops (GskGLRenderer *self,
21802187
render_target = gsk_gl_driver_create_render_target (self->gl_driver, *texture_id, TRUE, TRUE);
21812188

21822189
graphene_matrix_init_ortho (&item_proj,
2183-
min_x * self->scale_factor, max_x * self->scale_factor,
2184-
min_y * self->scale_factor, max_y * self->scale_factor,
2190+
min_x * scale, max_x * scale,
2191+
min_y * scale, max_y * scale,
21852192
ORTHO_NEAR_PLANE, ORTHO_FAR_PLANE);
21862193
graphene_matrix_scale (&item_proj, 1, -1, 1);
21872194
graphene_matrix_init_identity (&identity);
2188-
graphene_matrix_scale (&identity, self->scale_factor, self->scale_factor, 1);
2195+
graphene_matrix_scale (&identity, scale, scale, 1);
21892196

21902197
prev_render_target = ops_set_render_target (builder, render_target);
21912198
/* Clear since we use this rendertarget for the first time */
21922199
op.op = OP_CLEAR;
21932200
ops_add (builder, &op);
21942201
prev_projection = ops_set_projection (builder, &item_proj);
21952202
prev_modelview = ops_set_modelview (builder, &identity);
2196-
prev_viewport = ops_set_viewport (builder, &GRAPHENE_RECT_INIT (min_x * self->scale_factor,
2197-
min_y * self->scale_factor,
2203+
prev_viewport = ops_set_viewport (builder, &GRAPHENE_RECT_INIT (min_x * scale,
2204+
min_y * scale,
21982205
width, height));
21992206
if (reset_clip)
22002207
prev_clip = ops_set_clip (builder,
2201-
&GSK_ROUNDED_RECT_INIT (min_x * self->scale_factor,
2202-
min_y * self->scale_factor,
2208+
&GSK_ROUNDED_RECT_INIT (min_x * scale,
2209+
min_y * scale,
22032210
width, height));
22042211

22052212
gsk_gl_renderer_add_render_ops (self, child_node, builder);

gsk/gl/gskglrenderops.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@ rgba_to_float (const GdkRGBA *c,
1010
f[3] = c->alpha;
1111
}
1212

13+
float
14+
ops_get_scale (const RenderOpBuilder *builder)
15+
{
16+
const graphene_matrix_t *mv = &builder->current_modelview;
17+
18+
return MAX (graphene_matrix_get_x_scale (mv),
19+
graphene_matrix_get_y_scale (mv));
20+
}
21+
1322
void
1423
ops_set_program (RenderOpBuilder *builder,
1524
const Program *program)

gsk/gl/gskglrenderopsprivate.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,8 @@ typedef struct
235235

236236

237237

238+
float ops_get_scale (const RenderOpBuilder *builder);
239+
238240
void ops_set_program (RenderOpBuilder *builder,
239241
const Program *program);
240242

53 Bytes
Loading

0 commit comments

Comments
 (0)