[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