diff options
Diffstat (limited to 'pango/pango-layout-line.c')
-rw-r--r-- | pango/pango-layout-line.c | 118 |
1 files changed, 60 insertions, 58 deletions
diff --git a/pango/pango-layout-line.c b/pango/pango-layout-line.c index 1a8d69bb..09a90955 100644 --- a/pango/pango-layout-line.c +++ b/pango/pango-layout-line.c @@ -58,43 +58,13 @@ line_data_unref (LineData *data) g_rc_box_release_full (data, (GDestroyNotify) line_data_clear); } -/* }}} */ +/* }}} */ /* {{{ PangoLayoutLine implementation */ -struct _PangoLayoutLineClass -{ - GObjectClass parent_class; -}; - -G_DEFINE_TYPE (PangoLayoutLine, pango_layout_line, G_TYPE_OBJECT) - -static void -pango_layout_line_init (PangoLayoutLine *line) -{ -} - -static void -pango_layout_line_finalize (GObject *object) -{ - PangoLayoutLine *line = PANGO_LAYOUT_LINE (object); - - g_object_unref (line->context); - - line_data_unref (line->data); - g_slist_free_full (line->runs, (GDestroyNotify)pango_glyph_item_free); +G_DEFINE_BOXED_TYPE (PangoLayoutLine, pango_layout_line, + pango_layout_line_copy, pango_layout_line_free); - G_OBJECT_CLASS (pango_layout_line_parent_class)->finalize (object); -} - -static void -pango_layout_line_class_init (PangoLayoutLineClass *class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (class); - - object_class->finalize = pango_layout_line_finalize; -} - -/* }}} */ +/* }}} */ /* {{{ Justification */ static inline void @@ -576,8 +546,7 @@ pango_layout_line_new (PangoContext *context, { PangoLayoutLine *line; - line = g_object_new (PANGO_TYPE_LAYOUT_LINE, NULL); - + line = g_new0 (PangoLayoutLine, 1); line->context = g_object_ref (context); line->data = line_data_ref (data); @@ -615,6 +584,44 @@ pango_layout_line_index_to_run (PangoLayoutLine *line, /* }}} */ /* {{{ Public API */ + +PangoLayoutLine * +pango_layout_line_copy (PangoLayoutLine *line) +{ + PangoLayoutLine *copy; + + if (line == NULL) + return NULL; + + copy = g_new0 (PangoLayoutLine, 1); + copy->context = g_object_ref (line->context); + copy->data = line_data_ref (line->data); + copy->start_index = line->start_index; + copy->length = line->length; + copy->start_offset = line->start_offset; + copy->n_chars = line->n_chars; + copy->wrapped = line->wrapped; + copy->ellipsized = line->ellipsized; + copy->hyphenated = line->hyphenated; + copy->justified = TRUE; + copy->starts_paragraph = line->starts_paragraph; + copy->ends_paragraph = line->ends_paragraph; + copy->has_extents = FALSE; + copy->direction = line->direction; + copy->runs = g_slist_copy_deep (line->runs, (GCopyFunc) pango_glyph_item_copy, NULL); + + return copy; +} + +void +pango_layout_line_free (PangoLayoutLine *line) +{ + g_object_unref (line->context); + line_data_unref (line->data); + g_slist_free_full (line->runs, (GDestroyNotify)pango_glyph_item_free); + g_free (line); +} + /* {{{ Simple getters */ /** @@ -631,7 +638,7 @@ pango_layout_line_index_to_run (PangoLayoutLine *line, GSList * pango_layout_line_get_runs (PangoLayoutLine *line) { - g_return_val_if_fail (PANGO_IS_LAYOUT_LINE (line), NULL); + g_return_val_if_fail (line != NULL, NULL); return line->runs; } @@ -657,7 +664,7 @@ pango_layout_line_get_text (PangoLayoutLine *line, int *start_index, int *length) { - g_return_val_if_fail (PANGO_IS_LAYOUT_LINE (line), NULL); + g_return_val_if_fail (line != NULL, NULL); g_return_val_if_fail (start_index != NULL, NULL); g_return_val_if_fail (length != NULL, NULL); @@ -679,7 +686,7 @@ pango_layout_line_get_text (PangoLayoutLine *line, int pango_layout_line_get_start_index (PangoLayoutLine *line) { - g_return_val_if_fail (PANGO_IS_LAYOUT_LINE (line), 0); + g_return_val_if_fail (line != NULL, 0); return line->start_index; } @@ -695,7 +702,7 @@ pango_layout_line_get_start_index (PangoLayoutLine *line) int pango_layout_line_get_length (PangoLayoutLine *line) { - g_return_val_if_fail (PANGO_IS_LAYOUT_LINE (line), 0); + g_return_val_if_fail (line != NULL, 0); return line->length; } @@ -721,7 +728,7 @@ pango_layout_line_get_log_attrs (PangoLayoutLine *line, int *start_offset, int *n_attrs) { - g_return_val_if_fail (PANGO_IS_LAYOUT_LINE (line), NULL); + g_return_val_if_fail (line != NULL, NULL); g_return_val_if_fail (start_offset != NULL, NULL); g_return_val_if_fail (n_attrs != NULL, NULL); @@ -742,7 +749,7 @@ pango_layout_line_get_log_attrs (PangoLayoutLine *line, gboolean pango_layout_line_is_wrapped (PangoLayoutLine *line) { - g_return_val_if_fail (PANGO_IS_LAYOUT_LINE (line), FALSE); + g_return_val_if_fail (line != NULL, FALSE); return line->wrapped; } @@ -758,7 +765,7 @@ pango_layout_line_is_wrapped (PangoLayoutLine *line) gboolean pango_layout_line_is_ellipsized (PangoLayoutLine *line) { - g_return_val_if_fail (PANGO_IS_LAYOUT_LINE (line), FALSE); + g_return_val_if_fail (line != NULL, FALSE); return line->ellipsized; } @@ -774,7 +781,7 @@ pango_layout_line_is_ellipsized (PangoLayoutLine *line) gboolean pango_layout_line_is_hyphenated (PangoLayoutLine *line) { - g_return_val_if_fail (PANGO_IS_LAYOUT_LINE (line), FALSE); + g_return_val_if_fail (line != NULL, FALSE); return line->hyphenated; } @@ -792,7 +799,7 @@ pango_layout_line_is_hyphenated (PangoLayoutLine *line) gboolean pango_layout_line_is_justified (PangoLayoutLine *line) { - g_return_val_if_fail (PANGO_IS_LAYOUT_LINE (line), FALSE); + g_return_val_if_fail (line != NULL, FALSE); return line->justified; } @@ -808,7 +815,7 @@ pango_layout_line_is_justified (PangoLayoutLine *line) gboolean pango_layout_line_is_paragraph_start (PangoLayoutLine *line) { - g_return_val_if_fail (PANGO_IS_LAYOUT_LINE (line), FALSE); + g_return_val_if_fail (line != NULL, FALSE); return line->starts_paragraph; } @@ -824,7 +831,7 @@ pango_layout_line_is_paragraph_start (PangoLayoutLine *line) gboolean pango_layout_line_is_paragraph_end (PangoLayoutLine *line) { - g_return_val_if_fail (PANGO_IS_LAYOUT_LINE (line), FALSE); + g_return_val_if_fail (line != NULL, FALSE); return line->ends_paragraph; } @@ -840,7 +847,7 @@ pango_layout_line_is_paragraph_end (PangoLayoutLine *line) PangoDirection pango_layout_line_get_resolved_direction (PangoLayoutLine *line) { - g_return_val_if_fail (PANGO_IS_LAYOUT_LINE (line), PANGO_DIRECTION_LTR); + g_return_val_if_fail (line != NULL, PANGO_DIRECTION_LTR); return line->direction; } @@ -871,6 +878,8 @@ pango_layout_line_justify (PangoLayoutLine *line, int remaining_width; PangoLayoutLine *copy; + g_return_val_if_fail (line != NULL, NULL); + remaining_width = width - pango_layout_line_compute_width (line); if (remaining_width <= 0) return line; @@ -888,19 +897,12 @@ pango_layout_line_justify (PangoLayoutLine *line, copy->ends_paragraph = line->ends_paragraph; copy->has_extents = FALSE; copy->direction = line->direction; - - /* Avoid a copy if we have exclusive ownership of line */ - if (G_OBJECT (line)->ref_count == 1) - { - copy->runs = line->runs; - line->runs = NULL; - } - else - copy->runs = g_slist_copy_deep (line->runs, (GCopyFunc) pango_glyph_item_copy, NULL); + copy->runs = line->runs; + line->runs = NULL; justify_words (copy, &remaining_width); - g_object_unref (line); + pango_layout_line_free (line); return copy; } |