ngl: Use exact device scales for glyphs

We are rendering the glyphs on a larger surface,
and we should avoid introducing unnecessary
rounding errors here. Also, I've found that
we always need to enlarge the surface by one
pixels in each direction to avoid cutting off
the tops of large glyphs.
This commit is contained in:
Matthias Clasen 2021-09-17 19:07:55 -04:00
parent e9cf8c6cc7
commit c6cacd2b2d

View File

@ -132,7 +132,8 @@ gsk_ngl_glyph_library_create_surface (GskNglGlyphLibrary *self,
int stride, int stride,
int width, int width,
int height, int height,
double device_scale) int uwidth,
int uheight)
{ {
cairo_surface_t *surface; cairo_surface_t *surface;
gsize n_bytes; 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, surface = cairo_image_surface_create_for_data (self->surface_data,
CAIRO_FORMAT_ARGB32, CAIRO_FORMAT_ARGB32,
width, height, stride); 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; return surface;
} }
@ -192,7 +193,8 @@ gsk_ngl_glyph_library_upload_glyph (GskNglGlyphLibrary *self,
int y, int y,
int width, int width,
int height, int height,
double device_scale) int uwidth,
int uheight)
{ {
GskNglTextureLibrary *tl = (GskNglTextureLibrary *)self; GskNglTextureLibrary *tl = (GskNglTextureLibrary *)self;
G_GNUC_UNUSED gint64 start_time = GDK_PROFILER_CURRENT_TIME; 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", "Uploading glyph %d",
key->glyph); 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); render_glyph (surface, scaled_font, key, value);
texture_id = GSK_NGL_TEXTURE_ATLAS_ENTRY_TEXTURE (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_font_get_glyph_extents (key->font, key->glyph, &ink_rect, NULL);
pango_extents_to_pixels (&ink_rect, NULL); pango_extents_to_pixels (&ink_rect, NULL);
if (key->xshift != 0) ink_rect.x -= 1;
{ ink_rect.width += 2;
ink_rect.x -= 1; ink_rect.y -= 1;
ink_rect.width += 2; ink_rect.height += 2;
}
if (key->yshift != 0)
{
ink_rect.y -= 1;
ink_rect.height += 2;
}
width = (int) ceil (ink_rect.width * key->scale / 1024.0); width = (int) ceil (ink_rect.width * key->scale / 1024.0);
height = (int) ceil (ink_rect.height * 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, packed_y + 1,
width, width,
height, height,
key->scale / 1024.0); ink_rect.width,
ink_rect.height);
*out_value = value; *out_value = value;