gl renderer: Render everyhing according to MV scale

And not the surface's scale factor. This way the magnifier works.
This commit is contained in:
Timm Bäder
2018-04-11 11:20:50 +02:00
parent cc66b50dcd
commit d7af16c8e4
4 changed files with 44 additions and 26 deletions

View 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);

View 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)

View File

@@ -235,6 +235,8 @@ typedef struct
float ops_get_scale (const RenderOpBuilder *builder);
void ops_set_program (RenderOpBuilder *builder,
const Program *program);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB