diff options
author | Behdad Esfahbod <behdad@behdad.org> | 2009-07-25 19:08:41 -0400 |
---|---|---|
committer | Behdad Esfahbod <behdad@behdad.org> | 2009-07-25 19:08:41 -0400 |
commit | a1fb36307d0e7fe9f1b282da831ec7c551f37296 (patch) | |
tree | aa5ece7c05042462c688498aa560f7860a7c25e2 | |
parent | c939f6aff405ca7b10b1f1538f46148bff719fcb (diff) | |
parent | 72800869fb784189bac1066265d95a1226bcf212 (diff) | |
download | pango-a1fb36307d0e7fe9f1b282da831ec7c551f37296.tar.gz |
Merge branch 'master' into harfbuzz-ng
-rw-r--r-- | NEWS | 24 | ||||
-rw-r--r-- | configure.in | 12 | ||||
-rw-r--r-- | docs/pango-docs.sgml | 6 | ||||
-rw-r--r-- | docs/pango-sections.txt | 1 | ||||
-rw-r--r-- | docs/tmpl/vertical.sgml | 12 | ||||
-rw-r--r-- | pango-view/test-mixed.markup | 2 | ||||
-rw-r--r-- | pango-view/test-mixed.txt | 2 | ||||
-rw-r--r-- | pango/Makefile.am | 70 | ||||
-rw-r--r-- | pango/break.c | 3 | ||||
-rw-r--r-- | pango/ellipsize.c | 5 | ||||
-rw-r--r-- | pango/glyphstring.c | 6 | ||||
-rw-r--r-- | pango/pango-context.c | 101 | ||||
-rw-r--r-- | pango/pango-engine.c | 2 | ||||
-rw-r--r-- | pango/pango-glyph-item.c | 8 | ||||
-rw-r--r-- | pango/pango-gravity.c | 58 | ||||
-rw-r--r-- | pango/pango-gravity.h | 5 | ||||
-rw-r--r-- | pango/pango-impl-utils.h | 27 | ||||
-rw-r--r-- | pango/pango-language-sample-table.h | 2 | ||||
-rw-r--r-- | pango/pango-layout.c | 18 | ||||
-rw-r--r-- | pango/pango-utils.c | 4 | ||||
-rw-r--r-- | pango/pango.def | 1 | ||||
-rw-r--r-- | pango/pangofc-font.c | 20 | ||||
-rw-r--r-- | pango/pangofc-fontmap.c | 9 | ||||
-rw-r--r-- | pango/pangox.def | 35 | ||||
-rw-r--r-- | pango/pangox.rc.in | 30 | ||||
-rw-r--r-- | pango/pangoxft.def | 24 | ||||
-rw-r--r-- | pango/pangoxft.rc.in | 30 |
27 files changed, 426 insertions, 91 deletions
@@ -1,3 +1,27 @@ +Overview of changes between 1.24.4 and 1.24.5 +============================================= +- Build introspection again +- Misc bug fixes + Bug 589133 – Firefox 3.5 complains about invalid weak references + Bug 585806 – crash during pango_fc_font_map_shutdown + Bug 588678 – pango crash: install a new theme from + +Overview of changes between 1.24.3 and 1.24.4 +============================================= +- Misc bug fixes + Bug 586814 – Crashes related to fontmap destruction after upgrade + +Overview of changes between 1.24.2 and 1.24.3 +============================================= +- Fix build with new automake +- Misc bug fixes + Bug 585337 – Fails to install: install: will not overwrite + just-created + Bug 585164 – 'man preload' shows man page for pango-view + Bug 584328 – Persian sample text is not good + Bug 583250 – pango_font_metrics_get_approximate_char_width is + wrong when LANG=fa_IR + Overview of changes between 1.24.1 and 1.24.2 ============================================= - Misc bug fixes diff --git a/configure.in b/configure.in index 056dd146..5c1b2838 100644 --- a/configure.in +++ b/configure.in @@ -21,15 +21,15 @@ dnl dnl The triplet m4_define([pango_version_major], [1]) -m4_define([pango_version_minor], [24]) -m4_define([pango_version_micro], [2]) +m4_define([pango_version_minor], [25]) +m4_define([pango_version_micro], [0]) m4_define([pango_version], [pango_version_major.pango_version_minor.pango_version_micro]) dnl The X.Y in -lpango-X.Y line. This is expected to stay 1.0 until Pango 2. m4_define([pango_api_version], [1.0]) dnl Number of releases since we've added interfaces dnl XXX For 1.25 release simply remove it and make it automatic. -m4_define([pango_interface_age], [2]) +m4_define([pango_interface_age], [0]) dnl Number of releases since we've broken binary compatibility. m4_define([pango_binary_age], [m4_eval(100 * pango_version_minor + pango_version_micro)]) @@ -153,7 +153,7 @@ esac AC_MSG_RESULT([$pango_platform_win32]) AM_CONDITIONAL(PLATFORM_WIN32, test "$pango_platform_win32" = "yes") -if test "$pango_os_win32" = "yes"; then +if test "$pango_platform_win32" = "yes"; then AC_CHECK_TOOL(WINDRES, windres, no) if test "$WINDRES" = no; then AC_MSG_ERROR([*** Could not find an implementation of windres in your PATH.]) @@ -675,7 +675,7 @@ dnl ******************************************************** # LIBRARY_LIBTOOL_OPTIONS="-version-info $VERSION_INFO" MODULE_LIBTOOL_OPTIONS="-export-dynamic -avoid-version" -if test "$pango_os_win32" = yes; then +if test "$pango_platform_win32" = yes; then # We currently use .def files on Windows true LIBRARY_LIBTOOL_OPTIONS="$LIBRARY_LIBTOOL_OPTIONS -no-undefined" @@ -968,6 +968,8 @@ pango/opentype/Makefile pango/pango.rc pango/pangoft2.rc pango/pangowin32.rc +pango/pangox.rc +pango/pangoxft.rc pango-view/Makefile modules/Makefile modules/arabic/Makefile diff --git a/docs/pango-docs.sgml b/docs/pango-docs.sgml index 0517ba6e..a3b47612 100644 --- a/docs/pango-docs.sgml +++ b/docs/pango-docs.sgml @@ -129,4 +129,10 @@ <index id="index-1.22" role="1.22"> <title>Index of new symbols in 1.22</title> </index> + <index id="index-1.24" role="1.24"> + <title>Index of new symbols in 1.24</title> + </index> + <index id="index-1.26" role="1.26"> + <title>Index of new symbols in 1.26</title> + </index> </book> diff --git a/docs/pango-sections.txt b/docs/pango-sections.txt index 0fbdc22e..50abd19a 100644 --- a/docs/pango-sections.txt +++ b/docs/pango-sections.txt @@ -1104,6 +1104,7 @@ PangoGravityHint PANGO_GRAVITY_IS_VERTICAL pango_gravity_get_for_matrix pango_gravity_get_for_script +pango_gravity_get_for_script_and_width pango_gravity_to_rotation <SUBSECTION Standard> PANGO_TYPE_GRAVITY diff --git a/docs/tmpl/vertical.sgml b/docs/tmpl/vertical.sgml index 5a75d991..83e33a1e 100644 --- a/docs/tmpl/vertical.sgml +++ b/docs/tmpl/vertical.sgml @@ -121,6 +121,18 @@ pango_attr_gravity_hint_new() @Returns: +<!-- ##### FUNCTION pango_gravity_get_for_script_and_width ##### --> +<para> + +</para> + +@script: +@wide: +@base_gravity: +@hint: +@Returns: + + <!-- ##### FUNCTION pango_gravity_to_rotation ##### --> <para> diff --git a/pango-view/test-mixed.markup b/pango-view/test-mixed.markup index daac071d..894a1b81 100644 --- a/pango-view/test-mixed.markup +++ b/pango-view/test-mixed.markup @@ -5,5 +5,5 @@ Grass is Green. 2006</span> <span lang="fa">Arabic is گلها قرمزند، چمن سبز. ۲۰۰۶</span> -<span lang="zh-cn">白日依山尽, 2006</span> +<span lang="zh-cn">ABC 白日依山尽, 2006</span> <span lang="ja">「ノートを買った。」</span> diff --git a/pango-view/test-mixed.txt b/pango-view/test-mixed.txt index c04a91b5..e23f0314 100644 --- a/pango-view/test-mixed.txt +++ b/pango-view/test-mixed.txt @@ -5,5 +5,5 @@ Roses are Red, Grass is Green. 2006 Arabic is گلها قرمزند، چمن سبز. ۲۰۰۶ -白日依山尽, 2006 +ABC 白日依山尽, 2006 「ノートを買った。」 diff --git a/pango/Makefile.am b/pango/Makefile.am index a49a18fa..82ca29bd 100644 --- a/pango/Makefile.am +++ b/pango/Makefile.am @@ -56,7 +56,7 @@ libpango_1_0_la_DEPENDENCIES = \ libpango_1_0_la_LIBADD += mini-fribidi/libmini-fribidi.la libpango_1_0_la_DEPENDENCIES += mini-fribidi/libmini-fribidi.la -if OS_WIN32 +if PLATFORM_WIN32 libpango_1_0_la_LDFLAGS += -export-symbols $(srcdir)/pango.def -Wl,pango-win32-res.o libpango_1_0_la_DEPENDENCIES += pango-win32-res.o pango.def endif @@ -203,6 +203,15 @@ libpangox_1_0_la_LIBADD = \ libpangox_1_0_la_DEPENDENCIES = \ libpango-$(PANGO_API_VERSION).la \ $(INCLUDED_X_MODULES) + +if PLATFORM_WIN32 +libpangox_1_0_la_LDFLAGS += -export-symbols $(srcdir)/pangox.def -Wl,pangox-win32-res.o +libpangox_1_0_la_DEPENDENCIES += pangox-win32-res.o pangox.def +endif + +pangox-win32-res.o: pangox.rc + $(WINDRES) $< $@ + libpangox_1_0_la_SOURCES = \ $(pangox_public_sources) \ modules.h \ @@ -279,7 +288,7 @@ libpangoft2_1_0_la_SOURCES = \ pango-ot-tag.c -if OS_WIN32 +if PLATFORM_WIN32 libpangoft2_1_0_la_LDFLAGS += -export-symbols $(srcdir)/pangoft2.def -Wl,pangoft2-win32-res.o libpangoft2_1_0_la_DEPENDENCIES += pangoft2-win32-res.o pangoft2.def endif @@ -314,7 +323,7 @@ lib_LTLIBRARIES += libpangoxft-1.0.la BUILT_GIRSOURCES += PangoXft-1.0.gir endif -pangoxft_headers = pangoxft.h pangoxft-render.h pango-ot.h +pangoxft_headers = pangoxft.h pangoxft-render.h libpangoxft_1_0_la_LDFLAGS = $(LIBRARY_LIBTOOL_OPTIONS) libpangoxft_1_0_la_LIBADD = \ @@ -328,6 +337,14 @@ libpangoxft_1_0_la_LIBADD = \ libpangoxft_1_0_la_DEPENDENCIES = \ libpangoft2-$(PANGO_API_VERSION).la \ libpango-$(PANGO_API_VERSION).la + +if PLATFORM_WIN32 +libpangoxft_1_0_la_LDFLAGS += -export-symbols $(srcdir)/pangoxft.def -Wl,pangoxft-win32-res.o +libpangoxft_1_0_la_DEPENDENCIES += pangoxft-win32-res.o pangoxft.def +endif +pangoxft-win32-res.o: pangoxft.rc + $(WINDRES) $< $@ + libpangoxft_1_0_la_SOURCES = \ pangoxft-font.c \ pangoxft-fontmap.c \ @@ -381,7 +398,7 @@ libpangocairo_1_0_la_SOURCES = \ pangocairo-private.h if HAVE_CAIRO_WIN32 -if OS_WIN32 +if PLATFORM_WIN32 libpangocairo_1_0_la_LDFLAGS += -export-symbols $(srcdir)/pangocairo.def libpangocairo_1_0_la_DEPENDENCIES += pangocairo.def endif @@ -424,7 +441,7 @@ endif PangoCairo-1.0.gir: $(libpangocairo_1_0_la_SOURCES) PangoCairo-1.0.gir: $(pangocairo_headers) PangoCairo-1.0.gir: libpangocairo-1.0.la -PangoCairo-1.0.gir: Pango-1.0.gir $(G_IR_SCANNER) +PangoCairo-1.0.gir: Pango-1.0.gir $(G_IR_SCANNER) Makefile $(G_IR_SCANNER) -v --namespace PangoCairo --nsversion=1.0 \ --add-include-path=$(srcdir) --add-include-path=. \ --include=GObject-2.0 \ @@ -437,7 +454,6 @@ PangoCairo-1.0.gir: Pango-1.0.gir $(G_IR_SCANNER) --pkg cairo \ -I$(top_srcdir) \ $(PANGO_CFLAGS) \ - $(libpangocairo_1_0_la_SOURCES) \ $(pangocairo_headers) # ------------------- libpangowin32 ------------------- @@ -465,7 +481,7 @@ libpangowin32_1_0_la_SOURCES = \ pangowin32-fontcache.c \ pangowin32-fontmap.c -if OS_WIN32 +if PLATFORM_WIN32 libpangowin32_1_0_la_LDFLAGS += -export-symbols $(srcdir)/pangowin32.def -Wl,pangowin32-win32-res.o libpangowin32_1_0_la_DEPENDENCIES += pangowin32-win32-res.o pangowin32.def endif @@ -484,6 +500,10 @@ if HAVE_FREETYPE endif $(INSTALL) $(srcdir)/pangowin32.def $(DESTDIR)$(libdir)/pangowin32-$(PANGO_API_VERSION).def $(INSTALL) $(srcdir)/pangocairo.def $(DESTDIR)$(libdir)/pangocairo-$(PANGO_API_VERSION).def +if HAVE_X + $(INSTALL) $(srcdir)/pangox.def $(DESTDIR)$(libdir)/pangox-$(PANGO_API_VERSION).def + $(INSTALL) $(srcdir)/pangoxft.def $(DESTDIR)$(libdir)/pangoxft-$(PANGO_API_VERSION).def +endif uninstall-def-files: -rm $(DESTDIR)$(libdir)/pango$(PANGO_API_VERSION).def if HAVE_FREETYPE @@ -491,6 +511,10 @@ if HAVE_FREETYPE endif -rm $(DESTDIR)$(libdir)/pangowin32-$(PANGO_API_VERSION).def -rm $(DESTDIR)$(libdir)/pangocairo-$(PANGO_API_VERSION).def +if HAVE_X + -rm $(DESTDIR)$(libdir)/pangox-$(PANGO_API_VERSION).def + -rm $(DESTDIR)$(libdir)/pangoxft-$(PANGO_API_VERSION).def +endif else install-def-files: uninstall-def-files: @@ -539,20 +563,20 @@ pangocairo-$(PANGO_API_VERSION).lib: libpangocairo-$(PANGO_API_VERSION).la $(src # ------------------- introspection ------------------- -#if HAVE_INTROSPECTION -# -#girdir = $(GIRDIR) -#dist_gir_DATA = $(BUILT_GIRSOURCES) -# -#EXTRA_DIST += $(BUILT_GIRSOURCES) -# -#typelibsdir = $(TYPELIBDIR) -#typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib) -# -#%.typelib: %.gir $(G_IR_COMPILER) -# LD_LIBRARY_PATH=$${LD_LIBRARY_PATH:+$$LD_LIBRARY_PATH:}. $(G_IR_COMPILER) --includedir=$(srcdir) --includedir=. $(G_IR_COMPILER_OPTS) $< -o $(builddir)/$(@F) -# -#endif # HAVE_INTROSPECTION +if HAVE_INTROSPECTION + +girdir = $(GIRDIR) +dist_gir_DATA = $(BUILT_GIRSOURCES) + +EXTRA_DIST += $(BUILT_GIRSOURCES) + +typelibsdir = $(TYPELIBDIR) +typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib) + +%.typelib: %.gir $(G_IR_COMPILER) + LD_LIBRARY_PATH=$${LD_LIBRARY_PATH:+$$LD_LIBRARY_PATH:}. $(G_IR_COMPILER) --includedir=$(srcdir) --includedir=. $(G_IR_COMPILER_OPTS) $< -o $(builddir)/$(@F) + +endif # HAVE_INTROSPECTION # ------------------- pango-querymodules ------------------- @@ -596,6 +620,10 @@ EXTRA_DIST += \ pangoft2.rc.in \ pangowin32.rc \ pangowin32.rc.in \ + pangox.rc \ + pangox.rc.in \ + pangoxft.rc \ + pangoxft.rc.in \ check.defs diff --git a/pango/break.c b/pango/break.c index c1707456..b17dc606 100644 --- a/pango/break.c +++ b/pango/break.c @@ -24,6 +24,7 @@ #include "pango-break.h" #include "pango-modules.h" #include "pango-script-private.h" +#include "pango-impl-utils.h" #include <string.h> #define PARAGRAPH_SEPARATOR 0x2029 @@ -1809,7 +1810,7 @@ tailor_segment (const char *range_start, PangoLogAttr attr_before = log_attrs[0]; analysis->lang_engine = range_engine; - chars_in_range = g_utf8_strlen (range_start, range_end - range_start); + chars_in_range = pango_utf8_strlen (range_start, range_end - range_start); if (tailor_break (range_start, diff --git a/pango/ellipsize.c b/pango/ellipsize.c index 3a39a789..1c8aa241 100644 --- a/pango/ellipsize.c +++ b/pango/ellipsize.c @@ -25,6 +25,7 @@ #include "pango-glyph-item.h" #include "pango-layout-private.h" #include "pango-engine-private.h" +#include "pango-impl-utils.h" typedef struct _EllipsizeState EllipsizeState; typedef struct _RunInfo RunInfo; @@ -123,7 +124,7 @@ init_state (EllipsizeState *state, state->n_runs = g_slist_length (line->runs); state->run_info = g_new (RunInfo, state->n_runs); - start_offset = g_utf8_strlen (line->layout->text, + start_offset = pango_utf8_strlen (line->layout->text, line->start_index); state->total_width = 0; @@ -636,7 +637,7 @@ fixup_ellipsis_run (EllipsizeState *state) /* Fix up the item to point to the entire elided text */ item->offset = state->gap_start_iter.run_iter.start_index; item->length = state->gap_end_iter.run_iter.end_index - item->offset; - item->num_chars = g_utf8_strlen (state->layout->text + item->offset, item->length); + item->num_chars = pango_utf8_strlen (state->layout->text + item->offset, item->length); /* The level for the item is the minimum level of the elided text */ level = G_MAXINT; diff --git a/pango/glyphstring.c b/pango/glyphstring.c index 2e3a9f80..9e7c5f85 100644 --- a/pango/glyphstring.c +++ b/pango/glyphstring.c @@ -320,7 +320,9 @@ pango_glyph_string_get_width (PangoGlyphString *glyphs) * @text: the text corresponding to the glyphs * @length: the length of @text, in bytes * @embedding_level: the embedding level of the string - * @logical_widths: an array whose length is g_utf8_strlen (text, length) + * @logical_widths: an array whose length is the number of characters in + * text (equal to g_utf8_strlen (text, length) unless + * text has NUL bytes) * to be filled in with the resulting character widths. * * Given a #PangoGlyphString resulting from pango_shape() and the corresponding @@ -337,7 +339,7 @@ pango_glyph_string_get_logical_widths (PangoGlyphString *glyphs, { /* Build a PangoGlyphItem so we can use PangoGlyphItemIter. * This API should have been made to take a PangoGlyphItem... */ - PangoItem item = {0, length, g_utf8_strlen (text, length), + PangoItem item = {0, length, pango_utf8_strlen (text, length), {NULL, NULL, NULL, embedding_level, PANGO_GRAVITY_AUTO, 0, PANGO_SCRIPT_UNKNOWN, NULL, diff --git a/pango/pango-context.c b/pango/pango-context.c index 0b70f596..6ec0b56f 100644 --- a/pango/pango-context.c +++ b/pango/pango-context.c @@ -645,11 +645,27 @@ typedef enum { SCRIPT_CHANGED = 1 << 1, LANG_CHANGED = 1 << 2, FONT_CHANGED = 1 << 3, - DERIVED_LANG_CHANGED = 1 << 4 + DERIVED_LANG_CHANGED = 1 << 4, + WIDTH_CHANGED = 1 << 5 } ChangedFlags; + + +typedef struct _PangoWidthIter PangoWidthIter; + +struct _PangoWidthIter +{ + const gchar *text_start; + const gchar *text_end; + const gchar *start; + const gchar *end; + gboolean wide; +}; + typedef struct _ItemizeState ItemizeState; + + struct _ItemizeState { PangoContext *context; @@ -687,6 +703,8 @@ struct _ItemizeState const char *script_end; PangoScript script; + PangoWidthIter width_iter; + PangoLanguage *derived_lang; PangoEngineLang *lang_engine; @@ -777,6 +795,38 @@ update_end (ItemizeState *state) state->run_end = state->attr_end; if (state->script_end < state->run_end) state->run_end = state->script_end; + if (state->width_iter.end < state->run_end) + state->run_end = state->width_iter.end; +} + +static void +width_iter_next(PangoWidthIter* iter) +{ + iter->start = iter->end; + + if (iter->end < iter->text_end) + { + gunichar ch = g_utf8_get_char (iter->end); + iter->wide = g_unichar_iswide (ch); + } + + while (iter->end < iter->text_end) + { + gunichar ch = g_utf8_get_char (iter->end); + if (g_unichar_iswide (ch) != iter->wide) + break; + iter->end = g_utf8_next_char (iter->end); + } +} + +static void +width_iter_init (PangoWidthIter* iter, const char* text, int length) +{ + iter->text_start = text; + iter->text_end = text + length; + iter->start = iter->end = text; + + width_iter_next (iter); } static void @@ -852,6 +902,9 @@ itemize_state_init (ItemizeState *state, pango_script_iter_get_range (&state->script_iter, NULL, &state->script_end, &state->script); + /* Initialize the width iterator */ + width_iter_init (&state->width_iter, text + start_index, length); + update_end (state); if (pango_font_description_get_set_fields (state->font_desc) & PANGO_FONT_MASK_GRAVITY) @@ -871,7 +924,7 @@ itemize_state_init (ItemizeState *state, state->fallback_engines = NULL; state->base_font = NULL; - state->changed = EMBEDDING_CHANGED | SCRIPT_CHANGED | LANG_CHANGED | FONT_CHANGED; + state->changed = EMBEDDING_CHANGED | SCRIPT_CHANGED | LANG_CHANGED | FONT_CHANGED | WIDTH_CHANGED; } static gboolean @@ -902,6 +955,11 @@ itemize_state_next (ItemizeState *state) &state->script_end, &state->script); state->changed |= SCRIPT_CHANGED; } + if (state->run_end == state->width_iter.end) + { + width_iter_next (&state->width_iter); + state->changed |= WIDTH_CHANGED; + } update_end (state); @@ -1231,10 +1289,11 @@ itemize_state_update_for_new_run (ItemizeState *state) { /* This block should be moved to update_attr_iterator, but I'm too lazy to * do it right now */ - if (state->changed & (FONT_CHANGED | SCRIPT_CHANGED)) + if (state->changed & (FONT_CHANGED | SCRIPT_CHANGED | WIDTH_CHANGED)) { PangoGravity old_gravity = state->resolved_gravity; + /* Font-desc gravity overrides everything */ if (state->font_desc_gravity != PANGO_GRAVITY_AUTO) { state->resolved_gravity = state->font_desc_gravity; @@ -1247,9 +1306,10 @@ itemize_state_update_for_new_run (ItemizeState *state) if (G_LIKELY (gravity == PANGO_GRAVITY_AUTO)) gravity = state->context->resolved_gravity; - state->resolved_gravity = pango_gravity_get_for_script (state->script, - gravity, - gravity_hint); + state->resolved_gravity = pango_gravity_get_for_script_and_width (state->script, + state->width_iter.wide, + gravity, + gravity_hint); } if (old_gravity != state->resolved_gravity) @@ -1575,13 +1635,16 @@ get_base_metrics (PangoFontset *fontset) static void update_metrics_from_items (PangoFontMetrics *metrics, PangoLanguage *language, + const char *text, GList *items) { GHashTable *fonts_seen = g_hash_table_new (NULL, NULL); - int count = 0; + PangoGlyphString *glyphs = pango_glyph_string_new (); GList *l; + metrics->approximate_char_width = 0; + for (l = items; l; l = l->next) { PangoItem *item = l->data; @@ -1595,29 +1658,17 @@ update_metrics_from_items (PangoFontMetrics *metrics, /* metrics will already be initialized from the first font in the fontset */ metrics->ascent = MAX (metrics->ascent, raw_metrics->ascent); metrics->descent = MAX (metrics->descent, raw_metrics->descent); - - if (count == 0) - { - metrics->approximate_char_width = raw_metrics->approximate_char_width; - metrics->approximate_digit_width = raw_metrics->approximate_digit_width; - } - else - { - metrics->approximate_char_width += raw_metrics->approximate_char_width; - metrics->approximate_digit_width += raw_metrics->approximate_digit_width; - } - count++; pango_font_metrics_unref (raw_metrics); } + + pango_shape (text + item->offset, item->length, &item->analysis, glyphs); + metrics->approximate_char_width += pango_glyph_string_get_width (glyphs); } + pango_glyph_string_free (glyphs); g_hash_table_destroy (fonts_seen); - if (count) - { - metrics->approximate_char_width /= count; - metrics->approximate_digit_width /= count; - } + metrics->approximate_char_width /= pango_utf8_strwidth (text); } /** @@ -1671,7 +1722,7 @@ pango_context_get_metrics (PangoContext *context, sample_str = pango_language_get_sample_string (language); items = itemize_with_font (context, sample_str, 0, strlen (sample_str), desc); - update_metrics_from_items (metrics, language, items); + update_metrics_from_items (metrics, language, sample_str, items); g_list_foreach (items, (GFunc)pango_item_free, NULL); g_list_free (items); diff --git a/pango/pango-engine.c b/pango/pango-engine.c index 2891762a..974e2d5a 100644 --- a/pango/pango-engine.c +++ b/pango/pango-engine.c @@ -107,7 +107,7 @@ fallback_engine_shape (PangoEngineShape *engine G_GNUC_UNUSED, int cluster = 0; int i; - n_chars = text ? g_utf8_strlen (text, length) : 0; + n_chars = text ? pango_utf8_strlen (text, length) : 0; pango_glyph_string_set_size (glyphs, n_chars); diff --git a/pango/pango-glyph-item.c b/pango/pango-glyph-item.c index 9a90a4ca..8d19d94a 100644 --- a/pango/pango-glyph-item.c +++ b/pango/pango-glyph-item.c @@ -300,7 +300,7 @@ pango_glyph_item_iter_next_cluster (PangoGlyphItemIter *iter) if (glyphs->log_clusters[glyph_index] != cluster) { iter->end_index = item->offset + glyphs->log_clusters[glyph_index]; - iter->end_char += g_utf8_strlen (iter->text + iter->start_index, + iter->end_char += pango_utf8_strlen (iter->text + iter->start_index, iter->end_index - iter->start_index); break; } @@ -323,7 +323,7 @@ pango_glyph_item_iter_next_cluster (PangoGlyphItemIter *iter) if (glyphs->log_clusters[glyph_index] != cluster) { iter->end_index = item->offset + glyphs->log_clusters[glyph_index]; - iter->end_char += g_utf8_strlen (iter->text + iter->start_index, + iter->end_char += pango_utf8_strlen (iter->text + iter->start_index, iter->end_index - iter->start_index); break; } @@ -388,7 +388,7 @@ pango_glyph_item_iter_prev_cluster (PangoGlyphItemIter *iter) { glyph_index++; iter->start_index = item->offset + glyphs->log_clusters[glyph_index]; - iter->start_char -= g_utf8_strlen (iter->text + iter->start_index, + iter->start_char -= pango_utf8_strlen (iter->text + iter->start_index, iter->end_index - iter->start_index); break; } @@ -412,7 +412,7 @@ pango_glyph_item_iter_prev_cluster (PangoGlyphItemIter *iter) { glyph_index--; iter->start_index = item->offset + glyphs->log_clusters[glyph_index]; - iter->start_char -= g_utf8_strlen (iter->text + iter->start_index, + iter->start_char -= pango_utf8_strlen (iter->text + iter->start_index, iter->end_index - iter->start_index); break; } diff --git a/pango/pango-gravity.c b/pango/pango-gravity.c index b58ae85d..297199a5 100644 --- a/pango/pango-gravity.c +++ b/pango/pango-gravity.c @@ -113,8 +113,9 @@ typedef struct { guint8 preferred_gravity; /* Preferred context gravity */ /* gboolean */ - guint8 upright; /* Whether glyphs are upright or - * rotated in foreign context */ + guint8 wide; /* Whether script is mostly wide. + * Wide characters are upright (ie. + * not rotated) in foreign context */ } PangoScriptProperties; #define NONE PANGO_VERTICAL_DIRECTION_NONE @@ -245,6 +246,7 @@ get_script_properties (PangoScript script) * pass %PANGO_GRAVITY_AUTO and %PANGO_GRAVITY_HINT_STRONG in. * * Return value: resolved gravity suitable to use for a run of text + * with @script. * * Since: 1.16 */ @@ -262,17 +264,61 @@ pango_gravity_get_for_script (PangoScript script, vertical = PANGO_GRAVITY_IS_VERTICAL (base_gravity); + return pango_gravity_get_for_script_and_width (script, props.wide, + base_gravity, hint); +} + +/** + * pango_gravity_get_for_script_and_width: + * @script: #PangoScript to query + * @wide: %TRUE for wide characters as returned by g_unichar_iswide() + * @base_gravity: base gravity of the paragraph + * @hint: orientation hint + * + * Based on the script, East Asian width, base gravity, and hint, + * returns actual gravity to use in laying out a single character + * or #PangoItem. + * + * This function is similar to pango_gravity_get_for_script() except + * that this function makes a distinction between narrow/half-width and + * wide/full-width characters also. Wide/full-width characters always + * stand <emph>upright</emph>, that is, they always take the base gravity, + * whereas narrow/full-width characters are always rotated in vertical + * context. + * + * If @base_gravity is %PANGO_GRAVITY_AUTO, it is first replaced with the + * preferred gravity of @script. + * + * Return value: resolved gravity suitable to use for a run of text + * with @script and @wide. + * + * Since: 1.26 + */ +PangoGravity +pango_gravity_get_for_script_and_width (PangoScript script, + gboolean wide, + PangoGravity base_gravity, + PangoGravityHint hint) +{ + PangoScriptProperties props = get_script_properties (script); + gboolean vertical; + + + if (G_UNLIKELY (base_gravity == PANGO_GRAVITY_AUTO)) + base_gravity = props.preferred_gravity; + + vertical = PANGO_GRAVITY_IS_VERTICAL (base_gravity); + /* Everything is designed such that a system with no vertical support * renders everything correctly horizontally. So, if not in a vertical * gravity, base and resolved gravities are always the same. * - * If the script should be upright all the time, like Chinese and Japenese, - * any base gravity should resolve to itself. + * Wide characters are always upright. */ - if (G_LIKELY (!vertical || props.upright)) + if (G_LIKELY (!vertical || wide)) return base_gravity; - /* If here, we have a non-upright script in a vertical gravity setting. + /* If here, we have a narrow character in a vertical gravity setting. * Resolve depending on the hint. */ switch (hint) diff --git a/pango/pango-gravity.h b/pango/pango-gravity.h index 2e42ebd8..d2fa9647 100644 --- a/pango/pango-gravity.h +++ b/pango/pango-gravity.h @@ -102,6 +102,11 @@ PangoGravity pango_gravity_get_for_matrix (const PangoMatrix *matrix) G_GNUC_PUR PangoGravity pango_gravity_get_for_script (PangoScript script, PangoGravity base_gravity, PangoGravityHint hint) G_GNUC_CONST; +PangoGravity pango_gravity_get_for_script_and_width + (PangoScript script, + gboolean wide, + PangoGravity base_gravity, + PangoGravityHint hint) G_GNUC_CONST; G_END_DECLS diff --git a/pango/pango-impl-utils.h b/pango/pango-impl-utils.h index a04d4241..3ef3a0c4 100644 --- a/pango/pango-impl-utils.h +++ b/pango/pango-impl-utils.h @@ -122,6 +122,33 @@ pango_utf8_strwidth (const gchar *p) return len; } +/* Glib's g_utf8_strlen() is broken and stops at embedded NUL's. + * Wrap it here. */ +static G_GNUC_UNUSED glong +pango_utf8_strlen (const gchar *p, gssize max) +{ + glong len = 0; + const gchar *start = p; + g_return_val_if_fail (p != NULL || max == 0, 0); + + if (max <= 0) + return g_utf8_strlen (p, max); + + p = g_utf8_next_char (p); + while (p - start < max) + { + ++len; + p = g_utf8_next_char (p); + } + + /* only do the last len increment if we got a complete + * char (don't count partial chars) + */ + if (p - start <= max) + ++len; + + return len; +} G_END_DECLS diff --git a/pango/pango-language-sample-table.h b/pango/pango-language-sample-table.h index a5f3271b..2cd5e6b9 100644 --- a/pango/pango-language-sample-table.h +++ b/pango/pango-language-sample-table.h @@ -183,7 +183,7 @@ LANGUAGE( LANGUAGE( fa /* Persian */, MISC /* Behdad Esfahbod (#548730) */, - "«الا یا اَیُّها السّاقی! اَدِرْ کَأساً وَ ناوِلْهٰا!» که عشق آسان نمود اوّل، ولی افتاد مشکلها!" + "«الا یا اَیُّها السّاقی! اَدِرْ کَأساً وَ ناوِلْها!» که عشق آسان نمود اوّل، ولی افتاد مشکلها!" ) LANGUAGE( fi /* Finnish */, diff --git a/pango/pango-layout.c b/pango/pango-layout.c index 4326eb47..52ae9851 100644 --- a/pango/pango-layout.c +++ b/pango/pango-layout.c @@ -1084,7 +1084,7 @@ pango_layout_set_text (PangoLayout *layout, /* TODO: Write out the beginning excerpt of text? */ g_warning ("Invalid UTF-8 string passed to pango_layout_set_text()"); - layout->n_chars = g_utf8_strlen (layout->text, -1); + layout->n_chars = pango_utf8_strlen (layout->text, -1); pango_layout_clear_lines (layout); @@ -1737,7 +1737,7 @@ pango_layout_move_cursor_visually (PangoLayout *layout, old_index = g_utf8_next_char (layout->text + old_index) - layout->text; log2vis_map = pango_layout_line_get_log2vis_map (line, strong); - n_vis = g_utf8_strlen (layout->text + line->start_index, line->length); + n_vis = pango_utf8_strlen (layout->text + line->start_index, line->length); /* Clamp old_index to fit on the line */ if (old_index > (line->start_index + line->length)) @@ -1793,7 +1793,7 @@ pango_layout_move_cursor_visually (PangoLayout *layout, paragraph_boundary = (line->start_index != old_index); } - n_vis = g_utf8_strlen (layout->text + line->start_index, line->length); + n_vis = pango_utf8_strlen (layout->text + line->start_index, line->length); start_offset = g_utf8_pointer_to_offset (layout->text, layout->text + line->start_index); if (vis_pos == 0 && direction < 0) @@ -2052,7 +2052,7 @@ pango_layout_line_get_vis2log_map (PangoLayoutLine *line, int n_chars; pango_layout_line_get_range (line, &start, &end); - n_chars = g_utf8_strlen (start, end - start); + n_chars = pango_utf8_strlen (start, end - start); result = g_new (int, n_chars + 1); @@ -2139,7 +2139,7 @@ pango_layout_line_get_log2vis_map (PangoLayoutLine *line, int n_chars; pango_layout_line_get_range (line, &start, &end); - n_chars = g_utf8_strlen (start, end - start); + n_chars = pango_utf8_strlen (start, end - start); result = g_new0 (int, end - start + 1); reverse_map = pango_layout_line_get_vis2log_map (line, strong); @@ -3635,7 +3635,7 @@ get_items_log_attrs (const char *text, /* Break the paragraph delimiters with the last item */ if (items->next == NULL) { - tmp_item.num_chars += g_utf8_strlen (text + index + tmp_item.length, para_delimiter_len); + tmp_item.num_chars += pango_utf8_strlen (text + index + tmp_item.length, para_delimiter_len); tmp_item.length += para_delimiter_len; } @@ -3848,7 +3848,7 @@ pango_layout_check_lines (PangoLayout *layout) state.glyphs = NULL; state.log_widths = NULL; - /* for deterministic bug haunting's sake set everything! */ + /* for deterministic bug hunting's sake set everything! */ state.line_width = -1; state.remaining_width = -1; state.log_widths_offset = 0; @@ -3874,7 +3874,7 @@ pango_layout_check_lines (PangoLayout *layout) done = TRUE; if (!done) - start_offset += g_utf8_strlen (start, (end - start) + delim_len); + start_offset += pango_utf8_strlen (start, (end - start) + delim_len); start = end + delim_len; } @@ -5362,7 +5362,7 @@ update_cluster (PangoLayoutIter *iter, } cluster_text = iter->layout->text + iter->run->item->offset + cluster_start_index; - iter->cluster_num_chars = g_utf8_strlen (cluster_text, cluster_length); + iter->cluster_num_chars = pango_utf8_strlen (cluster_text, cluster_length); if (iter->ltr) iter->index = cluster_text - iter->layout->text; diff --git a/pango/pango-utils.c b/pango/pango-utils.c index 9801a305..100dbc7a 100644 --- a/pango/pango-utils.c +++ b/pango/pango-utils.c @@ -967,7 +967,7 @@ handle_alias_line (GString *line_buffer, g_string_free (tmp_buffer2, TRUE); } -#ifdef G_OS_WIN32 +#ifdef HAVE_CAIRO_WIN32 static const char *builtin_aliases[] = { "courier = \"courier new\"", @@ -1061,7 +1061,7 @@ pango_load_aliases (void) (GDestroyNotify)alias_free, NULL); -#ifdef G_OS_WIN32 +#ifdef HAVE_CAIRO_WIN32 read_builtin_aliases (); #endif diff --git a/pango/pango.def b/pango/pango.def index 39ab42bc..d941ebe8 100644 --- a/pango/pango.def +++ b/pango/pango.def @@ -205,6 +205,7 @@ EXPORTS pango_glyph_string_x_to_index pango_gravity_get_for_matrix pango_gravity_get_for_script + pango_gravity_get_for_script_and_width pango_gravity_get_type pango_gravity_hint_get_type pango_gravity_to_rotation diff --git a/pango/pangofc-font.c b/pango/pangofc-font.c index e5df33d2..8fc5a579 100644 --- a/pango/pangofc-font.c +++ b/pango/pangofc-font.c @@ -45,6 +45,7 @@ struct _PangoFcFontPrivate PangoFcDecoder *decoder; PangoFcFontKey *key; PangoFcCmapCache *cmap_cache; + gboolean has_weak_pointer; /* have set a weak_pointer from fontmap to us */ }; static gboolean pango_fc_font_real_has_char (PangoFcFont *font, @@ -140,7 +141,15 @@ pango_fc_font_finalize (GObject *object) g_slist_free (fcfont->metrics_by_lang); if (fcfont->fontmap) - _pango_fc_font_map_remove (PANGO_FC_FONT_MAP (fcfont->fontmap), fcfont); + { + _pango_fc_font_map_remove (PANGO_FC_FONT_MAP (fcfont->fontmap), fcfont); + if (priv->has_weak_pointer) + { + priv->has_weak_pointer = FALSE; + g_object_remove_weak_pointer (G_OBJECT (fcfont->fontmap), (gpointer *) (gpointer) &fcfont->fontmap); + } + fcfont->fontmap = NULL; + } FcPatternDestroy (fcfont->font_pattern); pango_font_description_free (fcfont->description); @@ -220,7 +229,11 @@ pango_fc_font_set_property (GObject *object, g_return_if_fail (fcfont->fontmap == NULL); fcfont->fontmap = (PangoFontMap *) fcfontmap; if (fcfont->fontmap) - g_object_add_weak_pointer (G_OBJECT (fcfont->fontmap), (gpointer *) (gpointer) &fcfont->fontmap); + { + PangoFcFontPrivate *priv = fcfont->priv; + priv->has_weak_pointer = TRUE; + g_object_add_weak_pointer (G_OBJECT (fcfont->fontmap), (gpointer *) (gpointer) &fcfont->fontmap); + } } goto set_decoder; @@ -773,9 +786,6 @@ _pango_fc_font_shutdown (PangoFcFont *font) if (PANGO_FC_FONT_GET_CLASS (font)->shutdown) PANGO_FC_FONT_GET_CLASS (font)->shutdown (font); - - if (font->fontmap) - _pango_fc_font_map_remove (PANGO_FC_FONT_MAP (font->fontmap), font); } /** diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c index 4db62159..adbafaa4 100644 --- a/pango/pangofc-fontmap.c +++ b/pango/pangofc-fontmap.c @@ -1209,6 +1209,7 @@ pango_fc_font_map_add (PangoFcFontMap *fcfontmap, } /* Remove mapping from fcfont->key to fcfont */ +/* Closely related to shutdown_font() */ void _pango_fc_font_map_remove (PangoFcFontMap *fcfontmap, PangoFcFont *fcfont) @@ -1974,16 +1975,14 @@ pango_fc_font_map_create_context (PangoFcFontMap *fcfontmap) } static void -shutdown_font (gpointer key G_GNUC_UNUSED, +shutdown_font (gpointer key, PangoFcFont *fcfont, PangoFcFontMap *fcfontmap) { _pango_fc_font_shutdown (fcfont); - /* While _pango_fc_font_shutdown() tries to call the following - * function, it's too late as the fontmap weakref has already - * NULL'ed fcfont->fontmap, so we do it ourselves. */ - _pango_fc_font_map_remove (fcfontmap, fcfont); + _pango_fc_font_set_font_key (fcfont, NULL); + pango_fc_font_key_free (key); } /** diff --git a/pango/pangox.def b/pango/pangox.def new file mode 100644 index 00000000..e70ca70c --- /dev/null +++ b/pango/pangox.def @@ -0,0 +1,35 @@ +EXPORTS +pango_x_apply_ligatures +pango_x_context_set_funcs +pango_x_face_get_coverage +pango_x_face_get_type +pango_x_face_remove +pango_x_fallback_shape +pango_x_family_get_type +pango_x_find_first_subfont +pango_x_font_cache_free +pango_x_font_cache_load +pango_x_font_cache_new +pango_x_font_cache_unload +pango_x_font_get_unknown_glyph +pango_x_font_map_for_display +pango_x_font_map_get_font_cache +pango_x_font_map_get_type +pango_x_font_new +pango_x_font_subfont_xlfd +pango_x_fontmap_atom_from_name +pango_x_fontmap_cache_add +pango_x_fontmap_cache_remove +pango_x_fontmap_get_display +pango_x_fontmap_name_from_atom +pango_x_get_context +pango_x_get_shaper_map +pango_x_get_unknown_glyph +pango_x_has_glyph +pango_x_list_subfonts +pango_x_load_font +pango_x_make_matching_xlfd +pango_x_render +pango_x_render_layout +pango_x_render_layout_line +pango_x_shutdown_display diff --git a/pango/pangox.rc.in b/pango/pangox.rc.in new file mode 100644 index 00000000..c259393c --- /dev/null +++ b/pango/pangox.rc.in @@ -0,0 +1,30 @@ +#include <winver.h> + +VS_VERSION_INFO VERSIONINFO + FILEVERSION @PANGO_VERSION_MAJOR@,@PANGO_VERSION_MINOR@,@PANGO_VERSION_MICRO@,0 + PRODUCTVERSION @PANGO_VERSION_MAJOR@,@PANGO_VERSION_MINOR@,@PANGO_VERSION_MICRO@,0 + FILEFLAGSMASK 0 + FILEFLAGS 0 + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE VFT2_UNKNOWN + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904B0" + BEGIN + VALUE "CompanyName", "Red Hat Software" + VALUE "FileDescription", "Pangox" + VALUE "FileVersion", "@PANGO_VERSION_MAJOR@.@PANGO_VERSION_MINOR@.@PANGO_VERSION_MICRO@.0" + VALUE "InternalName", "pangox-@PANGO_API_VERSION@-@PANGO_CURRENT_MINUS_AGE@" + VALUE "LegalCopyright", "Copyright 1999 Red Hat Software." + VALUE "OriginalFilename", "pangox-@PANGO_API_VERSION@-@PANGO_CURRENT_MINUS_AGE@.dll" + VALUE "ProductName", "Pangox" + VALUE "ProductVersion", "@PANGO_VERSION_MAJOR@.@PANGO_VERSION_MINOR@.@PANGO_VERSION_MICRO@" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END + END diff --git a/pango/pangoxft.def b/pango/pangoxft.def new file mode 100644 index 00000000..484d83e1 --- /dev/null +++ b/pango/pangoxft.def @@ -0,0 +1,24 @@ +EXPORTS +pango_xft_font_get_display +pango_xft_font_get_font +pango_xft_font_get_glyph +pango_xft_font_get_type +pango_xft_font_get_unknown_glyph +pango_xft_font_has_char +pango_xft_font_lock_face +pango_xft_font_map_get_type +pango_xft_font_unlock_face +pango_xft_get_context +pango_xft_get_font_map +pango_xft_picture_render +pango_xft_render +pango_xft_render_layout +pango_xft_render_layout_line +pango_xft_render_transformed +pango_xft_renderer_get_type +pango_xft_renderer_new +pango_xft_renderer_set_default_color +pango_xft_renderer_set_draw +pango_xft_set_default_substitute +pango_xft_shutdown_display +pango_xft_substitute_changed diff --git a/pango/pangoxft.rc.in b/pango/pangoxft.rc.in new file mode 100644 index 00000000..1f39685b --- /dev/null +++ b/pango/pangoxft.rc.in @@ -0,0 +1,30 @@ +#include <winver.h> + +VS_VERSION_INFO VERSIONINFO + FILEVERSION @PANGO_VERSION_MAJOR@,@PANGO_VERSION_MINOR@,@PANGO_VERSION_MICRO@,0 + PRODUCTVERSION @PANGO_VERSION_MAJOR@,@PANGO_VERSION_MINOR@,@PANGO_VERSION_MICRO@,0 + FILEFLAGSMASK 0 + FILEFLAGS 0 + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE VFT2_UNKNOWN + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904B0" + BEGIN + VALUE "CompanyName", "Red Hat Software" + VALUE "FileDescription", "Pangoxft" + VALUE "FileVersion", "@PANGO_VERSION_MAJOR@.@PANGO_VERSION_MINOR@.@PANGO_VERSION_MICRO@.0" + VALUE "InternalName", "pangoxft-@PANGO_API_VERSION@-@PANGO_CURRENT_MINUS_AGE@" + VALUE "LegalCopyright", "Copyright 1999 Red Hat Software." + VALUE "OriginalFilename", "pangoxft-@PANGO_API_VERSION@-@PANGO_CURRENT_MINUS_AGE@.dll" + VALUE "ProductName", "Pangoxft" + VALUE "ProductVersion", "@PANGO_VERSION_MAJOR@.@PANGO_VERSION_MINOR@.@PANGO_VERSION_MICRO@" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END + END |