[pango/line-breaker: 9/18] Add PangoLines




commit 8e6dc3f2d9537df87ded238feefe440df718d688
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Jan 14 22:09:57 2022 -0500

    Add PangoLines
    
    This is an array of positioned PangoLine
    objects.

 pango/meson.build   |   1 +
 pango/pango-lines.c | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 pango/pango-lines.h |  33 ++++++++++++
 pango/pango.h       |   1 +
 4 files changed, 185 insertions(+)
---
diff --git a/pango/meson.build b/pango/meson.build
index 8efa88a7..4f9612e8 100644
--- a/pango/meson.build
+++ b/pango/meson.build
@@ -33,6 +33,7 @@ pango_sources = [
   'json/gtkjsonprinter.c',
   'pango-line.c',
   'pango-line-breaker.c',
+  'pango-lines.c',
 ]
 
 pango_headers = [
diff --git a/pango/pango-lines.c b/pango/pango-lines.c
new file mode 100644
index 00000000..6c9e5b8c
--- /dev/null
+++ b/pango/pango-lines.c
@@ -0,0 +1,150 @@
+#include "config.h"
+
+#include "pango-lines.h"
+
+/* {{{ PangoLine implementation */
+
+typedef struct _Line Line;
+struct _Line
+{
+  PangoLine *line;
+  int x, y;
+};
+
+struct _PangoLines
+{
+  GObject parent_instance;
+
+  GArray *lines;
+};
+
+struct _PangoLinesClass
+{
+  GObjectClass parent_class;
+};
+
+G_DEFINE_TYPE (PangoLines, pango_lines, G_TYPE_OBJECT)
+
+static void
+pango_lines_init (PangoLines *lines)
+{
+  lines->lines = g_array_new (FALSE, FALSE, sizeof (Line));
+}
+
+static void
+pango_lines_finalize (GObject *object)
+{
+  PangoLines *lines = PANGO_LINES (object);
+
+  for (int i = 0; i < lines->lines->len; i++)
+    {
+      Line *line = &g_array_index (lines->lines, Line, i);
+      g_object_unref (line->line);
+    }
+
+  g_array_free (lines->lines, TRUE);
+
+  G_OBJECT_CLASS (pango_lines_parent_class)->finalize (object);
+}
+
+static void
+pango_lines_class_init (PangoLinesClass *class)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (class);
+
+  object_class->finalize = pango_lines_finalize;
+}
+
+/* }}} */
+/* {{{ Public API */
+
+/**
+ * pango_lines_new:
+ *
+ * Creates an empty `PangoLines` object.
+ *
+ * Returns: a newly allocated `PangoLines`
+ */
+PangoLines *
+pango_lines_new (void)
+{
+  return g_object_new (PANGO_TYPE_LINES, NULL);
+}
+
+/**
+ * pango_lines_add_line:
+ * @lines: a `PangoLines`
+ * @line: the `PangoLine` to add
+ * @x: X coordinate of the position
+ * @y: Y coordinate of the position
+ *
+ * Adds a line to the `PangoLines`.
+ *
+ * The coordinates are the position
+ * at which @line is placed,
+ */
+void
+pango_lines_add_line (PangoLines *lines,
+                      PangoLine  *line,
+                      int         x,
+                      int         y)
+{
+  Line l;
+
+  l.line = g_object_ref (line);
+  l.x = x;
+  l.y = y;
+
+  g_array_append_val (lines->lines, l);
+}
+
+/**
+ * pango_lines_get_n_lines:
+ * @lines: a `PangoLines`
+ *
+ * Gets the number of lines in @lines.
+ *
+ * Returns: the number of lines'
+ */
+int
+pango_lines_get_n_lines (PangoLines *lines)
+{
+  return lines->lines->len;
+}
+
+/**
+ * pango_lines_get_line:
+ * @lines: a `PangoLines`
+ * @num: the position of the line to get
+ * @line: (out): return location for the `PangoLine`
+ * @x: (out): return location for the X coordinate
+ * @y: (out): return location for the Y coordinate
+ *
+ * Gets the @num-th line of @lines.
+ *
+ * Returns: `TRUE` if @line was set, `FALSE` otherwise
+ */
+gboolean
+pango_lines_get_line (PangoLines  *lines,
+                      int          num,
+                      PangoLine  **line,
+                      int         *x,
+                      int         *y)
+{
+  Line *l;
+
+  if (num >= lines->lines->len)
+    return FALSE;
+
+  l = &g_array_index (lines->lines, Line, num);
+
+  *line = l->line;
+  *x = l->x;
+  *y = l->y;
+
+  return TRUE;
+}
+
+/* }}} */
+
+/* vim:set foldmethod=marker expandtab: */
diff --git a/pango/pango-lines.h b/pango/pango-lines.h
new file mode 100644
index 00000000..3641c9c4
--- /dev/null
+++ b/pango/pango-lines.h
@@ -0,0 +1,33 @@
+#pragma once
+
+#include <glib-object.h>
+
+#include <pango/pango-types.h>
+#include <pango/pango-line.h>
+
+G_BEGIN_DECLS
+
+#define PANGO_TYPE_LINES pango_lines_get_type ()
+
+G_DECLARE_FINAL_TYPE (PangoLines, pango_lines, PANGO, LINES, GObject);
+
+PANGO_AVAILABLE_IN_ALL
+PangoLines *            pango_lines_new                 (void);
+
+PANGO_AVAILABLE_IN_ALL
+void                    pango_lines_add_line            (PangoLines  *lines,
+                                                         PangoLine   *line,
+                                                         int          x,
+                                                         int          y);
+
+PANGO_AVAILABLE_IN_ALL
+int                     pango_lines_get_n_lines         (PangoLines *lines);
+
+PANGO_AVAILABLE_IN_ALL
+gboolean                pango_lines_get_line            (PangoLines  *lines,
+                                                         int          num,
+                                                         PangoLine  **line,
+                                                         int         *x,
+                                                         int         *y);
+
+G_END_DECLS
diff --git a/pango/pango.h b/pango/pango.h
index 6c8ef805..9890d57f 100644
--- a/pango/pango.h
+++ b/pango/pango.h
@@ -44,6 +44,7 @@
 #include <pango/pango-layout.h>
 #include <pango/pango-line.h>
 #include <pango/pango-line-breaker.h>
+#include <pango/pango-lines.h>
 #include <pango/pango-matrix.h>
 #include <pango/pango-markup.h>
 #include <pango/pango-renderer.h>


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