summaryrefslogtreecommitdiff
path: root/pango/pango-layout-private.h
blob: 1805e73008e027c823bff1bcc04f2592cf80b72b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/* Pango
 * pango-layout-private.h: Internal structures of PangoLayout
 *
 * Copyright (C) 2004 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_LAYOUT_PRIVATE_H__
#define __PANGO_LAYOUT_PRIVATE_H__

#include <pango/pango-layout.h>

G_BEGIN_DECLS

struct _PangoLayout
{
  GObject parent_instance;

  /* If you add fields to PangoLayout be sure to update _copy()
   * unless you add a value between copy_begin and copy_end.
   */

  /* Referenced items */
  PangoContext *context;
  PangoAttrList *attrs;
  PangoFontDescription *font_desc;
  PangoTabArray *tabs;

  /* Dupped */
  gchar *text;

  /* Value fields.  These will be memcpy'd in _copy() */
  int copy_begin;

  guint serial;
  guint context_serial;

  int length;			/* length of text in bytes */
  int n_chars;		        /* number of characters in layout */
  int width;			/* wrap/ellipsize width, in device units, or -1 if not set */
  int height;			/* ellipsize width, in device units if positive, number of lines if negative */
  int indent;			/* amount by which first line should be shorter */
  int spacing;			/* spacing between lines */
  float line_spacing;           /* factor to apply to line height */

  guint justify : 1;
  guint justify_last_line : 1;
  guint alignment : 2;
  guint single_paragraph : 1;
  guint auto_dir : 1;
  guint wrap : 2;		/* PangoWrapMode */
  guint is_wrapped : 1;		/* Whether the layout has any wrapped lines */
  guint ellipsize : 2;		/* PangoEllipsizeMode */
  guint is_ellipsized : 1;	/* Whether the layout has any ellipsized lines */
  int unknown_glyphs_count;	/* number of unknown glyphs */

  /* some caching */
  guint logical_rect_cached : 1;
  guint ink_rect_cached : 1;
  PangoRectangle logical_rect;
  PangoRectangle ink_rect;
  int tab_width;		/* Cached width of a tab. -1 == not yet calculated */

  int copy_end;

  /* Not copied during _copy() */

  PangoLogAttr *log_attrs;	/* Logical attributes for layout's text */
  GSList *lines;
  guint line_count;		/* Number of lines in @lines. 0 if lines is %NULL */
};

typedef struct _Extents Extents;
struct _Extents
{
  /* Vertical position of the line's baseline in layout coords */
  int baseline;

  /* Line extents in layout coords */
  PangoRectangle ink_rect;
  PangoRectangle logical_rect;
};

struct _PangoLayoutIter
{
  PangoLayout *layout;
  GSList *line_list_link;
  PangoLayoutLine *line;

  /* If run is NULL, it means we're on a "virtual run"
   * at the end of the line with 0 width
   */
  GSList *run_list_link;
  PangoLayoutRun *run; /* FIXME nuke this, just keep the link */
  int index;

  /* list of Extents for each line in layout coordinates */
  Extents *line_extents;
  int line_index;

  /* X position of the current run */
  int run_x;

  /* Width of the current run */
  int run_width;

  /* this run is left-to-right */
  gboolean ltr;

  /* X position of the left side of the current cluster */
  int cluster_x;

  /* The width of the current cluster */
  int cluster_width;

  /* glyph offset to the current cluster start */
  int cluster_start;

  /* first glyph in the next cluster */
  int next_cluster_glyph;

  /* number of Unicode chars in current cluster */
  int cluster_num_chars;

  /* visual position of current character within the cluster */
  int character_position;

  /* the real width of layout */
  int layout_width;
};

gboolean _pango_layout_line_ellipsize (PangoLayoutLine *line,
				       PangoAttrList   *attrs,
                                       PangoShapeFlags  shape_flags,
				       int              goal_width);

void     _pango_layout_get_iter (PangoLayout     *layout,
                                 PangoLayoutIter *iter);

void     _pango_layout_iter_destroy (PangoLayoutIter *iter);

G_END_DECLS

#endif /* __PANGO_LAYOUT_PRIVATE_H__ */