summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-09-18 00:26:14 +0000
committerMatthias Clasen <mclasen@redhat.com>2021-09-18 00:26:14 +0000
commitece5fd7db5bbffe4db2d76c15534eee11e406e12 (patch)
tree063f7031417613e18c39025fe3a9abe02f83f08d
parenta1adaac69b825e14953644c5901c7e0f4580890e (diff)
parent7e4b2b971ff9b3d53c56fd96632e351cff8749bb (diff)
downloadgtk+-ece5fd7db5bbffe4db2d76c15534eee11e406e12.tar.gz
Merge branch 'more-glyph-drawing-fixes' into 'master'
ngl: Use exact device scales for glyphs See merge request GNOME/gtk!3971
-rw-r--r--gsk/gskrendernodeimpl.c8
-rw-r--r--gsk/ngl/gsknglglyphlibrary.c27
2 files changed, 16 insertions, 19 deletions
diff --git a/gsk/gskrendernodeimpl.c b/gsk/gskrendernodeimpl.c
index 18cbcd185a..fd2a9e5d44 100644
--- a/gsk/gskrendernodeimpl.c
+++ b/gsk/gskrendernodeimpl.c
@@ -4477,10 +4477,10 @@ gsk_text_node_new (PangoFont *font,
self->num_glyphs = n;
graphene_rect_init (&node->bounds,
- offset->x + ink_rect.x,
- offset->y + ink_rect.y,
- ink_rect.width,
- ink_rect.height);
+ offset->x + ink_rect.x - 1,
+ offset->y + ink_rect.y - 1,
+ ink_rect.width + 2,
+ ink_rect.height + 2);
return node;
}
diff --git a/gsk/ngl/gsknglglyphlibrary.c b/gsk/ngl/gsknglglyphlibrary.c
index 9c184ed0f7..33c86cc967 100644
--- a/gsk/ngl/gsknglglyphlibrary.c
+++ b/gsk/ngl/gsknglglyphlibrary.c
@@ -132,7 +132,8 @@ gsk_ngl_glyph_library_create_surface (GskNglGlyphLibrary *self,
int stride,
int width,
int height,
- double device_scale)
+ int uwidth,
+ int uheight)
{
cairo_surface_t *surface;
gsize n_bytes;
@@ -153,7 +154,7 @@ gsk_ngl_glyph_library_create_surface (GskNglGlyphLibrary *self,
surface = cairo_image_surface_create_for_data (self->surface_data,
CAIRO_FORMAT_ARGB32,
width, height, stride);
- cairo_surface_set_device_scale (surface, device_scale, device_scale);
+ cairo_surface_set_device_scale (surface, width / (double)uwidth, height / (double)uheight);
return surface;
}
@@ -192,7 +193,8 @@ gsk_ngl_glyph_library_upload_glyph (GskNglGlyphLibrary *self,
int y,
int width,
int height,
- double device_scale)
+ int uwidth,
+ int uheight)
{
GskNglTextureLibrary *tl = (GskNglTextureLibrary *)self;
G_GNUC_UNUSED gint64 start_time = GDK_PROFILER_CURRENT_TIME;
@@ -220,7 +222,7 @@ gsk_ngl_glyph_library_upload_glyph (GskNglGlyphLibrary *self,
"Uploading glyph %d",
key->glyph);
- surface = gsk_ngl_glyph_library_create_surface (self, stride, width, height, device_scale);
+ surface = gsk_ngl_glyph_library_create_surface (self, stride, width, height, uwidth, uheight);
render_glyph (surface, scaled_font, key, value);
texture_id = GSK_NGL_TEXTURE_ATLAS_ENTRY_TEXTURE (value);
@@ -289,16 +291,10 @@ gsk_ngl_glyph_library_add (GskNglGlyphLibrary *self,
pango_font_get_glyph_extents (key->font, key->glyph, &ink_rect, NULL);
pango_extents_to_pixels (&ink_rect, NULL);
- if (key->xshift != 0)
- {
- ink_rect.x -= 1;
- ink_rect.width += 2;
- }
- if (key->yshift != 0)
- {
- ink_rect.y -= 1;
- ink_rect.height += 2;
- }
+ ink_rect.x -= 1;
+ ink_rect.width += 2;
+ ink_rect.y -= 1;
+ ink_rect.height += 2;
width = (int) ceil (ink_rect.width * key->scale / 1024.0);
height = (int) ceil (ink_rect.height * key->scale / 1024.0);
@@ -321,7 +317,8 @@ gsk_ngl_glyph_library_add (GskNglGlyphLibrary *self,
packed_y + 1,
width,
height,
- key->scale / 1024.0);
+ ink_rect.width,
+ ink_rect.height);
*out_value = value;