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

Reply via email to