[pango] [pango] Allocate PangoScriptIter on stack.



commit 698203ab28bc679c2e62a2452a79d5785fd46ca7
Author: Chris Wilson <chris chris-wilson co uk>
Date:   Wed Mar 18 13:02:13 2009 +0000

    [pango] Allocate PangoScriptIter on stack.
    
    Move the PangoScriptIter structure definition to a private header file,
    so that we can embed the iterator within other structures or allocate
    a local iterator on the stack. This eliminates the frequent short-lived
    allocations associated with the iterator.
---
 pango/Makefile.am            |    1 +
 pango/break.c                |   13 ++++---
 pango/pango-context.c        |   13 ++++---
 pango/pango-script-private.h |   56 +++++++++++++++++++++++++++++++++
 pango/pango-script.c         |   70 ++++++++++++++++++------------------------
 5 files changed, 101 insertions(+), 52 deletions(-)

diff --git a/pango/Makefile.am b/pango/Makefile.am
index fff14df..c5153ae 100644
--- a/pango/Makefile.am
+++ b/pango/Makefile.am
@@ -92,6 +92,7 @@ libpango_1_0_la_SOURCES =			\
 	pango-renderer.c			\
 	pango-script.c				\
 	pango-script-lang-table.h		\
+	pango-script-private.h				\
 	pango-tabs.c				\
 	pango-utils.c				\
 	reorder-items.c				\
diff --git a/pango/break.c b/pango/break.c
index db3053a..fa49b3f 100644
--- a/pango/break.c
+++ b/pango/break.c
@@ -23,6 +23,7 @@
 
 #include "pango-break.h"
 #include "pango-modules.h"
+#include "pango-script-private.h"
 #include <string.h>
 
 #define PARAGRAPH_SEPARATOR 0x2029
@@ -1864,7 +1865,7 @@ pango_get_log_attrs (const char    *text,
   static guint engine_type_id = 0;
   static guint render_type_id = 0;
   PangoAnalysis analysis = { NULL };
-  PangoScriptIter *iter;
+  PangoScriptIter iter;
 
   g_return_if_fail (length == 0 || text != NULL);
   g_return_if_fail (log_attrs != NULL);
@@ -1883,17 +1884,17 @@ pango_get_log_attrs (const char    *text,
 
   chars_broken = 0;
 
-  iter = pango_script_iter_new (text, length);
-  pango_script_iter_get_range (iter, &range_start, &range_end, &script);
+  _pango_script_iter_init (&iter, text, length);
+  pango_script_iter_get_range (&iter, &range_start, &range_end, &script);
   range_engine = (PangoEngineLang*) pango_map_get_engine (lang_map, script);
   g_assert (range_start == text);
 
-  while (pango_script_iter_next (iter))
+  while (pango_script_iter_next (&iter))
     {
       const char *run_start, *run_end;
       PangoEngineLang* run_engine;
 
-      pango_script_iter_get_range (iter, &run_start, &run_end, &script);
+      pango_script_iter_get_range (&iter, &run_start, &run_end, &script);
       run_engine = (PangoEngineLang*) pango_map_get_engine (lang_map, script);
       g_assert (range_end == run_start);
 
@@ -1909,7 +1910,7 @@ pango_get_log_attrs (const char    *text,
 	}
       range_end = run_end;
     }
-  pango_script_iter_free (iter);
+  _pango_script_iter_fini (&iter);
 
   g_assert (length < 0 || range_end == text + length);
 
diff --git a/pango/pango-context.c b/pango/pango-context.c
index 9285581..6c40a29 100644
--- a/pango/pango-context.c
+++ b/pango/pango-context.c
@@ -29,6 +29,7 @@
 #include "pango-engine.h"
 #include "pango-engine-private.h"
 #include "pango-modules.h"
+#include "pango-script-private.h"
 
 struct _PangoContext
 {
@@ -685,7 +686,7 @@ struct _ItemizeState
 
   ChangedFlags changed;
 
-  PangoScriptIter *script_iter;
+  PangoScriptIter script_iter;
   const char *script_end;
   PangoScript script;
 
@@ -850,8 +851,8 @@ itemize_state_init (ItemizeState      *state,
 
   /* Initialize the script iterator
    */
-  state->script_iter = pango_script_iter_new (text + start_index, length);
-  pango_script_iter_get_range (state->script_iter, NULL,
+  _pango_script_iter_init (&state->script_iter, text + start_index, length);
+  pango_script_iter_get_range (&state->script_iter, NULL,
 			       &state->script_end, &state->script);
 
   update_end (state);
@@ -899,8 +900,8 @@ itemize_state_next (ItemizeState *state)
 
   if (state->run_end == state->script_end)
     {
-      pango_script_iter_next (state->script_iter);
-      pango_script_iter_get_range (state->script_iter, NULL,
+      pango_script_iter_next (&state->script_iter);
+      pango_script_iter_get_range (&state->script_iter, NULL,
 				   &state->script_end, &state->script);
       state->changed |= SCRIPT_CHANGED;
     }
@@ -1410,7 +1411,7 @@ itemize_state_finish (ItemizeState *state)
   g_free (state->embedding_levels);
   if (state->free_attr_iter)
     pango_attr_iterator_destroy (state->attr_iter);
-  pango_script_iter_free (state->script_iter);
+  _pango_script_iter_fini (&state->script_iter);
   pango_font_description_free (state->font_desc);
 
   itemize_state_reset_shape_engines (state);
diff --git a/pango/pango-script-private.h b/pango/pango-script-private.h
new file mode 100644
index 0000000..b77209c
--- /dev/null
+++ b/pango/pango-script-private.h
@@ -0,0 +1,56 @@
+/* Pango
+ * pango-script-private.h: Script tag handling, private definitions
+ *
+ * Copyright (C) 2002 Red Hat Software
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __PANGO_SCRIPT_PRIVATE_H__
+#define __PANGO_SCRIPT_PRIVATE_H__
+
+#define PAREN_STACK_DEPTH 128
+
+typedef struct _ParenStackEntry ParenStackEntry;
+
+struct _ParenStackEntry
+{
+  int pair_index;
+  PangoScript script_code;
+};
+
+struct _PangoScriptIter
+{
+  const gchar *text_start;
+  const gchar *text_end;
+
+  const gchar *script_start;
+  const gchar *script_end;
+  PangoScript script_code;
+
+  ParenStackEntry paren_stack[PAREN_STACK_DEPTH];
+  int paren_sp;
+};
+
+PangoScriptIter *
+_pango_script_iter_init (PangoScriptIter *iter,
+	                 const char      *text,
+			 int              length);
+
+void
+_pango_script_iter_fini (PangoScriptIter *iter);
+
+#endif /* __PANGO_SCRIPT_PRIVATE_H__ */
diff --git a/pango/pango-script.c b/pango/pango-script.c
index 862c847..605e46e 100644
--- a/pango/pango-script.c
+++ b/pango/pango-script.c
@@ -58,29 +58,7 @@
 #include <string.h>
 
 #include "pango-script.h"
-
-#define PAREN_STACK_DEPTH 128
-
-typedef struct _ParenStackEntry ParenStackEntry;
-
-struct _ParenStackEntry
-{
-  int pair_index;
-  PangoScript script_code;
-};
-
-struct _PangoScriptIter
-{
-  const gchar *text_start;
-  const gchar *text_end;
-
-  const gchar *script_start;
-  const gchar *script_end;
-  PangoScript script_code;
-
-  ParenStackEntry paren_stack[PAREN_STACK_DEPTH];
-  int paren_sp;
-};
+#include "pango-script-private.h"
 
 /**
  * pango_script_for_unichar:
@@ -106,6 +84,28 @@ pango_script_for_unichar (gunichar ch)
 
 /**********************************************************************/
 
+PangoScriptIter *
+_pango_script_iter_init (PangoScriptIter *iter,
+	                 const char      *text,
+			 int              length)
+{
+  iter->text_start = text;
+  if (length >= 0)
+    iter->text_end = text + length;
+  else
+    iter->text_end = text + strlen (text);
+
+  iter->script_start = text;
+  iter->script_end = text;
+  iter->script_code = PANGO_SCRIPT_COMMON;
+
+  iter->paren_sp = -1;
+
+  pango_script_iter_next (iter);
+
+  return iter;
+}
+
 /**
  * pango_script_iter_new:
  * @text: a UTF-8 string
@@ -114,7 +114,7 @@ pango_script_for_unichar (gunichar ch)
  * Create a new #PangoScriptIter, used to break a string of
  * Unicode into runs by text. No copy is made of @text, so
  * the caller needs to make sure it remains valid until
- * the iterator is freed with pango_script_iter_free ().x
+ * the iterator is freed with pango_script_iter_free().
  *
  * Return value: the new script iterator, initialized
  *  to point at the first range in the text, which should be
@@ -127,23 +127,12 @@ PangoScriptIter *
 pango_script_iter_new (const char *text,
 		       int         length)
 {
-  PangoScriptIter *iter = g_slice_new (PangoScriptIter);
-
-  iter->text_start = text;
-  if (length >= 0)
-    iter->text_end = text + length;
-  else
-    iter->text_end = text + strlen (text);
-
-  iter->script_start = text;
-  iter->script_end = text;
-  iter->script_code = PANGO_SCRIPT_COMMON;
-
-  iter->paren_sp = -1;
-
-  pango_script_iter_next (iter);
+  return _pango_script_iter_init (g_slice_new (PangoScriptIter), text, length);
+}
 
-  return iter;
+void
+_pango_script_iter_fini (PangoScriptIter *iter)
+{
 }
 
 /**
@@ -157,6 +146,7 @@ pango_script_iter_new (const char *text,
 void
 pango_script_iter_free (PangoScriptIter *iter)
 {
+  _pango_script_iter_fini (iter);
   g_slice_free (PangoScriptIter, iter);
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]