diff --git a/gsk/gpu/gskgpudevice.c b/gsk/gpu/gskgpudevice.c index a3ff14add4..d3348c6eb9 100644 --- a/gsk/gpu/gskgpudevice.c +++ b/gsk/gpu/gskgpudevice.c @@ -656,6 +656,7 @@ gsk_gpu_device_lookup_glyph_image (GskGpuDevice *self, graphene_point_t origin; GskGpuImage *image; gsize atlas_x, atlas_y, padding; + float subpixel_x, subpixel_y; cache = g_hash_table_lookup (priv->glyph_cache, &lookup); if (cache) @@ -667,11 +668,13 @@ gsk_gpu_device_lookup_glyph_image (GskGpuDevice *self, return cache->image; } + subpixel_x = (flags & 3) / 4.f; + subpixel_y = ((flags >> 2) & 3) / 4.f; pango_font_get_glyph_extents (font, glyph, &ink_rect, NULL); - origin.x = floor (ink_rect.x * scale / PANGO_SCALE); - origin.y = floor (ink_rect.y * scale / PANGO_SCALE); - rect.size.width = ceil ((ink_rect.x + ink_rect.width) * scale / PANGO_SCALE) - origin.x; - rect.size.height = ceil ((ink_rect.y + ink_rect.height) * scale / PANGO_SCALE) - origin.y; + origin.x = floor (ink_rect.x * scale / PANGO_SCALE + subpixel_x); + origin.y = floor (ink_rect.y * scale / PANGO_SCALE + subpixel_y); + rect.size.width = ceil ((ink_rect.x + ink_rect.width) * scale / PANGO_SCALE + subpixel_x) - origin.x; + rect.size.height = ceil ((ink_rect.y + ink_rect.height) * scale / PANGO_SCALE + subpixel_y) - origin.y; padding = 1; image = gsk_gpu_device_add_atlas_image (self, @@ -700,8 +703,8 @@ gsk_gpu_device_lookup_glyph_image (GskGpuDevice *self, cache->scale = scale, cache->bounds = rect, cache->image = image, - cache->origin = GRAPHENE_POINT_INIT (- origin.x + (flags & 3) / 4.f, - - origin.y + ((flags >> 2) & 3) / 4.f); + cache->origin = GRAPHENE_POINT_INIT (- origin.x + subpixel_x, + - origin.y + subpixel_y); gsk_gpu_upload_glyph_op (frame, cache->image, diff --git a/gsk/gpu/gskgpunodeprocessor.c b/gsk/gpu/gskgpunodeprocessor.c index 2eb6b3cab8..b1d4445f43 100644 --- a/gsk/gpu/gskgpunodeprocessor.c +++ b/gsk/gpu/gskgpunodeprocessor.c @@ -3008,20 +3008,29 @@ gsk_gpu_node_processor_add_glyph_node (GskGpuNodeProcessor *self, graphene_rect_t glyph_bounds, glyph_tex_rect; graphene_point_t glyph_offset, glyph_origin; guint32 descriptor; + GskGpuGlyphLookupFlags flags; glyph_origin = GRAPHENE_POINT_INIT (offset.x + (float) glyphs[i].geometry.x_offset / PANGO_SCALE, offset.y + (float) glyphs[i].geometry.y_offset / PANGO_SCALE); if (glyph_align) { - glyph_origin.x = inv_scale * round (glyph_origin.x * scale); - glyph_origin.y = inv_scale * round (glyph_origin.y * scale); + glyph_origin.x = roundf (glyph_origin.x * scale * 4); + glyph_origin.y = roundf (glyph_origin.y * scale * 4); + flags = ((int) glyph_origin.x & 3) | + (((int) glyph_origin.y & 3) << 2); + glyph_origin.x = 0.25 * inv_scale * glyph_origin.x; + glyph_origin.y = 0.25 * inv_scale * glyph_origin.y; + } + else + { + flags = 0; } image = gsk_gpu_device_lookup_glyph_image (device, self->frame, font, glyphs[i].glyph, - 0, + flags, scale, &glyph_bounds, &glyph_offset); diff --git a/gsk/gpu/gskgpurenderer.c b/gsk/gpu/gskgpurenderer.c index f20bb14212..72ed66f8a5 100644 --- a/gsk/gpu/gskgpurenderer.c +++ b/gsk/gpu/gskgpurenderer.c @@ -30,7 +30,7 @@ static const GdkDebugKey gsk_gpu_optimization_keys[] = { { "blit", GSK_GPU_OPTIMIZE_BLIT, "Use shaders instead of vkCmdBlit()/glBlitFramebuffer()" }, { "gradients", GSK_GPU_OPTIMIZE_GRADIENTS, "Don't supersample gradients" }, { "mipmap", GSK_GPU_OPTIMIZE_MIPMAP, "Avoid creating mipmaps" }, - { "glyph-align", GSK_GPU_OPTIMIZE_GLYPH_ALIGN, "Never align glyphs to the pixel grid" }, + { "glyph-align", GSK_GPU_OPTIMIZE_GLYPH_ALIGN, "Never align glyphs to the subpixel grid" }, { "gl-baseinstance", GSK_GPU_OPTIMIZE_GL_BASE_INSTANCE, "Assume no ARB/EXT_base_instance support" }, };