diff --git a/3ff6365.patch b/3ff6365.patch new file mode 100644 index 0000000..e817540 --- /dev/null +++ b/3ff6365.patch @@ -0,0 +1,121 @@ +From d4356779945855f7cc950dbe162285ccf21bcce9 Mon Sep 17 00:00:00 2001 +From: Matthias Clasen +Date: Sun, 27 Jun 2021 11:31:13 -0400 +Subject: [PATCH] shape: Bring back careful rounding code + +When we added the round-glyph-positions option in +c43da2d3 and b5634799, we lost some code that was careful +to round in device coordinates. + +The reason we lost it is that the rounding needs fontconfig- +specific data that is only available in the backend, and the +rounding now happens in the frontend. + +Bringing it back is annoying, since we've run out of vfunc +slots to get info from the backend. This commit works around +that limitation in a hacky way. + +Fixes: #562 +--- + pango/shape.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 73 insertions(+), 4 deletions(-) + +diff --git a/pango/shape.c b/pango/shape.c +index 04407732..b870ecad 100644 +--- a/pango/shape.c ++++ b/pango/shape.c +@@ -151,6 +151,32 @@ fallback_shape (const char *text, + pango_glyph_string_reverse_range (glyphs, 0, glyphs->num_glyphs); + } + ++/* FIXME: This is very ugly. We are out of room for vfuncs, so we can't ++ * easily add api to get is_hinted and the matrix from the PangoFcFont. ++ * ++ * Keep in sync with pangofc-font.h! ++ */ ++struct _PangoFcFont ++{ ++ PangoFont parent_instance; ++ ++ gpointer font_pattern; /* fully resolved pattern */ ++ PangoFontMap *fontmap; /* associated map */ ++ gpointer priv; /* used internally */ ++ PangoMatrix matrix; /* used internally */ ++ PangoFontDescription *description; ++ ++ GSList *metrics_by_lang; ++ ++ guint is_hinted : 1; ++ guint is_transformed : 1; ++}; ++typedef struct _PangoFcFont PangoFcFont; ++ ++#define PANGO_IS_FC_FONT(obj) \ ++ g_type_is_a (((GTypeInstance*)obj)->g_class->g_type, \ ++ g_type_from_name ("PangoFcFont")) ++ + /** + * pango_shape_with_flags: + * @item_text: valid UTF-8 text to shape +@@ -294,11 +320,54 @@ pango_shape_with_flags (const gchar *item_text, + + if (flags & PANGO_SHAPE_ROUND_POSITIONS) + { +- for (i = 0; i < glyphs->num_glyphs; i++) ++ if (PANGO_IS_FC_FONT (analysis->font)) + { +- glyphs->glyphs[i].geometry.width = PANGO_UNITS_ROUND (glyphs->glyphs[i].geometry.width ); +- glyphs->glyphs[i].geometry.x_offset = PANGO_UNITS_ROUND (glyphs->glyphs[i].geometry.x_offset); +- glyphs->glyphs[i].geometry.y_offset = PANGO_UNITS_ROUND (glyphs->glyphs[i].geometry.y_offset); ++ PangoFcFont *fc_font = (PangoFcFont *)analysis->font; ++ if (fc_font->is_hinted) ++ { ++ double x_scale_inv, y_scale_inv; ++ double x_scale, y_scale; ++ ++ x_scale_inv = y_scale_inv = 1.0; ++ pango_matrix_get_font_scale_factors (&fc_font->matrix, &x_scale_inv, &y_scale_inv); ++ if (PANGO_GRAVITY_IS_IMPROPER (analysis->gravity)) ++ { ++ x_scale_inv = -x_scale_inv; ++ y_scale_inv = -y_scale_inv; ++ } ++ x_scale = 1. / x_scale_inv; ++ y_scale = 1. / y_scale_inv; ++ ++ if (x_scale == 1.0 && y_scale == 1.0) ++ { ++ for (i = 0; i < glyphs->num_glyphs; i++) ++ glyphs->glyphs[i].geometry.width = PANGO_UNITS_ROUND (glyphs->glyphs[i].geometry.width); ++ } ++ else ++ { ++ #if 0 ++ if (PANGO_GRAVITY_IS_VERTICAL (analysis->gravity)) ++ { ++ /* XXX */ ++ double tmp = x_scale; ++ x_scale = y_scale; ++ y_scale = -tmp; ++ } ++ #endif ++ #define HINT(value, scale_inv, scale) (PANGO_UNITS_ROUND ((int) ((value) * scale)) * scale_inv) ++ #define HINT_X(value) HINT ((value), x_scale, x_scale_inv) ++ #define HINT_Y(value) HINT ((value), y_scale, y_scale_inv) ++ for (i = 0; i < glyphs->num_glyphs; i++) ++ { ++ glyphs->glyphs[i].geometry.width = HINT_X (glyphs->glyphs[i].geometry.width); ++ glyphs->glyphs[i].geometry.x_offset = HINT_X (glyphs->glyphs[i].geometry.x_offset); ++ glyphs->glyphs[i].geometry.y_offset = HINT_Y (glyphs->glyphs[i].geometry.y_offset); ++ } ++ #undef HINT_Y ++ #undef HINT_X ++ #undef HINT ++ } ++ } + } + } + } +-- +GitLab + diff --git a/_service b/_service index e020798..1df82c1 100644 --- a/_service +++ b/_service @@ -2,7 +2,7 @@ https://gitlab.gnome.org/GNOME/pango.git git - refs/tags/1.48.7 + 1.48.7 @PARENT_TAG@+@TAG_OFFSET@ (.*)\+0 \1 diff --git a/pango-1.48.7.obscpio b/pango-1.48.7.obscpio index 90ff624..a1c6237 100644 --- a/pango-1.48.7.obscpio +++ b/pango-1.48.7.obscpio @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:569162bd73d7a44dbd93636693d65666502f82e498e9c4b4e15efe42abdacaad +oid sha256:75cfc2a22b159ceae580fec1f1b32d707019d1f6a68b95a6c9e478a5911ffffe size 3360268 diff --git a/pango.changes b/pango.changes index e8555bb..d3b75cf 100644 --- a/pango.changes +++ b/pango.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Tue Jul 13 17:29:05 UTC 2021 - Dominique Leuenberger + +- Add 3ff6365.patch, reverse applied: fix build of e.g. g-c-c. This + commit introduced a requirement to run X. + ------------------------------------------------------------------- Mon Jul 5 10:18:45 UTC 2021 - Bjørn Lie diff --git a/pango.spec b/pango.spec index a44a7c5..c67650b 100644 --- a/pango.spec +++ b/pango.spec @@ -26,6 +26,8 @@ URL: https://pango.gnome.org/ Source0: %{name}-%{version}.tar.xz Source2: macros.pango Source99: baselibs.conf +# PATCH-FIX-UPSTREAM 3ff6365.patch dimstar@opensuse.org -- Revert upstream commit, introduces runtime dep on X +Patch0: https://gitlab.gnome.org/GNOME/pango/-/commit/3ff6365.patch BuildRequires: gcc-c++ BuildRequires: help2man @@ -117,7 +119,8 @@ This package contains all necessary include files and libraries needed to develop applications that require these. %prep -%autosetup -p1 +%setup +%patch0 -p1 -R %build %meson \