[gimp] app: implement proper manual kerning, but disable it for now



commit 67ccf8c21af66b6a26acfa8cb3b381ffe07eef97
Author: Michael Natterer <mitch gimp org>
Date:   Sun Feb 28 19:40:15 2010 +0100

    app: implement proper manual kerning, but disable it for now
    
    because it breaks the invariant that the pango layout used for
    navigating in the on-canvas editor must be a 1:1 view on the text
    buffer used for editing. Will have to fix that somehow...

 app/widgets/gimptextbuffer-serialize.c |   81 ++++++++++++++++++++++++++++++++
 app/widgets/gimptextbuffer-serialize.h |   33 +++++++------
 app/widgets/gimptextbuffer.c           |    8 +++
 3 files changed, 108 insertions(+), 14 deletions(-)
---
diff --git a/app/widgets/gimptextbuffer-serialize.c b/app/widgets/gimptextbuffer-serialize.c
index 4db8ac6..c650a11 100644
--- a/app/widgets/gimptextbuffer-serialize.c
+++ b/app/widgets/gimptextbuffer-serialize.c
@@ -642,3 +642,84 @@ gimp_text_buffer_deserialize (GtkTextBuffer *register_buffer,
 
   return retval;
 }
+
+void
+gimp_text_buffer_pre_serialize (GimpTextBuffer *buffer,
+                                GtkTextBuffer  *content)
+{
+  GtkTextIter iter;
+
+  g_return_if_fail (GIMP_IS_TEXT_BUFFER (buffer));
+  g_return_if_fail (GTK_IS_TEXT_BUFFER (content));
+
+  gtk_text_buffer_get_start_iter (content, &iter);
+
+  do
+    {
+      GSList *tags = gtk_text_iter_get_tags (&iter);
+      GSList *list;
+
+      for (list = tags; list; list = g_slist_next (list))
+        {
+          GtkTextTag *tag = list->data;
+
+          if (g_list_find (buffer->spacing_tags, tag))
+            {
+              GtkTextIter end;
+
+              gtk_text_buffer_insert_with_tags (content, &iter,
+                                                "\342\200\215", -1,
+                                                tag, NULL);
+
+              end = iter;
+              gtk_text_iter_forward_char (&end);
+
+              gtk_text_buffer_remove_tag (content, tag, &iter, &end);
+              break;
+            }
+        }
+
+      g_slist_free (tags);
+    }
+  while (gtk_text_iter_forward_char (&iter));
+}
+
+void
+gimp_text_buffer_post_deserialize (GimpTextBuffer *buffer,
+                                   GtkTextBuffer  *content)
+{
+  GtkTextIter iter;
+
+  g_return_if_fail (GIMP_IS_TEXT_BUFFER (buffer));
+  g_return_if_fail (GTK_IS_TEXT_BUFFER (content));
+
+  gtk_text_buffer_get_start_iter (content, &iter);
+
+  do
+    {
+      GSList *tags = gtk_text_iter_get_tags (&iter);
+      GSList *list;
+
+      for (list = tags; list; list = g_slist_next (list))
+        {
+          GtkTextTag *tag = list->data;
+
+          if (g_list_find (buffer->spacing_tags, tag))
+            {
+              GtkTextIter end;
+
+              gtk_text_iter_forward_char (&iter);
+              gtk_text_buffer_backspace (content, &iter, FALSE, TRUE);
+
+              end = iter;
+              gtk_text_iter_forward_char (&end);
+
+              gtk_text_buffer_apply_tag (content, tag, &iter, &end);
+              break;
+            }
+        }
+
+      g_slist_free (tags);
+    }
+  while (gtk_text_iter_forward_char (&iter));
+}
diff --git a/app/widgets/gimptextbuffer-serialize.h b/app/widgets/gimptextbuffer-serialize.h
index b2857c6..05e961c 100644
--- a/app/widgets/gimptextbuffer-serialize.h
+++ b/app/widgets/gimptextbuffer-serialize.h
@@ -26,21 +26,26 @@
 #define __GIMP_TEXT_BUFFER_SERIALIZE_H__
 
 
-guint8   * gimp_text_buffer_serialize   (GtkTextBuffer     *register_buffer,
-                                         GtkTextBuffer     *content_buffer,
-                                         const GtkTextIter *start,
-                                         const GtkTextIter *end,
-                                         gsize             *length,
-                                         gpointer           user_data);
+guint8   * gimp_text_buffer_serialize        (GtkTextBuffer     *register_buffer,
+                                              GtkTextBuffer     *content_buffer,
+                                              const GtkTextIter *start,
+                                              const GtkTextIter *end,
+                                              gsize             *length,
+                                              gpointer           user_data);
+gboolean   gimp_text_buffer_deserialize      (GtkTextBuffer     *register_buffer,
+                                              GtkTextBuffer     *content_buffer,
+                                              GtkTextIter       *iter,
+                                              const guint8      *data,
+                                              gsize              length,
+                                              gboolean           create_tags,
+                                              gpointer           user_data,
+                                              GError           **error);
+
+void       gimp_text_buffer_pre_serialize    (GimpTextBuffer    *buffer,
+                                              GtkTextBuffer     *content);
+void       gimp_text_buffer_post_deserialize (GimpTextBuffer    *buffer,
+                                              GtkTextBuffer     *content);
 
-gboolean   gimp_text_buffer_deserialize (GtkTextBuffer     *register_buffer,
-                                         GtkTextBuffer     *content_buffer,
-                                         GtkTextIter       *iter,
-                                         const guint8      *data,
-                                         gsize              length,
-                                         gboolean           create_tags,
-                                         gpointer           user_data,
-                                         GError           **error);
 
 
 #endif /* __GIMP_TEXT_BUFFER_SERIALIZE_H__ */
diff --git a/app/widgets/gimptextbuffer.c b/app/widgets/gimptextbuffer.c
index 402587f..cab2399 100644
--- a/app/widgets/gimptextbuffer.c
+++ b/app/widgets/gimptextbuffer.c
@@ -242,6 +242,10 @@ gimp_text_buffer_set_markup (GimpTextBuffer *buffer,
         {
           GtkTextIter start, end;
 
+#if 0
+          gimp_text_buffer_post_deserialize (buffer, content);
+#endif
+
           gtk_text_buffer_get_bounds (content, &start, &end);
           gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (buffer), &insert);
 
@@ -273,6 +277,10 @@ gimp_text_buffer_get_markup (GimpTextBuffer *buffer)
 
   gtk_text_buffer_insert_range (content, &insert, &start, &end);
 
+#if 0
+  gimp_text_buffer_pre_serialize (buffer, content);
+#endif
+
   gtk_text_buffer_get_bounds (content, &start, &end);
 
   markup = (gchar *) gtk_text_buffer_serialize (GTK_TEXT_BUFFER (buffer),



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