[HarfBuzz] harfbuzz: Branch 'master' - 2 commits

Behdad Esfahbod behdad at kemper.freedesktop.org
Tue Aug 12 12:50:18 PDT 2014


 src/hb-coretext.cc |   33 +++++++++++++++++++++++++++++----
 1 file changed, 29 insertions(+), 4 deletions(-)

New commits:
commit 81b8d9777b9c38c7e6408591763a4cac6de18e4b
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Tue Aug 12 15:49:47 2014 -0400

    [coretext] Fix buffer resizing
    
    Was very broken.  Now fixed and tested.

diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc
index 0301c4a..fe5f31b 100644
--- a/src/hb-coretext.cc
+++ b/src/hb-coretext.cc
@@ -659,15 +659,24 @@ resize_and_retry:
     CFRelease (line);
     string_ref = NULL;
     line = NULL;
+
+    /* Get previous start-of-scratch-area, that we use later for readjusting
+     * our existing scratch arrays. */
+    unsigned int old_scratch_used;
+    hb_buffer_t::scratch_buffer_t *old_scratch;
+    old_scratch = buffer->get_scratch_buffer (&old_scratch_used);
+    old_scratch_used = scratch - old_scratch;
+
     if (unlikely (!buffer->ensure (buffer->allocated * 2)))
       FAIL ("Buffer resize failed");
 
-    /* Adjust scratch, pchars, and log_cluster arrays.  This is ugly, but really the cleanest way to do without
-     * completely restructuring the rest of this shaper. */
-    hb_buffer_t::scratch_buffer_t *old_scratch = scratch;
+    /* Adjust scratch, pchars, and log_cluster arrays.  This is ugly, but really the
+     * cleanest way to do without completely restructuring the rest of this shaper. */
     scratch = buffer->get_scratch_buffer (&scratch_size);
     pchars = reinterpret_cast<UniChar *> (((char *) scratch + ((char *) pchars - (char *) old_scratch)));
     log_clusters = reinterpret_cast<unsigned int *> (((char *) scratch + ((char *) log_clusters - (char *) old_scratch)));
+    scratch += old_scratch_used;
+    scratch_size -= old_scratch_used;
   }
 retry:
   {
@@ -864,7 +873,7 @@ retry:
       if (num_glyphs == 0)
 	continue;
 
-      if (!buffer->ensure (buffer->len + num_glyphs))
+      if (!buffer->ensure_inplace (buffer->len + num_glyphs))
 	goto resize_and_retry;
 
       hb_glyph_info_t *run_info = buffer->info + buffer->len;
commit c3e924fb9e0e2d4003790817655efd9c5688c7e1
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Tue Aug 12 14:25:11 2014 -0400

    [coretext] Rewind scratch-allocated arrays when not needed anymore

diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc
index 7353411..0301c4a 100644
--- a/src/hb-coretext.cc
+++ b/src/hb-coretext.cc
@@ -874,8 +874,19 @@ retry:
        * have it that this changed in OS X 10.10 Yosemite, and NULL is returned
        * frequently.  At any rate, we can test that codepath by setting USE_PTR
        * to false. */
+
 #define USE_PTR true
+
+#define SCRATCH_SAVE() \
+  unsigned int scratch_size_saved = scratch_size; \
+  hb_buffer_t::scratch_buffer_t *scratch_saved = scratch
+
+#define SCRATCH_RESTORE() \
+  scratch_size = scratch_size_saved; \
+  scratch = scratch_saved;
+
       {
+        SCRATCH_SAVE();
 	const CGGlyph* glyphs = USE_PTR ? CTRunGetGlyphsPtr (run) : NULL;
 	if (!glyphs) {
 	  ALLOCATE_ARRAY (CGGlyph, glyph_buf, num_glyphs, goto resize_and_retry);
@@ -895,8 +906,10 @@ retry:
 	  info->cluster = log_clusters[string_indices[j]];
 	  info++;
 	}
+	SCRATCH_RESTORE();
       }
       {
+        SCRATCH_SAVE();
 	const CGPoint* positions = USE_PTR ? CTRunGetPositionsPtr (run) : NULL;
 	if (!positions) {
 	  ALLOCATE_ARRAY (CGPoint, position_buf, num_glyphs, goto resize_and_retry);
@@ -929,7 +942,10 @@ retry:
 	    info++;
 	  }
 	}
+	SCRATCH_RESTORE();
       }
+#undef SCRATCH_RESTORE
+#undef SCRATCH_SAVE
 #undef USE_PTR
 #undef ALLOCATE_ARRAY
 


More information about the HarfBuzz mailing list