[HarfBuzz] harfbuzz-ng: Branch 'master'

Behdad Esfahbod behdad at kemper.freedesktop.org
Thu May 17 19:39:37 PDT 2012


 TODO                    |    2 +
 src/Makefile.am         |    1 
 src/hb-cache-private.hh |   72 ++++++++++++++++++++++++++++++++++++++++++++++++
 src/hb-font.cc          |    2 +
 4 files changed, 77 insertions(+)

New commits:
commit 20fdb0f41d81b226e076a4830d4b0d03da31fc19
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu May 17 22:04:45 2012 -0400

    Add a lock-free cache type for int->int functions
    
    To be used for cmap and advance caching if desired.

diff --git a/TODO b/TODO
index 8918fd0..18d730c 100644
--- a/TODO
+++ b/TODO
@@ -91,6 +91,8 @@ Tests to write:
 
 - hb_set_t
 
+- hb_cache_t and relatives
+
 
 Optimizations:
 =============
diff --git a/src/Makefile.am b/src/Makefile.am
index fc4cb29..a50a199 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -19,6 +19,7 @@ HBSOURCES =  \
 	hb-blob.cc \
 	hb-buffer-private.hh \
 	hb-buffer.cc \
+	hb-cache-private.hh \
 	hb-common.cc \
 	hb-fallback-shape-private.hh \
 	hb-fallback-shape.cc \
diff --git a/src/hb-cache-private.hh b/src/hb-cache-private.hh
new file mode 100644
index 0000000..7394fbb
--- /dev/null
+++ b/src/hb-cache-private.hh
@@ -0,0 +1,72 @@
+/*
+ * Copyright © 2012  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_CACHE_PRIVATE_HH
+#define HB_CACHE_PRIVATE_HH
+
+#include "hb-private.hh"
+
+
+/* Implements a lock-free cache for int->int functions. */
+
+template <unsigned int key_bits, unsigned int value_bits, unsigned int cache_bits>
+struct hb_cache_t
+{
+  ASSERT_STATIC (key_bits >= cache_bits);
+  ASSERT_STATIC (key_bits + value_bits - cache_bits < 8 * sizeof (hb_atomic_int_t));
+
+  inline void clear (void)
+  {
+    memset (values, 255, sizeof (values));
+  }
+
+  inline bool get (unsigned int key, unsigned int *value)
+  {
+    unsigned int k = key & ((1<<cache_bits)-1);
+    unsigned int v = hb_atomic_int_get (values[k]);
+    if ((v >> value_bits) != (key >> cache_bits))
+      return false;
+  }
+
+  inline bool set (unsigned int key, unsigned int value)
+  {
+    if (unlikely ((key >> key_bits) || (value >> value_bits)))
+      return false; /* Overflows */
+    unsigned int k = key & ((1<<cache_bits)-1);
+    unsigned int v = ((key>>cache_bits)<<value_bits) | value;
+    hb_atomic_int_set (values[k], v);
+    return true;
+  }
+
+  private:
+  hb_atomic_int_t values[1<<cache_bits];
+};
+
+typedef hb_cache_t<21, 16, 8> hb_cmap_cache_t;
+typedef hb_cache_t<16, 24, 8> hb_advance_cache_t;
+
+
+#endif /* HB_CACHE_PRIVATE_HH */
diff --git a/src/hb-font.cc b/src/hb-font.cc
index 9800ea7..e314ad5 100644
--- a/src/hb-font.cc
+++ b/src/hb-font.cc
@@ -33,6 +33,8 @@
 #include "hb-open-file-private.hh"
 #include "hb-ot-head-table.hh"
 
+#include "hb-cache-private.hh"
+
 #include <string.h>
 
 



More information about the HarfBuzz mailing list