diff options
Diffstat (limited to 'pango/pango-simple-layout.c')
-rw-r--r-- | pango/pango-simple-layout.c | 1554 |
1 files changed, 0 insertions, 1554 deletions
diff --git a/pango/pango-simple-layout.c b/pango/pango-simple-layout.c deleted file mode 100644 index adddd2fb..00000000 --- a/pango/pango-simple-layout.c +++ /dev/null @@ -1,1554 +0,0 @@ -#include "config.h" - -#include "pango-simple-layout.h" -#include "pango-line-breaker.h" -#include "pango-lines.h" -#include "pango-line-private.h" -#include "pango-enum-types.h" -#include "pango-markup.h" - -/* {{{ PangoSimpleLayout implementation */ - -struct _PangoSimpleLayout -{ - GObject parent_instance; - - PangoContext *context; - char *text; - int length; - PangoAttrList *attrs; - PangoFontDescription *font_desc; - float line_spacing; - int width; - int height; - PangoTabArray *tabs; - gboolean single_paragraph; - PangoWrapMode wrap; - int indent; - guint serial; - guint context_serial; - PangoAlignmentMode alignment; - PangoEllipsizeMode ellipsize; - gboolean auto_dir; - - PangoLines *lines; -}; - -struct _PangoSimpleLayoutClass -{ - GObjectClass parent_class; -}; - -enum -{ - PROP_CONTEXT = 1, - PROP_TEXT, - PROP_ATTRIBUTES, - PROP_FONT_DESCRIPTION, - PROP_LINE_SPACING, - PROP_WIDTH, - PROP_HEIGHT, - PROP_TABS, - PROP_SINGLE_PARAGRAPH, - PROP_WRAP, - PROP_INDENT, - PROP_ALIGNMENT, - PROP_ELLIPSIZE, - PROP_AUTO_DIR, - PROP_LINES, - NUM_PROPERTIES -}; - -static GParamSpec *props[NUM_PROPERTIES] = { NULL, }; - -G_DEFINE_TYPE (PangoSimpleLayout, pango_simple_layout, G_TYPE_OBJECT) - -static void -pango_simple_layout_init (PangoSimpleLayout *layout) -{ - layout->serial = 1; - layout->width = -1; - layout->height = -1; - layout->indent = 0; - layout->single_paragraph = FALSE; - layout->wrap = PANGO_WRAP_WORD; - layout->alignment = PANGO_ALIGNMENT_LEFT; - layout->ellipsize = PANGO_ELLIPSIZE_NONE; - layout->line_spacing = 0.0; - layout->auto_dir = TRUE; - layout->text = g_strdup (""); - layout->length = 0; -} - -static void -pango_simple_layout_finalize (GObject *object) -{ - PangoSimpleLayout *layout = PANGO_SIMPLE_LAYOUT (object); - - if (layout->font_desc) - pango_font_description_free (layout->font_desc); - g_object_unref (layout->context); - g_free (layout->text); - g_clear_pointer (&layout->attrs, pango_attr_list_unref); - g_clear_pointer (&layout->tabs, pango_tab_array_free); - g_clear_object (&layout->lines); - - G_OBJECT_CLASS (pango_simple_layout_parent_class)->finalize (object); -} - -static void -pango_simple_layout_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - PangoSimpleLayout *layout = PANGO_SIMPLE_LAYOUT (object); - - switch (prop_id) - { - case PROP_CONTEXT: - layout->context = g_value_dup_object (value); - layout->context_serial = pango_context_get_serial (layout->context); - break; - - case PROP_TEXT: - pango_simple_layout_set_text (layout, g_value_get_string (value), -1); - break; - - case PROP_ATTRIBUTES: - pango_simple_layout_set_attributes (layout, g_value_get_boxed (value)); - break; - - case PROP_FONT_DESCRIPTION: - pango_simple_layout_set_font_description (layout, g_value_get_boxed (value)); - break; - - case PROP_LINE_SPACING: - pango_simple_layout_set_line_spacing (layout, g_value_get_float (value)); - break; - - case PROP_WIDTH: - pango_simple_layout_set_width (layout, g_value_get_int (value)); - break; - - case PROP_HEIGHT: - pango_simple_layout_set_height (layout, g_value_get_int (value)); - break; - - case PROP_TABS: - pango_simple_layout_set_tabs (layout, g_value_get_boxed (value)); - break; - - case PROP_SINGLE_PARAGRAPH: - pango_simple_layout_set_single_paragraph (layout, g_value_get_boolean (value)); - break; - - case PROP_WRAP: - pango_simple_layout_set_wrap (layout, g_value_get_enum (value)); - break; - - case PROP_INDENT: - pango_simple_layout_set_indent (layout, g_value_get_int (value)); - break; - - case PROP_ALIGNMENT: - pango_simple_layout_set_alignment (layout, g_value_get_enum (value)); - break; - - case PROP_ELLIPSIZE: - pango_simple_layout_set_ellipsize (layout, g_value_get_enum (value)); - break; - - case PROP_AUTO_DIR: - pango_simple_layout_set_auto_dir (layout, g_value_get_boolean (value)); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -pango_simple_layout_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - PangoSimpleLayout *layout = PANGO_SIMPLE_LAYOUT (object); - - switch (prop_id) - { - case PROP_CONTEXT: - g_value_set_object (value, layout->context); - break; - - case PROP_TEXT: - g_value_set_string (value, layout->text); - break; - - case PROP_ATTRIBUTES: - g_value_set_boxed (value, layout->attrs); - break; - - case PROP_FONT_DESCRIPTION: - g_value_set_boxed (value, layout->font_desc); - break; - - case PROP_LINE_SPACING: - g_value_set_float (value, layout->line_spacing); - break; - - case PROP_WIDTH: - g_value_set_int (value, layout->width); - break; - - case PROP_HEIGHT: - g_value_set_int (value, layout->height); - break; - - case PROP_TABS: - g_value_set_boxed (value, layout->tabs); - break; - - case PROP_SINGLE_PARAGRAPH: - g_value_set_boolean (value, layout->single_paragraph); - break; - - case PROP_WRAP: - g_value_set_enum (value, layout->wrap); - break; - - case PROP_INDENT: - g_value_set_int (value, layout->indent); - break; - - case PROP_ALIGNMENT: - g_value_set_enum (value, layout->alignment); - break; - - case PROP_ELLIPSIZE: - g_value_set_enum (value, layout->ellipsize); - break; - - case PROP_AUTO_DIR: - g_value_set_boolean (value, layout->auto_dir); - break; - - case PROP_LINES: - g_value_set_object (value, pango_simple_layout_get_lines (layout)); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -pango_simple_layout_class_init (PangoSimpleLayoutClass *class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (class); - - object_class->finalize = pango_simple_layout_finalize; - object_class->set_property = pango_simple_layout_set_property; - object_class->get_property = pango_simple_layout_get_property; - - /** - * PangoSimpleLayout:context: (attributes org.gtk.Property.get=pango_simple_layout_get_context) - * - * The context for the `PangoSimpleLayout`. - */ - props[PROP_CONTEXT] = g_param_spec_object ("context", "context", "context", - PANGO_TYPE_CONTEXT, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); - - /** - * PangoSimpleLayout:text: (attributes org.gtk.Property.get=pango_simple_layout_get_text org.gtk.Property.set=pango_simple_layout_set_text) - * - * The text of the `PangoSimpleLayout`. - */ - props[PROP_TEXT] = g_param_spec_string ("text", "text", "text", - "", - G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY); - - /** - * PangoSimpleLayout:attributes: (attributes org.gtk.Property.get=pango_simple_layout_get_attributes org.gtk.Property.set=pango_simple_layout_set_attributes) - * - * The attributes of the `PangoSimpleLayout`. - * - * Attributes can affect how the text is formatted. - */ - props[PROP_ATTRIBUTES] = g_param_spec_boxed ("attributes", "attributes", "attributes", - PANGO_TYPE_ATTR_LIST, - G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY); - - /** - * PangoSimpleLayout:font-description: (attributes org.gtk.Property.get=pango_simple_layout_get_font_description org.gtk.Property.set=pango_simple_layout_set_font_description) - * - * The font description of the `PangoSimpleLayout`. - */ - props[PROP_FONT_DESCRIPTION] = g_param_spec_boxed ("font-description", "font-description", "font-description", - PANGO_TYPE_FONT_DESCRIPTION, - G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY); - - /** - * PangoSimpleLayout:line-spacing: (attributes org.gtk.Property.get=pango_simple_layout_get_line_spacing org.gtk.Property.set=pango_simple_layout_set_line_spacing) - * - * The line spacing factor of the `PangoSimpleLayout`. - */ - props[PROP_LINE_SPACING] = g_param_spec_float ("line-spacing", "line-spacing", "line-spacing", - 0., G_MAXFLOAT, 0., - G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY); - - /** - * PangoSimpleLayout:width: (attributes org.gtk.Property.get=pango_simple_layout_get_width org.gtk.Property.set=pango_simple_layout_set_width) - * - * The width to which the text of `PangoSimpleLayout` will be broken. - * - * The width is specified in Pango units, with -1 meaning unlimited. - * - * The default value is -1. - */ - props[PROP_WIDTH] = g_param_spec_int ("width", "width", "width", - -1, G_MAXINT, -1, - G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY); - - /** - * PangoSimpleLayout:height: (attributes org.gtk.Property.get=pango_simple_layout_get_height org.gtk.Property.set=pango_simple_layout_set_height) - * - * The height to which the `PangoSimpleLayout` will be ellipsized. - * - * If @height is positive, it will be the maximum height of the - * layout. Only lines would be shown that would fit, and if there - * is any text omitted, an ellipsis added. At least one line is - * included in each paragraph regardless of how small the height - * value is. A value of zero will render exactly one line for the - * entire layout. - * - * If @height is negative, it will be the (negative of) maximum - * number of lines per paragraph. That is, the total number of lines - * shown may well be more than this value if the layout contains - * multiple paragraphs of text. - * - * The default value of -1 means that the first line of each - * paragraph is ellipsized. - * - * Height setting only has effect if a positive width is set on the - * layout and its ellipsization mode is not `PANGO_ELLIPSIZE_NONE`. - * The behavior is undefined if a height other than -1 is set and - * ellipsization mode is set to `PANGO_ELLIPSIZE_NONE`. - * - * The default value is -1. - */ - props[PROP_HEIGHT] = g_param_spec_int ("height", "height", "height", - -G_MAXINT, G_MAXINT, -1, - G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY); - - /** - * PangoSimpleLayout:tabs: (attributes org.gtk.Property.get=pango_simple_layout_get_tabs org.gtk.Property.set=pango_simple_layout_set_tabs) - * - * The tabs to use when formatting the text of `PangoSimpleLayout`. - * - * `PangoLayout` will place content at the next tab position - * whenever it meets a Tab character (U+0009). - */ - props[PROP_TABS] = g_param_spec_boxed ("tabs", "tabs", "tabs", - PANGO_TYPE_TAB_ARRAY, - G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY); - - /** - * PangoSimpleLayout:single-paragraph: (attributes org.gtk.Property.get=pango_simple_layout_get_single_paragraph org.gtk.Property.set=pango_simple_layout_set_single_paragraph) - * - * Whether to treat newlines and similar characters as paragraph - * separators or not. If this property is `TRUE`, all text is kept - * in a single paragraph, and paragraph separator characters are - * displayed with a glyph. - * - * This is useful to allow editing of newlines on a single text line. - * - * The default value is `FALSE`. - */ - props[PROP_SINGLE_PARAGRAPH] = g_param_spec_boolean ("single-paragraph", "single-paragraph", "single-paragraph", - FALSE, - G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY); - - /** - * PangoSimpleLayout:wrap: (attributes org.gtk.Property.get=pango_simple_layout_get_wrap org.gtk.Property.set=pango_simple_layout_set_wrap) - * - * The wrap mode of this `PangoSimpleLayout. - * - * The wrap mode influences how Pango chooses line breaks - * when text needs to be wrapped. - * - * The default value is `PANGO_WRAP_WORD`. - */ - props[PROP_WRAP] = g_param_spec_enum ("wrap", "wrap", "wrap", - PANGO_TYPE_WRAP_MODE, - PANGO_WRAP_WORD, - G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY); - - /** - * PangoSimpleLayout:indent: (attributes org.gtk.Property.get=pango_simple_layout_get_indent org.gtk.Property.set=pango_simple_layout_set_indent) - * - * The indent of this `PangoSimpleLayout. - * - * The indent is specified in Pango units. - * - * A negative value of @indent will produce a hanging indentation. - * That is, the first line will have the full width, and subsequent - * lines will be indented by the absolute value of @indent. - * - * The default value is 0. - */ - props[PROP_INDENT] = g_param_spec_int ("indent", "indent", "indent", - G_MININT, G_MAXINT, 0, - G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY); - - /** - * PangoSimpleLayout:alignment: (attributes org.gtk.Property.get=pango_simple_layout_get_alignment org.gtk.Property.set=pango_simple_layout_set_alignment) - * - * The alignment mode of this `PangoSimpleLayout. - * - * The default value is `PANGO_ALIGNMENT_LEFT`. - */ - props[PROP_ALIGNMENT] = g_param_spec_enum ("alignment", "alignment", "alignment", - PANGO_TYPE_ALIGNMENT_MODE, - PANGO_ALIGNMENT_LEFT, - G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY); - - /** - * PangoSimpleLayout:ellipsize: (attributes org.gtk.Property.get=pango_simple_layout_get_ellipsize org.gtk.Property.set=pango_simple_layout_set_ellipsize) - * - * The ellipsization mode of this `PangoSimpleLayout. - * - * The default value is `PANGO_ELLIPSIZE_NONE`. - */ - props[PROP_ELLIPSIZE] = g_param_spec_enum ("ellipsize", "ellipsize", "ellipsize", - PANGO_TYPE_ELLIPSIZE_MODE, - PANGO_ELLIPSIZE_NONE, - G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY); - - /** - * PangoSimpleLayout:auto-dir: (attributes org.gtk.Property.get=pango_simple_layout_get_auto_dir org.gtk.Property.set=pango_simple_layout_set_auto_dir) - * - * Whether this `PangoSimpleLayout` determines the - * base direction from the content. - * - * The default value is `TRUE`. - */ - props[PROP_AUTO_DIR] = g_param_spec_boolean ("auto-dir", "auto-dir", "auto-dir", - TRUE, - G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY); - - /** - * PangoSimpleLayout:lines: (attributes org.gtk.Property.get=pango_simple_layout_get_lines) - * - * The `PangoLines` object holding the formatted lines. - */ - props[PROP_LINES] = g_param_spec_object ("lines", "lines", "lines", - PANGO_TYPE_LINES, - G_PARAM_READABLE); - - g_object_class_install_properties (object_class, NUM_PROPERTIES, props); -} - -/* }}} */ -/* {{{ Utilities */ - -static void -layout_changed (PangoSimpleLayout *layout) -{ - layout->serial++; - if (layout->serial == 0) - layout->serial++; - - g_clear_object (&layout->lines); - g_object_notify_by_pspec (G_OBJECT (layout), props[PROP_LINES]); -} - -static void -check_context_changed (PangoSimpleLayout *layout) -{ - guint old_serial = layout->context_serial; - - layout->context_serial = pango_context_get_serial (layout->context); - - if (old_serial != layout->context_serial) - layout_changed (layout); -} - -static PangoAttrList * -ensure_attrs (PangoSimpleLayout *layout, - PangoAttrList *attrs) -{ - if (attrs) - return attrs; - else if (layout->attrs) - return pango_attr_list_copy (layout->attrs); - else - return pango_attr_list_new (); -} - -static PangoAttrList * -get_effective_attributes (PangoSimpleLayout *layout) -{ - PangoAttrList *attrs = NULL; - - if (layout->font_desc) - { - attrs = ensure_attrs (layout, attrs); - pango_attr_list_insert_before (attrs, - pango_attr_font_desc_new (layout->font_desc)); - } - - if (layout->line_spacing != 0.0) - { - attrs = ensure_attrs (layout, attrs); - pango_attr_list_insert_before (attrs, - pango_attr_line_height_new (layout->line_spacing)); - } - - if (layout->single_paragraph) - { - attrs = ensure_attrs (layout, attrs); - pango_attr_list_insert_before (attrs, - pango_attr_paragraph_new ()); - } - - if (attrs) - return attrs; - - return pango_attr_list_ref (layout->attrs); -} - -static gboolean -ends_with_paragraph_separator (PangoSimpleLayout *layout) -{ - if (layout->single_paragraph) - return FALSE; - - return g_str_has_suffix (layout->text, "\n") || - g_str_has_suffix (layout->text, "\r") || - g_str_has_suffix (layout->text, "\r\n") || - g_str_has_suffix (layout->text, "
"); -} - -static void -ensure_lines (PangoSimpleLayout *layout) -{ - PangoLineBreaker *breaker; - PangoAttrList *attrs; - int x, y, width; - int line_no; - - check_context_changed (layout); - - if (layout->lines) - return; - - breaker = pango_line_breaker_new (layout->context); - - pango_line_breaker_set_tabs (breaker, layout->tabs); - pango_line_breaker_set_base_dir (breaker, - layout->auto_dir - ? PANGO_DIRECTION_NEUTRAL - : pango_context_get_base_dir (layout->context)); - - attrs = get_effective_attributes (layout); - pango_line_breaker_add_text (breaker, layout->text ? layout->text : "", -1, attrs); - if (attrs) - pango_attr_list_unref (attrs); - - layout->lines = pango_lines_new (); - - x = y = 0; - line_no = 0; - while (!pango_line_breaker_done (breaker)) - { - PangoLine *line; - PangoRectangle ext; - int offset; - PangoEllipsizeMode ellipsize = PANGO_ELLIPSIZE_NONE; - - if ((line_no == 0) == (layout->indent > 0)) - { - x = abs (layout->indent); - width = layout->width - x; - } - else - { - x = 0; - width = layout->width; - } - - if (layout->height < 0 && line_no + 1 == - layout->height) - ellipsize = layout->ellipsize; - -retry: - line = pango_line_breaker_next_line (breaker, x, width, layout->wrap, ellipsize); - pango_line_get_extents (line, NULL, &ext); - - if (layout->height >= 0 && y + 2 * ext.height >= layout->height && - ellipsize != layout->ellipsize) - { - if (pango_line_breaker_undo_line (breaker, line)) - { - g_clear_object (&line); - ellipsize = layout->ellipsize; - goto retry; - } - } - - /* Handle alignment and justification */ - offset = 0; - switch (layout->alignment) - { - case PANGO_ALIGNMENT_LEFT: - break; - case PANGO_ALIGNMENT_CENTER: - if (ext.width < width) - offset = (width - ext.width) / 2; - break; - case PANGO_ALIGNMENT_RIGHT: - if (ext.width < width) - offset = width - ext.width; - break; - case PANGO_ALIGNMENT_JUSTIFY: - if (!pango_line_ends_paragraph (line)) - line = pango_line_justify (line, width); - break; - case PANGO_ALIGNMENT_JUSTIFY_ALL: - line = pango_line_justify (line, width); - break; - default: g_assert_not_reached (); - } - - pango_lines_add_line (layout->lines, line, x + offset, y - ext.y); - - y += ext.height; - line_no++; - } - - /* Append an empty line if we end with a newline. - * And always provide at least one line - */ - if (pango_lines_get_line_count (layout->lines) == 0 || - ends_with_paragraph_separator (layout)) - { - LineData *data; - int start_index; - int start_offset; - int offset; - PangoLine *line; - PangoRectangle ext; - - if (pango_lines_get_line_count (layout->lines) > 0) - { - PangoLine *last; - - last = pango_lines_get_line (layout->lines, - pango_lines_get_line_count (layout->lines) - 1, - NULL, NULL); - data = last->data; - start_index = data->length; - start_offset = last->data->n_chars; - offset = MAX (layout->indent, 0); - } - else - { - data = line_data_new (); - data->text = g_strdup (""); - data->length = 0; - data->attrs = get_effective_attributes (layout); - data->log_attrs = g_new0 (PangoLogAttr, 1); - data->log_attrs[0].is_cursor_position = TRUE; - start_index = 0; - start_offset = 0; - offset = 0; - } - - line = pango_line_new (layout->context, data); - line->starts_paragraph = TRUE; - line->ends_paragraph = TRUE; - line->start_index = start_index; - line->length = 0; - line->start_offset = start_offset; - line->n_chars = 0; - - pango_line_get_extents (line, NULL, &ext); - - pango_lines_add_line (layout->lines, line, x + offset, y - ext.y); - - line_data_unref (data); - } - - g_object_unref (breaker); -} - -/* }}} */ -/* {{{ Public API */ - -/** - * pango_simple_layout_new: - * @context: a `PangoContext` - * - * Creates a new `PangoSimpleLayout` with attribute initialized to - * default values for a particular `PangoContext` - * - * Return value: a newly allocated `PangoLayout` - */ -PangoSimpleLayout * -pango_simple_layout_new (PangoContext *context) -{ - g_return_val_if_fail (context != NULL, NULL); - - return g_object_new (PANGO_TYPE_SIMPLE_LAYOUT, "context", context, NULL); -} - -/** - * pango_simple_layout_copy: - * @layout: a `PangoSimpleLayout` - * - * Creates a deep copy-by-value of the layout. - * - * The attribute list, tab array, and text from the original layout - * are all copied by value. - * - * Return value: (transfer full): the newly allocated `PangoSimpleLayout` - */ -PangoSimpleLayout * -pango_simple_layout_copy (PangoSimpleLayout *layout) -{ - PangoSimpleLayout *copy; - - g_return_val_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout), NULL); - - copy = pango_simple_layout_new (layout->context); - - copy->text = g_strdup (layout->text); - copy->length = layout->length; - if (layout->attrs) - copy->attrs = pango_attr_list_copy (layout->attrs); - if (layout->font_desc) - copy->font_desc = pango_font_description_copy (layout->font_desc); - copy->line_spacing = layout->line_spacing; - copy->width = layout->width; - copy->height = layout->height; - if (layout->tabs) - copy->tabs = pango_tab_array_copy (layout->tabs); - copy->wrap = layout->wrap; - copy->indent = layout->indent; - copy->serial = layout->serial; - copy->context_serial = layout->context_serial; - copy->alignment = layout->alignment; - copy->ellipsize = layout->ellipsize; - copy->auto_dir = layout->auto_dir; - - return copy; -} - -/** - * pango_simple_layout_get_serial: - * @layout: a `PangoSimpleLayout` - * - * Returns the current serial number of @layout. - * - * The serial number is initialized to an small number larger than zero - * when a new layout is created and is increased whenever the layout is - * changed using any of the setter functions, or the `PangoContext` it - * uses has changed. - * - * The serial may wrap, but will never have the value 0. Since it can - * wrap, never compare it with "less than", always use "not equals". - * - * This can be used to automatically detect changes to a `PangoSimpleLayout`, - * and is useful for example to decide whether a layout needs redrawing. - * - * Return value: The current serial number of @layout - */ -guint -pango_simple_layout_get_serial (PangoSimpleLayout *layout) -{ - check_context_changed (layout); - - return layout->serial; -} - -/* {{{ Property getters and setters */ - -/** - * pango_simple_layout_get_context: - * @layout: a `PangoSimpleLayout` - * - * Retrieves the `PangoContext` used for this layout. - * - * Return value: (transfer none): the `PangoContext` for the layout - */ -PangoContext * -pango_simple_layout_get_context (PangoSimpleLayout *layout) -{ - g_return_val_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout), NULL); - - return layout->context; -} - -/** - * pango_simple_layout_set_text: - * @layout: a `PangoSimpleLayout` - * @text: the text - * @length: maximum length of @text, in bytes. -1 indicates that - * the string is nul-terminated - * - * Sets the text of the layout. - */ -void -pango_simple_layout_set_text (PangoSimpleLayout *layout, - const char *text, - int length) -{ - g_return_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout)); - - if (length < 0) - length = strlen (text); - - g_free (layout->text); - layout->text = g_strndup (text, length); - layout->length = length; - - g_object_notify_by_pspec (G_OBJECT (layout), props[PROP_TEXT]); - layout_changed (layout); -} - -/** - * pango_simple_layout_get_text: - * @layout: a `PangoSimpleLayout` - * - * Gets the text in the layout. - * - * The returned text should not be freed or modified. - * - * Return value: (transfer none): the text in the @layout - */ -const char * -pango_simple_layout_get_text (PangoSimpleLayout *layout) -{ - g_return_val_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout), NULL); - - return layout->text; -} - -/** - * pango_simple_layout_set_attributes: - * @layout: a `PangoSimpleLayout` - * @attrs: (nullable) (transfer none): a `PangoAttrList` - * - * Sets the attributes for a layout object. - * - * References @attrs, so the caller can unref its reference. - */ -void -pango_simple_layout_set_attributes (PangoSimpleLayout *layout, - PangoAttrList *attrs) -{ - g_return_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout)); - - g_clear_pointer (&layout->attrs, pango_attr_list_unref); - layout->attrs = attrs; - if (layout->attrs) - pango_attr_list_ref (layout->attrs); - - g_object_notify_by_pspec (G_OBJECT (layout), props[PROP_ATTRIBUTES]); - layout_changed (layout); -} - -/** - * pango_simple_layout_get_attributes: - * @layout: a `PangoSimpleLayout` - * - * Gets the attribute list for the layout, if any. - * - * Return value: (transfer none) (nullable): a `PangoAttrList` - */ -PangoAttrList * -pango_simple_layout_get_attributes (PangoSimpleLayout *layout) -{ - g_return_val_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout), NULL); - - return layout->attrs; -} - -/** - * pango_simple_layout_set_font_description: - * @layout: a `PangoSimpleLayout` - * @desc: (nullable): the new `PangoFontDescription` - * - * Sets the default font description for the layout. - * - * If no font description is set on the layout, the - * font description from the layout's context is used. - * - * This method is a shorthand for adding a font-desc attribute. - */ -void -pango_simple_layout_set_font_description (PangoSimpleLayout *layout, - const PangoFontDescription *desc) -{ - g_return_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout)); - - if (desc != layout->font_desc && - (!desc || !layout->font_desc || !pango_font_description_equal (desc, layout->font_desc))) - { - if (layout->font_desc) - pango_font_description_free (layout->font_desc); - - layout->font_desc = desc ? pango_font_description_copy (desc) : NULL; - - g_object_notify_by_pspec (G_OBJECT (layout), props[PROP_FONT_DESCRIPTION]); - layout_changed (layout); - } -} - -/** - * pango_simple_layout_get_font_description: - * @layout: a `PangoSimpleLayout` - * - * Gets the font description for the layout, if any. - * - * Return value: (transfer none) (nullable): a pointer to the - * layout's font description, or %NULL if the font description - * from the layout's context is inherited. - * - * Since: 1.8 - */ -const PangoFontDescription * -pango_simple_layout_get_font_description (PangoSimpleLayout *layout) -{ - g_return_val_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout), NULL); - - return layout->font_desc; -} - -/** - * pango_simple_layout_set_line_spacing: - * @layout: a `PangoSimpleLayout` - * @line_spacing: the new line spacing factor - * - * Sets a factor for line spacing. - * - * Typical values are: 0, 1, 1.5, 2. The default values is 0. - * - * If @line_spacing is non-zero, lines are placed so that - * - * baseline2 = baseline1 + factor * height2 - * - * where height2 is the line height of the second line (as determined - * by the font). - * - * This method is a shorthand for adding a line-height attribute. - */ -void -pango_simple_layout_set_line_spacing (PangoSimpleLayout *layout, - float line_spacing) -{ - g_return_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout)); - - if (layout->line_spacing == line_spacing) - return; - - layout->line_spacing = line_spacing; - - g_object_notify_by_pspec (G_OBJECT (layout), props[PROP_LINE_SPACING]); - layout_changed (layout); -} - -/** - * pango_simple_layout_get_line_spacing: - * @layout: a `PangoSimpleLayout` - * - * Gets the line spacing factor of @layout. - * - * See [method@Pango.SimpleLayout.set_line_spacing]. - */ -float -pango_simple_layout_get_line_spacing (PangoSimpleLayout *layout) -{ - g_return_val_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout), 0.0); - - return layout->line_spacing; -} - -/** - * pango_simple_layout_set_width: - * @layout: a `PangoSimpleLayout`. - * @width: the desired width in Pango units, or -1 to indicate that no - * wrapping or ellipsization should be performed. - * - * Sets the width to which the lines of the layout should - * be wrapped or ellipsized. - * - * The default value is -1: no width set. - */ -void -pango_simple_layout_set_width (PangoSimpleLayout *layout, - int width) -{ - g_return_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout)); - - if (width < -1) - width = -1; - - if (layout->width == width) - return; - - layout->width = width; - - g_object_notify_by_pspec (G_OBJECT (layout), props[PROP_WIDTH]); - layout_changed (layout); -} - -/** - * pango_simple_layout_get_width: - * @layout: a `PangoSimpleLayout` - * - * Gets the width to which the lines of the layout should wrap. - * - * Return value: the width in Pango units, or -1 if no width set. - */ -int -pango_simple_layout_get_width (PangoSimpleLayout *layout) -{ - g_return_val_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout), -1); - - return layout->width; -} - -/** - * pango_simple_layout_set_height: - * @layout: a `PangoSimpleLayout`. - * @height: the desired height - * - * Sets the height to which the `PangoLayout` should be ellipsized at. - * - * There are two different behaviors, based on whether @height is positive - * or negative. - * - * See [property@Pango.SimpleLayout:height] for details. - */ -void -pango_simple_layout_set_height (PangoSimpleLayout *layout, - int height) -{ - g_return_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout)); - - if (layout->height == height) - return; - - layout->height = height; - - g_object_notify_by_pspec (G_OBJECT (layout), props[PROP_HEIGHT]); - layout_changed (layout); -} - -/** - * pango_simple_layout_get_height: - * @layout: a `PangoSimpleLayout` - * - * Gets the height to which the lines of the layout should ellipsize. - * - * See [property@Pango.SimpleLayout:height] for details. - * - * Return value: the height - */ -int -pango_simple_layout_get_height (PangoSimpleLayout *layout) -{ - g_return_val_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout), -1); - - return layout->height; -} - -/** - * pango_simple_layout_set_tabs: - * @layout: a `PangoSimpleLayout` - * @tabs: (nullable): a `PangoTabArray` - * - * Sets the tabs to use for @layout, overriding the default tabs. - * - * See [method@Pango.LineBreaker.set_tabs] for details. - */ -void -pango_simple_layout_set_tabs (PangoSimpleLayout *layout, - PangoTabArray *tabs) -{ - g_return_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout)); - - if (layout->tabs == tabs) - return; - - g_clear_pointer (&layout->tabs, pango_tab_array_free); - layout->tabs = pango_tab_array_copy (tabs); - - g_object_notify_by_pspec (G_OBJECT (layout), props[PROP_TABS]); - layout_changed (layout); -} - -/** - * pango_simple_layout_get_tabs: - * @layout: a `PangoSimpleLayout` - * - * Gets the current `PangoTabArray` used by this layout. - * - * If no `PangoTabArray` has been set, then the default tabs are - * in use and %NULL is returned. Default tabs are every 8 spaces. - * - * Return value: (transfer none) (nullable): the tabs for this layout - */ -PangoTabArray * -pango_simple_layout_get_tabs (PangoSimpleLayout *layout) -{ - g_return_val_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout), NULL); - - return layout->tabs; -} - -/** - * pango_simple_layout_set_single_paragraph: - * @layout: a `PangoSimpleLayout` - * @single_paragraph: the new setting - * - * Sets the single paragraph mode of @layout. - * - * If @single_paragraph is `TRUE`, do not treat newlines and similar - * characters as paragraph separators; instead, keep all text in a - * single paragraph, and display a glyph for paragraph separator - * characters. - * - * Used when you want to allow editing of newlines on a single text line. - * - * The default value is %FALSE. - */ -void -pango_simple_layout_set_single_paragraph (PangoSimpleLayout *layout, - gboolean single_paragraph) -{ - g_return_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout)); - - if (layout->single_paragraph == single_paragraph) - return; - - layout->single_paragraph = single_paragraph; - - g_object_notify_by_pspec (G_OBJECT (layout), props[PROP_SINGLE_PARAGRAPH]); - layout_changed (layout); -} - -/** - * pango_simple_layout_get_single_paragraph: - * @layout: a `PangoSimpleLayout` - * - * Obtains whether @layout is in single paragraph mode. - * - * See [method@Pango.SimpleLayout.set_single_paragraph]. - * - * Return value: `TRUE` if the layout does not break paragraphs - * at paragraph separator characters, %FALSE otherwise - */ -gboolean -pango_simple_layout_get_single_paragraph (PangoSimpleLayout *layout) -{ - g_return_val_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout), FALSE); - - return layout->single_paragraph; -} - -/** - * pango_simple_layout_set_wrap: - * @layout: a `PangoSimpleLayout` - * @wrap: the wrap mode - * - * Sets the wrap mode. - * - * The wrap mode only has effect if a width is set on the layout - * with [method@Pango.SimpleLayout.set_width]. To turn off wrapping, - * set the width to -1. - * - * The default value is %PANGO_WRAP_WORD. - */ -void -pango_simple_layout_set_wrap (PangoSimpleLayout *layout, - PangoWrapMode wrap) -{ - g_return_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout)); - - if (layout->wrap == wrap) - return; - - layout->wrap = wrap; - - g_object_notify_by_pspec (G_OBJECT (layout), props[PROP_WRAP]); - layout_changed (layout); -} - -/** - * pango_simple_layout_get_wrap: - * @layout: a `PangoSimpleLayout` - * - * Gets the wrap mode for the layout. - * - * Return value: active wrap mode. - */ -PangoWrapMode -pango_simple_layout_get_wrap (PangoSimpleLayout *layout) -{ - g_return_val_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout), PANGO_WRAP_WORD); - - return layout->wrap; -} - -/** - * pango_simple_layout_set_indent: - * @layout: a `PangoSimpleLayout` - * @indent: the amount by which to indent - * - * Sets the width in Pango units to indent each paragraph. - * - * A negative value of @indent will produce a hanging indentation. - * That is, the first line will have the full width, and subsequent - * lines will be indented by the absolute value of @indent. - * - * The default value is 0. - */ -void -pango_simple_layout_set_indent (PangoSimpleLayout *layout, - int indent) -{ - g_return_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout)); - - if (layout->indent == indent) - return; - - layout->indent = indent; - - g_object_notify_by_pspec (G_OBJECT (layout), props[PROP_INDENT]); - layout_changed (layout); -} - -/** - * pango_simple_layout_get_indent: - * @layout: a `PangoSimpleLayout` - * - * Gets the paragraph indent width in Pango units. - * - * A negative value indicates a hanging indentation. - * - * Return value: the indent in Pango units - */ -int -pango_simple_layout_get_indent (PangoSimpleLayout *layout) -{ - g_return_val_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout), 0); - - return layout->indent; -} - -/** - * pango_simple_layout_set_alignment: - * @layout: a `PangoSimpleLayout` - * @alignment: the alignment - * - * Sets the alignment for the layout: how short lines are - * positioned within the horizontal space available. - * - * The default alignment is %PANGO_ALIGNMENT_LEFT. - */ -void -pango_simple_layout_set_alignment (PangoSimpleLayout *layout, - PangoAlignmentMode alignment) -{ - g_return_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout)); - - if (layout->alignment == alignment) - return; - - layout->alignment = alignment; - - g_object_notify_by_pspec (G_OBJECT (layout), props[PROP_ALIGNMENT]); - layout_changed (layout); -} - -/** - * pango_simple_layout_get_alignment: - * @layout: a `PangoSimpleLayout` - * - * Gets the alignment for the layout: how short lines are - * positioned within the horizontal space available. - * - * Return value: the alignment - */ -PangoAlignmentMode -pango_simple_layout_get_alignment (PangoSimpleLayout *layout) -{ - g_return_val_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout), PANGO_ALIGNMENT_LEFT); - - return layout->alignment; -} - -/** - * pango_simple_layout_set_ellipsize: - * @layout: a `PangoSimpleLayout` - * @ellipsize: the new ellipsization mode for @layout - * - * Sets the type of ellipsization being performed for @layout. - * - * Depending on the ellipsization mode @ellipsize text is removed - * from the start, middle, or end of text so they fit within the - * width of layout set with [method@Pango.SimpleLayout.set_width]. - * - * The default value is %PANGO_ELLIPSIZE_NONE. - */ -void -pango_simple_layout_set_ellipsize (PangoSimpleLayout *layout, - PangoEllipsizeMode ellipsize) -{ - g_return_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout)); - - if (layout->ellipsize == ellipsize) - return; - - layout->ellipsize = ellipsize; - - g_object_notify_by_pspec (G_OBJECT (layout), props[PROP_ELLIPSIZE]); - layout_changed (layout); -} - -/** - * pango_simple_layout_get_ellipsize: - * @layout: a `PangoSimpleLayout` - * - * Gets the type of ellipsization being performed for @layout. - * - * See [method@Pango.SimpleLayout.set_ellipsize]. - * - * Return value: the current ellipsization mode for @layout - */ -PangoEllipsizeMode -pango_simple_layout_get_ellipsize (PangoSimpleLayout *layout) -{ - g_return_val_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout), PANGO_ELLIPSIZE_NONE); - - return layout->ellipsize; -} - -/** - * pango_simple_layout_set_auto_dir: - * @layout: a `PangoSimpleLayout` - * @auto_dir: if %TRUE, compute the bidirectional base direction - * from the layout's contents - * - * Sets whether to calculate the base direction - * for the layout according to its contents. - * - * When this flag is on (the default), then paragraphs in - * @layout that begin with strong right-to-left characters - * (Arabic and Hebrew principally), will have right-to-left - * layout, paragraphs with letters from other scripts will - * have left-to-right layout. Paragraphs with only neutral - * characters get their direction from the surrounding - * paragraphs. - * - * When %FALSE, the choice between left-to-right and right-to-left - * layout is done according to the base direction of the layout's - * `PangoContext`. (See [method@Pango.Context.set_base_dir]). - * - * When the auto-computed direction of a paragraph differs - * from the base direction of the context, the interpretation - * of %PANGO_ALIGN_LEFT and %PANGO_ALIGN_RIGHT are swapped. - */ -void -pango_simple_layout_set_auto_dir (PangoSimpleLayout *layout, - gboolean auto_dir) -{ - g_return_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout)); - - if (auto_dir == layout->auto_dir) - return; - - layout->auto_dir = auto_dir; - - g_object_notify_by_pspec (G_OBJECT (layout), props[PROP_AUTO_DIR]); - layout_changed (layout); -} - -/** - * pango_simple_layout_get_auto_dir: - * @layout: a `PangoSimpleLayout` - * - * Gets whether to calculate the base direction for the layout - * according to its contents. - * - * See [method@Pango.SimpleLayout.set_auto_dir]. - * - * Return value: %TRUE if the bidirectional base direction - * is computed from the layout's contents, %FALSE otherwise - */ -gboolean -pango_simple_layout_get_auto_dir (PangoSimpleLayout *layout) -{ - g_return_val_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout), TRUE); - - return layout->auto_dir; -} - -/* }}} */ -/* {{{ Miscellaneous */ - -/** - * pango_simple_layout_set_markup: - * @layout: a `PangoSimpleLayout` - * @markup: marked-up text - * @length: length of @markup in bytes, or -1 if it is `NUL`-terminated - * - * Sets the layout text and attribute list from marked-up text. - * - * See [Pango Markup](pango_markup.html)). - * - * Replaces the current text and attribute list. - */ -void -pango_simple_layout_set_markup (PangoSimpleLayout *layout, - const char *markup, - int length) -{ - PangoAttrList *attrs; - char *text; - GError *error = NULL; - - g_return_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout)); - g_return_if_fail (markup != NULL); - - if (!pango_parse_markup (markup, length, 0, &attrs, &text, NULL, &error)) - { - g_warning ("pango_layout_set_markup_with_accel: %s", error->message); - g_error_free (error); - return; - } - - g_free (layout->text); - layout->text = text; - layout->length = strlen (text); - - g_clear_pointer (&layout->attrs, pango_attr_list_unref); - layout->attrs = attrs; - - g_object_notify_by_pspec (G_OBJECT (layout), props[PROP_TEXT]); - g_object_notify_by_pspec (G_OBJECT (layout), props[PROP_ATTRIBUTES]); - layout_changed (layout); -} - -/** - * pango_simple_layout_get_character_count: - * @layout: a `PangoSimpleLayout` - * - * Returns the number of Unicode characters in the - * the text of @layout. - * - * Return value: the number of Unicode characters in @layout - */ -int -pango_simple_layout_get_character_count (PangoSimpleLayout *layout) -{ - PangoLine *line; - - g_return_val_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout), 0); - - ensure_lines (layout); - - line = pango_lines_get_line (layout->lines, 0, NULL, NULL); - - return line->data->n_chars; -} - -/* }}} */ -/* {{{ Output getters */ - -/** - * pango_simple_layout_get_lines: - * @layout: a `PangoSimpleLayout` - * - * Gets the lines of the @layout. - * - * The returned object will become invalid when any - * property of @layout is changed. Take a reference - * to keep it. - * - * Return value: (transfer none): a `PangoLines` object - * with the lines of @layout - */ -PangoLines * -pango_simple_layout_get_lines (PangoSimpleLayout *layout) -{ - g_return_val_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout), NULL); - - ensure_lines (layout); - - return layout->lines; -} - -/** - * pango_simple_layout_get_log_attrs: - * @layout: a `PangoSimpleLayout` - * @n_attrs: (out): return location for the length of the array - * - * Gets the `PangoLogAttr` array for the content - * of @layout. - * - * The returned array becomes invalid when - * any properties of @layout change. Make a - * copy if you want to keep it. - * - * Returns: (transfer none): the `PangoLogAttr` array - */ -const PangoLogAttr * -pango_simple_layout_get_log_attrs (PangoSimpleLayout *layout, - int *n_attrs) -{ - PangoLine *line; - - g_return_val_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout), NULL); - - ensure_lines (layout); - - line = pango_lines_get_line (layout->lines, 0, NULL, NULL); - - if (n_attrs) - *n_attrs = line->data->n_chars + 1; - - return line->data->log_attrs; -} - -/** - * pango_simple_layout_get_iter: - * @layout: a `PangoSimpleLayout` - * - * Returns an iterator to iterate over the visual extents - * of the layout. - * - * This is a convenience wrapper for [method@Pango.Lines.get_iter]. - * - * Returns: the new `PangoLineIter` - */ -PangoLineIter * -pango_simple_layout_get_iter (PangoSimpleLayout *layout) -{ - g_return_val_if_fail (PANGO_IS_SIMPLE_LAYOUT (layout), NULL); - - ensure_lines (layout); - - return pango_lines_get_iter (layout->lines); -} - -/* }}} */ -/* }}} */ - -/* vim:set foldmethod=marker expandtab: */ |