summaryrefslogtreecommitdiff
path: root/pango/pango-ot-buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'pango/pango-ot-buffer.c')
-rw-r--r--pango/pango-ot-buffer.c44
1 files changed, 40 insertions, 4 deletions
diff --git a/pango/pango-ot-buffer.c b/pango/pango-ot-buffer.c
index c10f1fc9..7feb10f0 100644
--- a/pango/pango-ot-buffer.c
+++ b/pango/pango-ot-buffer.c
@@ -24,6 +24,44 @@
#include "pango-ot-private.h"
#include "pangofc-private.h"
+/* cache a single HB_Buffer */
+static HB_Buffer cached_buffer = NULL;
+G_LOCK_DEFINE_STATIC (cached_buffer);
+
+static HB_Buffer
+acquire_buffer (gboolean *free_buffer)
+{
+ HB_Buffer buffer;
+
+ if (G_LIKELY (G_TRYLOCK (cached_buffer)))
+ {
+ if (G_UNLIKELY (!cached_buffer))
+ hb_buffer_new (&cached_buffer);
+
+ buffer = cached_buffer;
+ *free_buffer = FALSE;
+ }
+ else
+ {
+ hb_buffer_new (&buffer);
+ *free_buffer = TRUE;
+ }
+
+ return buffer;
+}
+
+static void
+release_buffer (HB_Buffer buffer, gboolean free_buffer)
+{
+ if (G_LIKELY (!free_buffer))
+ {
+ hb_buffer_clear (buffer);
+ G_UNLOCK (cached_buffer);
+ }
+ else
+ hb_buffer_free (buffer);
+}
+
/**
* pango_ot_buffer_new
* @font: a #PangoFcFont
@@ -40,9 +78,7 @@ pango_ot_buffer_new (PangoFcFont *font)
{
PangoOTBuffer *buffer = g_slice_new (PangoOTBuffer);
- if (hb_buffer_new (&buffer->buffer) != HB_Err_Ok)
- g_warning ("Allocation of HB_Buffer failed"); /* this doesn't happen */
-
+ buffer->buffer = acquire_buffer (&buffer->should_free_hb_buffer);
buffer->font = g_object_ref (font);
buffer->applied_gpos = FALSE;
buffer->rtl = FALSE;
@@ -62,7 +98,7 @@ pango_ot_buffer_new (PangoFcFont *font)
void
pango_ot_buffer_destroy (PangoOTBuffer *buffer)
{
- hb_buffer_free (buffer->buffer);
+ release_buffer (buffer->buffer, buffer->should_free_hb_buffer);
g_object_unref (buffer->font);
g_slice_free (PangoOTBuffer, buffer);
}