Hello community, here is the log from the commit of package harfbuzz for openSUSE:Factory checked in at 2013-04-22 14:05:48 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/harfbuzz (Old) and /work/SRC/openSUSE:Factory/.harfbuzz.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "harfbuzz", Maintainer is "" Changes: -------- --- /work/SRC/openSUSE:Factory/harfbuzz/harfbuzz.changes 2013-04-14 10:15:26.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.harfbuzz.new/harfbuzz.changes 2013-04-22 14:05:51.000000000 +0200 @@ -1,0 +2,10 @@ +Sat Apr 20 23:24:21 UTC 2013 - dims...@opensuse.org + +- Update to version 0.9.16: + + Major speedup in OpenType lookup processing. With the Amiri + Arabic font, this release is over 3x faster than previous + release. All scripts / languages should see this speedup. + + New --num-iterations option for hb-shape / hb-view; useful for + profiling. + +------------------------------------------------------------------- Old: ---- harfbuzz-0.9.15.tar.bz2 New: ---- harfbuzz-0.9.16.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ harfbuzz.spec ++++++ --- /var/tmp/diff_new_pack.onCvCs/_old 2013-04-22 14:05:53.000000000 +0200 +++ /var/tmp/diff_new_pack.onCvCs/_new 2013-04-22 14:05:53.000000000 +0200 @@ -17,7 +17,7 @@ Name: harfbuzz -Version: 0.9.15 +Version: 0.9.16 Release: 0 # FIXME: graphite2 is not packaged / http://projects.palaso.org/projects/graphitedev Summary: An OpenType text shaping engine ++++++ harfbuzz-0.9.15.tar.bz2 -> harfbuzz-0.9.16.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/harfbuzz-0.9.15/NEWS new/harfbuzz-0.9.16/NEWS --- old/harfbuzz-0.9.15/NEWS 2013-04-06 00:02:11.000000000 +0200 +++ new/harfbuzz-0.9.16/NEWS 2013-04-19 22:27:04.000000000 +0200 @@ -1,5 +1,16 @@ +Overview of changes leading to 0.9.16 +Friday, April 19, 2013 +===================================== + +- Major speedup in OpenType lookup processing. With the Amiri + Arabic font, this release is over 3x faster than previous + release. All scripts / languages should see this speedup. + +- New --num-iterations option for hb-shape / hb-view; useful for + profiling. + Overview of changes leading to 0.9.15 -Thursday, April 05, 2013 +Friday, April 05, 2013 ===================================== - Build fixes. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/harfbuzz-0.9.15/configure new/harfbuzz-0.9.16/configure --- old/harfbuzz-0.9.15/configure 2013-04-06 00:02:38.000000000 +0200 +++ new/harfbuzz-0.9.16/configure 2013-04-19 22:24:01.000000000 +0200 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.68 for HarfBuzz 0.9.15. +# Generated by GNU Autoconf 2.68 for HarfBuzz 0.9.16. # # Report bugs to <http://bugs.freedesktop.org/enter_bug.cgi?product=harfbuzz>. # @@ -571,8 +571,8 @@ # Identity of this package. PACKAGE_NAME='HarfBuzz' PACKAGE_TARNAME='harfbuzz' -PACKAGE_VERSION='0.9.15' -PACKAGE_STRING='HarfBuzz 0.9.15' +PACKAGE_VERSION='0.9.16' +PACKAGE_STRING='HarfBuzz 0.9.16' PACKAGE_BUGREPORT='http://bugs.freedesktop.org/enter_bug.cgi?product=harfbuzz' PACKAGE_URL='http://harfbuzz.org/' @@ -1385,7 +1385,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures HarfBuzz 0.9.15 to adapt to many kinds of systems. +\`configure' configures HarfBuzz 0.9.16 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1455,7 +1455,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of HarfBuzz 0.9.15:";; + short | recursive ) echo "Configuration of HarfBuzz 0.9.16:";; esac cat <<\_ACEOF @@ -1589,7 +1589,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -HarfBuzz configure 0.9.15 +HarfBuzz configure 0.9.16 generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. @@ -2133,7 +2133,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by HarfBuzz $as_me 0.9.15, which was +It was created by HarfBuzz $as_me 0.9.16, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ @@ -2954,7 +2954,7 @@ # Define the identity of the package. PACKAGE='harfbuzz' - VERSION='0.9.15' + VERSION='0.9.16' # Some tools Automake needs. @@ -16284,8 +16284,8 @@ HB_VERSION_MAJOR=0 HB_VERSION_MINOR=9 -HB_VERSION_MICRO=15 -HB_VERSION=0.9.15 +HB_VERSION_MICRO=16 +HB_VERSION=0.9.16 @@ -16296,7 +16296,7 @@ -HB_LIBTOOL_VERSION_INFO=915:0:915 +HB_LIBTOOL_VERSION_INFO=916:0:916 @@ -18613,7 +18613,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by HarfBuzz $as_me 0.9.15, which was +This file was extended by HarfBuzz $as_me 0.9.16, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -18680,7 +18680,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -HarfBuzz config.status 0.9.15 +HarfBuzz config.status 0.9.16 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/harfbuzz-0.9.15/configure.ac new/harfbuzz-0.9.16/configure.ac --- old/harfbuzz-0.9.15/configure.ac 2013-04-06 00:00:01.000000000 +0200 +++ new/harfbuzz-0.9.16/configure.ac 2013-04-19 22:23:07.000000000 +0200 @@ -1,6 +1,6 @@ AC_PREREQ([2.64]) AC_INIT([HarfBuzz], - [0.9.15], + [0.9.16], [http://bugs.freedesktop.org/enter_bug.cgi?product=harfbuzz], [harfbuzz], [http://harfbuzz.org/]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/harfbuzz-0.9.15/src/hb-old/harfbuzz-arabic.c new/harfbuzz-0.9.16/src/hb-old/harfbuzz-arabic.c --- old/harfbuzz-0.9.15/src/hb-old/harfbuzz-arabic.c 2012-08-01 06:00:37.000000000 +0200 +++ new/harfbuzz-0.9.16/src/hb-old/harfbuzz-arabic.c 2013-04-11 20:43:20.000000000 +0200 @@ -237,13 +237,13 @@ ArabicNone, Zain, Kaph, Fe, }; -static ArabicGroup arabicGroup(unsigned short uc) +static ArabicGroup arabicGroup(hb_unicode_funcs_t *ufuncs, unsigned short uc) { if (uc >= 0x0600 && uc < 0x750) return (ArabicGroup) arabic_group[uc-0x600]; else if (uc == 0x200d) return Center; - else if (HB_GetUnicodeCharCategory(uc) == HB_Separator_Space) + else if (HB_GetUnicodeCharCategory(ufuncs, uc) == HB_Separator_Space) return ArabicSpace; else return ArabicNone; @@ -375,14 +375,14 @@ */ -static void getArabicProperties(const unsigned short *chars, int len, HB_ArabicProperties *properties) +static void getArabicProperties(hb_unicode_funcs_t *ufuncs, const unsigned short *chars, int len, HB_ArabicProperties *properties) { /* qDebug("arabicSyriacOpenTypeShape: properties:"); */ int lastPos = 0; int lastGroup = ArabicNone; int i = 0; - ArabicGroup group = arabicGroup(chars[0]); + ArabicGroup group = arabicGroup(ufuncs, chars[0]); Joining j = joining_for_group[group]; ArabicShape shape = joining_table[XIsolated][j].form2; properties[0].justification = HB_NoJustification; @@ -391,7 +391,7 @@ /* #### fix handling for spaces and punktuation */ properties[i].justification = HB_NoJustification; - group = arabicGroup(chars[i]); + group = arabicGroup(ufuncs, chars[i]); j = joining_for_group[group]; if (j == JTransparent) { @@ -460,7 +460,7 @@ case Yeh: case Reh: - if (properties[lastPos].shape == XMedial && arabicGroup(chars[lastPos]) == Beh) + if (properties[lastPos].shape == XMedial && arabicGroup(ufuncs, chars[lastPos]) == Beh) properties[lastPos-1].justification = HB_Arabic_BaRa; break; @@ -504,7 +504,7 @@ return JNone; } -static void getNkoProperties(const unsigned short *chars, int len, HB_ArabicProperties *properties) +static void getNkoProperties(hb_unicode_funcs_t *ufuncs, const unsigned short *chars, int len, HB_ArabicProperties *properties) { int lastPos = 0; int i = 0; @@ -514,7 +514,7 @@ properties[0].justification = HB_NoJustification; for (i = 1; i < len; ++i) { - properties[i].justification = (HB_GetUnicodeCharCategory(chars[i]) == HB_Separator_Space) ? + properties[i].justification = (HB_GetUnicodeCharCategory(ufuncs, chars[i]) == HB_Separator_Space) ? ArabicSpace : ArabicNone; j = getNkoJoining(chars[i]); @@ -854,13 +854,13 @@ /* Two small helper functions for arabic shaping. */ -static HB_UChar16 prevChar(const HB_UChar16 *str, int pos) +static HB_UChar16 prevChar(hb_unicode_funcs_t *ufuncs, const HB_UChar16 *str, int pos) { /*qDebug("leftChar: pos=%d", pos); */ const HB_UChar16 *ch = str + pos - 1; pos--; while(pos > -1) { - if(HB_GetUnicodeCharCategory(*ch) != HB_Mark_NonSpacing) + if(HB_GetUnicodeCharCategory(ufuncs, *ch) != HB_Mark_NonSpacing) return *ch; pos--; ch--; @@ -868,13 +868,13 @@ return ReplacementCharacter; } -static HB_UChar16 nextChar(const HB_UChar16 *str, hb_uint32 len, hb_uint32 pos) +static HB_UChar16 nextChar(hb_unicode_funcs_t *ufuncs, const HB_UChar16 *str, hb_uint32 len, hb_uint32 pos) { const HB_UChar16 *ch = str + pos + 1; pos++; while(pos < len) { /*qDebug("rightChar: %d isLetter=%d, joining=%d", pos, ch.isLetter(), ch.joining()); */ - if(HB_GetUnicodeCharCategory(*ch) != HB_Mark_NonSpacing) + if(HB_GetUnicodeCharCategory(ufuncs, *ch) != HB_Mark_NonSpacing) return *ch; /* assume it's a transparent char, this might not be 100% correct */ pos++; @@ -883,7 +883,7 @@ return ReplacementCharacter; } -static void shapedString(const HB_UChar16 *uc, hb_uint32 stringLength, hb_uint32 from, hb_uint32 len, HB_UChar16 *shapeBuffer, int *shapedLength, +static void shapedString(hb_unicode_funcs_t *ufuncs, const HB_UChar16 *uc, hb_uint32 stringLength, hb_uint32 from, hb_uint32 len, HB_UChar16 *shapeBuffer, int *shapedLength, HB_Bool reverse, HB_GlyphAttributes *attributes, unsigned short *logClusters) { HB_ArabicProperties *properties; @@ -910,7 +910,7 @@ } if (f + l < stringLength) ++l; - getArabicProperties(uc+f, l, props); + getArabicProperties(ufuncs, uc+f, l, props); ch = uc + from; data = shapeBuffer; @@ -927,7 +927,7 @@ goto skip; } if (reverse) - *data = HB_GetMirroredChar(*ch); + *data = HB_GetMirroredChar(ufuncs, *ch); else *data = *ch; } else { @@ -939,7 +939,7 @@ hb_uint16 map; switch (c) { case 0x44: { /* lam */ - const HB_UChar16 pch = nextChar(uc, stringLength, pos); + const HB_UChar16 pch = nextChar(ufuncs, uc, stringLength, pos); if ((pch >> 8) == 0x06) { switch (pch & 0xff) { case 0x22: @@ -959,7 +959,7 @@ case 0x23: /* alef with hamza above */ case 0x25: /* alef with hamza below */ case 0x27: /* alef */ - if (prevChar(uc, pos) == 0x0644) { + if (prevChar(ufuncs, uc, pos) == 0x0644) { /* have a lam alef ligature */ /*qDebug(" alef of lam-alef ligature"); */ goto skip; @@ -973,7 +973,7 @@ } /* ##### Fixme */ /*glyphs[gpos].attributes.zeroWidth = zeroWidth; */ - if (HB_GetUnicodeCharCategory(*ch) == HB_Mark_NonSpacing) { + if (HB_GetUnicodeCharCategory(ufuncs, *ch) == HB_Mark_NonSpacing) { attributes[gpos].mark = TRUE; /* qDebug("glyph %d (char %d) is mark!", gpos, i); */ } else { @@ -981,7 +981,7 @@ clusterStart = data - shapeBuffer; } attributes[gpos].clusterStart = !attributes[gpos].mark; - attributes[gpos].combiningClass = HB_GetUnicodeCharCombiningClass(*ch); + attributes[gpos].combiningClass = HB_GetUnicodeCharCombiningClass(ufuncs, *ch); attributes[gpos].justification = properties[i].justification; /* qDebug("data[%d] = %x (from %x)", gpos, (uint)data->unicode(), ch->unicode());*/ data++; @@ -1063,9 +1063,9 @@ ++l; } if (item->item.script == HB_Script_Nko) - getNkoProperties(uc+f, l, props); + getNkoProperties(item->ufuncs, uc+f, l, props); else - getArabicProperties(uc+f, l, props); + getArabicProperties(item->ufuncs, uc+f, l, props); for (i = 0; i < (int)item->num_glyphs; i++) { apply[i] = 0; @@ -1128,7 +1128,7 @@ return HB_BasicShape(item); } - shapedString(item->string, item->stringLength, item->item.pos, item->item.length, shapedChars, &slen, + shapedString(item->ufuncs, item->string, item->stringLength, item->item.pos, item->item.length, shapedChars, &slen, item->item.bidiLevel % 2, item->attributes, item->log_clusters); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/harfbuzz-0.9.15/src/hb-old/harfbuzz-external.h new/harfbuzz-0.9.16/src/hb-old/harfbuzz-external.h --- old/harfbuzz-0.9.15/src/hb-old/harfbuzz-external.h 2012-08-08 23:13:36.000000000 +0200 +++ new/harfbuzz-0.9.16/src/hb-old/harfbuzz-external.h 2013-04-11 20:35:50.000000000 +0200 @@ -78,27 +78,27 @@ } HB_CharCategory; -static inline HB_CharCategory HB_GetUnicodeCharCategory(HB_UChar32 ch) +static inline HB_CharCategory HB_GetUnicodeCharCategory(hb_unicode_funcs_t *funcs, HB_UChar32 ch) { - return (HB_CharCategory) hb_unicode_general_category (hb_unicode_funcs_get_default (), ch); + return (HB_CharCategory) hb_unicode_general_category (funcs, ch); } -static inline int HB_GetUnicodeCharCombiningClass(HB_UChar32 ch) +static inline int HB_GetUnicodeCharCombiningClass(hb_unicode_funcs_t *funcs, HB_UChar32 ch) { - return hb_unicode_combining_class (hb_unicode_funcs_get_default (), ch); + return hb_unicode_combining_class (funcs, ch); } -static inline HB_UChar16 HB_GetMirroredChar(HB_UChar16 ch) +static inline HB_UChar16 HB_GetMirroredChar(hb_unicode_funcs_t *funcs, HB_UChar16 ch) { - return hb_unicode_mirroring (hb_unicode_funcs_get_default (), ch); + return hb_unicode_mirroring (funcs, ch); } -static inline void HB_GetUnicodeCharProperties(HB_UChar32 ch, HB_CharCategory *category, int *combiningClass) +static inline void HB_GetUnicodeCharProperties(hb_unicode_funcs_t *funcs, HB_UChar32 ch, HB_CharCategory *category, int *combiningClass) { if (category) - *category = HB_GetUnicodeCharCategory (ch); + *category = HB_GetUnicodeCharCategory (funcs, ch); if (combiningClass) - *combiningClass = HB_GetUnicodeCharCombiningClass (ch); + *combiningClass = HB_GetUnicodeCharCombiningClass (funcs, ch); } HB_END_HEADER diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/harfbuzz-0.9.15/src/hb-old/harfbuzz-greek.c new/harfbuzz-0.9.16/src/hb-old/harfbuzz-greek.c --- old/harfbuzz-0.9.15/src/hb-old/harfbuzz-greek.c 2012-07-30 01:56:38.000000000 +0200 +++ new/harfbuzz-0.9.16/src/hb-old/harfbuzz-greek.c 2013-04-11 20:37:13.000000000 +0200 @@ -406,7 +406,7 @@ HB_CharCategory category; int cmb; shapedChars[slen] = uc[i]; - HB_GetUnicodeCharProperties(uc[i], &category, &cmb); + HB_GetUnicodeCharProperties(shaper_item->ufuncs, uc[i], &category, &cmb); if (category != HB_Mark_NonSpacing) { attributes[slen].clusterStart = TRUE; attributes[slen].mark = FALSE; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/harfbuzz-0.9.15/src/hb-old/harfbuzz-hebrew.c new/harfbuzz-0.9.16/src/hb-old/harfbuzz-hebrew.c --- old/harfbuzz-0.9.15/src/hb-old/harfbuzz-hebrew.c 2012-07-30 01:56:38.000000000 +0200 +++ new/harfbuzz-0.9.16/src/hb-old/harfbuzz-hebrew.c 2013-04-11 20:38:56.000000000 +0200 @@ -151,7 +151,7 @@ HB_CharCategory category; int cmb; shapedChars[slen] = uc[i]; - HB_GetUnicodeCharProperties(uc[i], &category, &cmb); + HB_GetUnicodeCharProperties(shaper_item->ufuncs, uc[i], &category, &cmb); if (category != HB_Mark_NonSpacing) { attributes[slen].clusterStart = TRUE; attributes[slen].mark = FALSE; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/harfbuzz-0.9.15/src/hb-old/harfbuzz-indic.cpp new/harfbuzz-0.9.16/src/hb-old/harfbuzz-indic.cpp --- old/harfbuzz-0.9.15/src/hb-old/harfbuzz-indic.cpp 2012-07-30 01:56:38.000000000 +0200 +++ new/harfbuzz-0.9.16/src/hb-old/harfbuzz-indic.cpp 2013-04-11 20:38:21.000000000 +0200 @@ -30,22 +30,22 @@ #define FLAG(x) (1 << (x)) -static HB_Bool isLetter(HB_UChar16 ucs) +static HB_Bool isLetter(hb_unicode_funcs_t *ufuncs, HB_UChar16 ucs) { const int test = FLAG(HB_Letter_Uppercase) | FLAG(HB_Letter_Lowercase) | FLAG(HB_Letter_Titlecase) | FLAG(HB_Letter_Modifier) | FLAG(HB_Letter_Other); - return !!(FLAG(HB_GetUnicodeCharCategory(ucs)) & test); + return !!(FLAG(HB_GetUnicodeCharCategory(ufuncs, ucs)) & test); } -static HB_Bool isMark(HB_UChar16 ucs) +static HB_Bool isMark(hb_unicode_funcs_t *ufuncs, HB_UChar16 ucs) { const int test = FLAG(HB_Mark_NonSpacing) | FLAG(HB_Mark_SpacingCombining) | FLAG(HB_Mark_Enclosing); - return !!(FLAG(HB_GetUnicodeCharCategory(ucs)) & test); + return !!(FLAG(HB_GetUnicodeCharCategory(ufuncs, ucs)) & test); } enum Form { @@ -1576,7 +1576,7 @@ // Ccmp always applies // Init if (item->item.pos == 0 - || !(isLetter(item->string[item->item.pos-1]) || isMark(item->string[item->item.pos-1]))) + || !(isLetter(item->ufuncs, item->string[item->item.pos-1]) || isMark(item->ufuncs, item->string[item->item.pos-1]))) properties[0] &= ~InitProperty; // Nukta always applies diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/harfbuzz-0.9.15/src/hb-old/harfbuzz-shaper.cpp new/harfbuzz-0.9.16/src/hb-old/harfbuzz-shaper.cpp --- old/harfbuzz-0.9.15/src/hb-old/harfbuzz-shaper.cpp 2012-09-18 02:53:30.000000000 +0200 +++ new/harfbuzz-0.9.16/src/hb-old/harfbuzz-shaper.cpp 2013-04-11 20:44:36.000000000 +0200 @@ -262,7 +262,7 @@ int pos = 0; HB_CharCategory lastCat; int dummy; - HB_GetUnicodeCharProperties(uc[0], &lastCat, &dummy); + HB_GetUnicodeCharProperties(item->ufuncs, uc[0], &lastCat, &dummy); for (i = 1; i < length; ++i) { if (logClusters[i] == pos) // same glyph @@ -277,7 +277,7 @@ attributes[pos].dontPrint = true; HB_CharCategory cat; int cmb; - HB_GetUnicodeCharProperties(uc[i], &cat, &cmb); + HB_GetUnicodeCharProperties(item->ufuncs, uc[i], &cat, &cmb); if (cat != HB_Mark_NonSpacing) { attributes[pos].mark = false; attributes[pos].clusterStart = true; @@ -988,6 +988,8 @@ return false; } assert(shaper_item->item.script < HB_ScriptCount); + if (!shaper_item->ufuncs) + shaper_item->ufuncs = hb_unicode_funcs_get_default (); result = HB_ScriptEngines[shaper_item->item.script].shape(shaper_item); shaper_item->glyphIndicesPresent = false; return result; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/harfbuzz-0.9.15/src/hb-old/harfbuzz-shaper.h new/harfbuzz-0.9.16/src/hb-old/harfbuzz-shaper.h --- old/harfbuzz-0.9.15/src/hb-old/harfbuzz-shaper.h 2012-07-30 01:56:38.000000000 +0200 +++ new/harfbuzz-0.9.16/src/hb-old/harfbuzz-shaper.h 2013-04-11 20:29:04.000000000 +0200 @@ -234,6 +234,7 @@ typedef struct HB_ShaperItem_ HB_ShaperItem; struct HB_ShaperItem_ { + hb_unicode_funcs_t *ufuncs; const HB_UChar16 *string; /* input: the Unicode UTF16 text to be shaped */ hb_uint32 stringLength; /* input: the length of the input in 16-bit words */ HB_ScriptItem item; /* input: the current run to be shaped: a run of text all in the same script that is a substring of <string> */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/harfbuzz-0.9.15/src/hb-open-type-private.hh new/harfbuzz-0.9.16/src/hb-open-type-private.hh --- old/harfbuzz-0.9.15/src/hb-open-type-private.hh 2013-03-19 12:04:53.000000000 +0100 +++ new/harfbuzz-0.9.16/src/hb-open-type-private.hh 2013-04-19 20:35:25.000000000 +0200 @@ -949,21 +949,22 @@ struct SortedArrayOf : ArrayOf<Type> { template <typename SearchType> - inline int search (const SearchType &x) const { - unsigned int count = this->len; - /* Linear search is *much* faster for small counts. */ - if (likely (count < 32)) { - for (unsigned int i = 0; i < count; i++) - if (this->array[i].cmp (x) == 0) - return i; - return -1; - } else { - struct Cmp { - static int cmp (const SearchType *a, const Type *b) { return b->cmp (*a); } - }; - const Type *p = (const Type *) bsearch (&x, this->array, this->len, sizeof (this->array[0]), (hb_compare_func_t) Cmp::cmp); - return p ? p - this->array : -1; + inline int search (const SearchType &x) const + { + /* Hand-coded bsearch here since this is in the hot inner loop. */ + int min = 0, max = (int) this->len - 1; + while (min <= max) + { + int mid = (min + max) / 2; + int c = this->array[mid].cmp (x); + if (c < 0) + max = mid - 1; + else if (c > 0) + min = mid + 1; + else + return mid; } + return -1; } }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/harfbuzz-0.9.15/src/hb-ot-layout-common-private.hh new/harfbuzz-0.9.16/src/hb-ot-layout-common-private.hh --- old/harfbuzz-0.9.15/src/hb-ot-layout-common-private.hh 2013-03-19 10:47:13.000000000 +0100 +++ new/harfbuzz-0.9.16/src/hb-ot-layout-common-private.hh 2013-04-19 20:41:59.000000000 +0200 @@ -129,8 +129,7 @@ struct RangeRecord { inline int cmp (hb_codepoint_t g) const { - hb_codepoint_t a = start, b = end; - return g < a ? -1 : g <= b ? 0 : +1 ; + return g < start ? -1 : g <= end ? 0 : +1 ; } inline bool sanitize (hb_sanitize_context_t *c) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/harfbuzz-0.9.15/src/hb-ot-layout-gpos-table.hh new/harfbuzz-0.9.16/src/hb-ot-layout-gpos-table.hh --- old/harfbuzz-0.9.15/src/hb-ot-layout-gpos-table.hh 2013-03-19 12:04:53.000000000 +0100 +++ new/harfbuzz-0.9.16/src/hb-ot-layout-gpos-table.hh 2013-04-18 05:14:23.000000000 +0200 @@ -1480,8 +1480,8 @@ while (c->buffer->idx < c->buffer->len) { - if ((c->buffer->cur().mask & c->lookup_mask) && - digest->may_have (c->buffer->cur().codepoint) && + if (digest->may_have (c->buffer->cur().codepoint) && + (c->buffer->cur().mask & c->lookup_mask) && apply_once (c)) ret = true; else diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/harfbuzz-0.9.15/src/hb-ot-layout-gsub-table.hh new/harfbuzz-0.9.16/src/hb-ot-layout-gsub-table.hh --- old/harfbuzz-0.9.15/src/hb-ot-layout-gsub-table.hh 2013-03-19 12:04:53.000000000 +0100 +++ new/harfbuzz-0.9.16/src/hb-ot-layout-gsub-table.hh 2013-04-18 05:36:37.000000000 +0200 @@ -1202,8 +1202,8 @@ while (c->buffer->idx < c->buffer->len) { - if ((c->buffer->cur().mask & c->lookup_mask) && - digest->may_have (c->buffer->cur().codepoint) && + if (digest->may_have (c->buffer->cur().codepoint) && + (c->buffer->cur().mask & c->lookup_mask) && apply_once (c)) ret = true; else @@ -1219,8 +1219,8 @@ c->buffer->idx = c->buffer->len - 1; do { - if ((c->buffer->cur().mask & c->lookup_mask) && - digest->may_have (c->buffer->cur().codepoint) && + if (digest->may_have (c->buffer->cur().codepoint) && + (c->buffer->cur().mask & c->lookup_mask) && apply_once (c)) ret = true; else diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/harfbuzz-0.9.15/src/hb-ot-layout.cc new/harfbuzz-0.9.16/src/hb-ot-layout.cc --- old/harfbuzz-0.9.15/src/hb-ot-layout.cc 2013-03-19 12:04:53.000000000 +0100 +++ new/harfbuzz-0.9.16/src/hb-ot-layout.cc 2013-04-17 03:57:35.000000000 +0200 @@ -70,9 +70,15 @@ } for (unsigned int i = 0; i < layout->gsub_lookup_count; i++) + { + layout->gsub_digests[i].init (); layout->gsub->get_lookup (i).add_coverage (&layout->gsub_digests[i]); + } for (unsigned int i = 0; i < layout->gpos_lookup_count; i++) + { + layout->gpos_digests[i].init (); layout->gpos->get_lookup (i).add_coverage (&layout->gpos_digests[i]); + } return layout; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/harfbuzz-0.9.15/src/hb-ot-shape-complex-arabic-fallback.hh new/harfbuzz-0.9.16/src/hb-ot-shape-complex-arabic-fallback.hh --- old/harfbuzz-0.9.15/src/hb-ot-shape-complex-arabic-fallback.hh 2013-03-19 12:04:53.000000000 +0100 +++ new/harfbuzz-0.9.16/src/hb-ot-shape-complex-arabic-fallback.hh 2013-04-17 03:57:35.000000000 +0200 @@ -212,7 +212,9 @@ if (unlikely (!fallback_plan)) return const_cast<arabic_fallback_plan_t *> (&arabic_fallback_plan_nil); - for (unsigned int i = 0; i < ARABIC_NUM_FALLBACK_FEATURES; i++) { + for (unsigned int i = 0; i < ARABIC_NUM_FALLBACK_FEATURES; i++) + { + fallback_plan->digest_array[i].init (); fallback_plan->mask_array[i] = plan->map.get_1_mask (arabic_fallback_features[i]); if (fallback_plan->mask_array[i]) { fallback_plan->lookup_array[i] = arabic_fallback_synthesize_lookup (plan, font, i); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/harfbuzz-0.9.15/src/hb-private.hh new/harfbuzz-0.9.16/src/hb-private.hh --- old/harfbuzz-0.9.15/src/hb-private.hh 2013-03-19 12:04:53.000000000 +0100 +++ new/harfbuzz-0.9.16/src/hb-private.hh 2013-04-19 00:39:29.000000000 +0200 @@ -517,7 +517,7 @@ #define hb_be_uint32_get(v) (uint32_t) ((v[0] << 24) + (v[1] << 16) + (v[2] << 8) + v[3]) #define hb_be_uint32_eq(a,b) (a[0] == b[0] && a[1] == b[1] && a[2] == b[2] && a[3] == b[3]) -#define hb_be_uint24_put(v,V) HB_STMT_START { v[0] = (V>>16); v[1] = (V>>8); v[2] (V); } HB_STMT_END +#define hb_be_uint24_put(v,V) HB_STMT_START { v[0] = (V>>16); v[1] = (V>>8); v[2] = (V); } HB_STMT_END #define hb_be_uint24_get(v) (uint32_t) ((v[0] << 16) + (v[1] << 8) + v[2]) #define hb_be_uint24_eq(a,b) (a[0] == b[0] && a[1] == b[1] && a[2] == b[2]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/harfbuzz-0.9.15/src/hb-set-private.hh new/harfbuzz-0.9.16/src/hb-set-private.hh --- old/harfbuzz-0.9.15/src/hb-set-private.hh 2013-03-19 10:47:13.000000000 +0100 +++ new/harfbuzz-0.9.16/src/hb-set-private.hh 2013-04-19 20:41:00.000000000 +0200 @@ -32,47 +32,29 @@ #include "hb-object-private.hh" -struct hb_set_digest_common_bits_t -{ - ASSERT_POD (); - - typedef unsigned int mask_t; - - inline void init (void) { - mask = ~0; - value = (mask_t) -1; - } - - inline void add (hb_codepoint_t g) { - if (unlikely (value == (mask_t) -1)) { - value = g; - return; - } - - mask ^= (g & mask) ^ value; - value &= mask; - } - - inline void add_range (hb_codepoint_t a, hb_codepoint_t b) { - /* The negation here stands for ~(x-1). */ - mask &= -(1 << _hb_bit_storage (a ^ b)); - value &= mask; - } - - inline bool may_have (hb_codepoint_t g) const { - return (g & mask) == value; - } - - private: - mask_t mask; - mask_t value; -}; +/* + * The set digests here implement various "filters" that support + * "approximate member query". Conceptually these are like Bloom + * Filter and Quotient Filter, however, much smaller, faster, and + * designed to fit the requirements of our uses for glyph coverage + * queries. As a result, our filters have much higher. + */ +template <typename mask_t, unsigned int shift> struct hb_set_digest_lowest_bits_t { ASSERT_POD (); - typedef unsigned long mask_t; + static const unsigned int num_bits = 0 + + (sizeof (mask_t) >= 1 ? 3 : 0) + + (sizeof (mask_t) >= 2 ? 1 : 0) + + (sizeof (mask_t) >= 4 ? 1 : 0) + + (sizeof (mask_t) >= 8 ? 1 : 0) + + (sizeof (mask_t) >= 16? 1 : 0) + + 0; + + ASSERT_STATIC (shift < sizeof (hb_codepoint_t) * 8); + ASSERT_STATIC (shift + num_bits <= sizeof (hb_codepoint_t) * 8); inline void init (void) { mask = 0; @@ -83,7 +65,7 @@ } inline void add_range (hb_codepoint_t a, hb_codepoint_t b) { - if (b - a >= sizeof (mask_t) * 8 - 1) + if ((b >> shift) - (a >> shift) >= sizeof (mask_t) * 8 - 1) mask = (mask_t) -1; else { mask_t ma = mask_for (a); @@ -98,39 +80,66 @@ private: - static inline mask_t mask_for (hb_codepoint_t g) { return ((mask_t) 1) << (g & (sizeof (mask_t) * 8 - 1)); } + static inline mask_t mask_for (hb_codepoint_t g) { + return ((mask_t) 1) << ((g >> shift) & (sizeof (mask_t) * 8 - 1)); + } mask_t mask; }; -struct hb_set_digest_t +template <typename head_t, typename tail_t> +struct hb_set_digest_combiner_t { ASSERT_POD (); inline void init (void) { - digest1.init (); - digest2.init (); + head.init (); + tail.init (); } inline void add (hb_codepoint_t g) { - digest1.add (g); - digest2.add (g); + head.add (g); + tail.add (g); } inline void add_range (hb_codepoint_t a, hb_codepoint_t b) { - digest1.add_range (a, b); - digest2.add_range (a, b); + head.add_range (a, b); + tail.add_range (a, b); } inline bool may_have (hb_codepoint_t g) const { - return digest1.may_have (g) && digest2.may_have (g); + return head.may_have (g) && tail.may_have (g); } private: - hb_set_digest_common_bits_t digest1; - hb_set_digest_lowest_bits_t digest2; + head_t head; + tail_t tail; }; +/* + * hb_set_digest_t + * + * This is a combination of digests that performs "best". + * There is not much science to this: it's a result of intuition + * and testing. + */ +typedef hb_set_digest_combiner_t +< + hb_set_digest_lowest_bits_t<unsigned long, 4>, + hb_set_digest_combiner_t + < + hb_set_digest_lowest_bits_t<unsigned long, 0>, + hb_set_digest_lowest_bits_t<unsigned long, 9> + > +> hb_set_digest_t; + + + +/* + * hb_set_t + */ + + /* TODO Make this faster and memmory efficient. */ struct hb_set_t diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/harfbuzz-0.9.15/src/hb-set.cc new/harfbuzz-0.9.16/src/hb-set.cc --- old/harfbuzz-0.9.15/src/hb-set.cc 2013-03-19 10:47:13.000000000 +0100 +++ new/harfbuzz-0.9.16/src/hb-set.cc 2013-04-18 01:01:21.000000000 +0200 @@ -27,7 +27,6 @@ #include "hb-set-private.hh" - /* Public API */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/harfbuzz-0.9.15/src/hb-version.h new/harfbuzz-0.9.16/src/hb-version.h --- old/harfbuzz-0.9.15/src/hb-version.h 2013-04-06 00:02:43.000000000 +0200 +++ new/harfbuzz-0.9.16/src/hb-version.h 2013-04-19 22:24:07.000000000 +0200 @@ -38,9 +38,9 @@ #define HB_VERSION_MAJOR 0 #define HB_VERSION_MINOR 9 -#define HB_VERSION_MICRO 15 +#define HB_VERSION_MICRO 16 -#define HB_VERSION_STRING "0.9.15" +#define HB_VERSION_STRING "0.9.16" #define HB_VERSION_CHECK(major,minor,micro) \ ((major)*10000+(minor)*100+(micro) >= \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/harfbuzz-0.9.15/src/test.cc new/harfbuzz-0.9.16/src/test.cc --- old/harfbuzz-0.9.15/src/test.cc 2013-03-19 10:47:13.000000000 +0100 +++ new/harfbuzz-0.9.16/src/test.cc 2013-04-09 20:06:22.000000000 +0200 @@ -100,6 +100,7 @@ hb_buffer_t *buffer = hb_buffer_create (); hb_buffer_add_utf8 (buffer, "\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\x95", -1, 0, -1); + hb_buffer_guess_segment_properties (buffer); hb_shape (font, buffer, NULL, 0); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/harfbuzz-0.9.15/util/options.cc new/harfbuzz-0.9.16/util/options.cc --- old/harfbuzz-0.9.15/util/options.cc 2013-02-12 21:34:29.000000000 +0100 +++ new/harfbuzz-0.9.16/util/options.cc 2013-04-11 22:30:18.000000000 +0200 @@ -276,6 +276,7 @@ {"preserve-default-ignorables",0, 0, G_OPTION_ARG_NONE, &this->preserve_default_ignorables, "Preserve Default-Ignorable characters", NULL}, {"utf8-clusters", 0, 0, G_OPTION_ARG_NONE, &this->utf8_clusters, "Use UTF8 byte indices, not char indices", NULL}, {"normalize-glyphs",0, 0, G_OPTION_ARG_NONE, &this->normalize_glyphs, "Rearrange glyph clusters in nominal order", NULL}, + {"num-iterations", 0, 0, G_OPTION_ARG_INT, &this->num_iterations, "Run shaper N times (default: 1)", "N"}, {NULL} }; parser->add_group (entries, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/harfbuzz-0.9.15/util/options.hh new/harfbuzz-0.9.16/util/options.hh --- old/harfbuzz-0.9.15/util/options.hh 2013-02-15 13:50:05.000000000 +0100 +++ new/harfbuzz-0.9.16/util/options.hh 2013-04-11 22:27:33.000000000 +0200 @@ -150,6 +150,7 @@ shapers = NULL; utf8_clusters = false; normalize_glyphs = false; + num_iterations = 1; add_options (parser); } @@ -234,6 +235,7 @@ char **shapers; hb_bool_t utf8_clusters; hb_bool_t normalize_glyphs; + unsigned int num_iterations; }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/harfbuzz-0.9.15/util/shape-consumer.hh new/harfbuzz-0.9.16/util/shape-consumer.hh --- old/harfbuzz-0.9.15/util/shape-consumer.hh 2012-11-14 21:36:34.000000000 +0100 +++ new/harfbuzz-0.9.16/util/shape-consumer.hh 2013-04-18 06:06:18.000000000 +0200 @@ -51,14 +51,17 @@ { output.new_line (); - shaper.populate_buffer (buffer, text, text_len, text_before, text_after); - output.consume_text (buffer, text, text_len, shaper.utf8_clusters); - - if (!shaper.shape (font, buffer)) { - failed = true; - hb_buffer_set_length (buffer, 0); - output.shape_failed (buffer, text, text_len, shaper.utf8_clusters); - return; + for (unsigned int n = shaper.num_iterations; n; n--) + { + shaper.populate_buffer (buffer, text, text_len, text_before, text_after); + if (n == 1) + output.consume_text (buffer, text, text_len, shaper.utf8_clusters); + if (!shaper.shape (font, buffer)) { + failed = true; + hb_buffer_set_length (buffer, 0); + output.shape_failed (buffer, text, text_len, shaper.utf8_clusters); + return; + } } output.consume_glyphs (buffer, text, text_len, shaper.utf8_clusters); -- To unsubscribe, e-mail: opensuse-commit+unsubscr...@opensuse.org For additional commands, e-mail: opensuse-commit+h...@opensuse.org