1 /*
2  * Distributed under the Boost Software License, Version 1.0.
3  *    (See accompanying file LICENSE_1_0.txt or copy at
4  *          http://www.boost.org/LICENSE_1_0.txt)
5  */
6 module pango.c.layout;
7 
8 import pango.c.attributes;
9 import pango.c.context;
10 import pango.c.glyph_item;
11 import pango.c.tabs;
12 import pango.c.font;
13 import pango.c.types;
14 import pango.c.break_;
15 
16 import glib;
17 import gobject;
18 
19 import std.bitmanip;
20 
21 extern (C):
22 
23 struct PangoLayout;
24 struct PangoLayoutClass;
25 
26 /**
27  * PangoLayoutRun:
28  *
29  * The #PangoLayoutRun structure represents a single run within
30  * a #PangoLayoutLine; it is simply an alternate name for
31  * #PangoGlyphItem.
32  * See the #PangoGlyphItem docs for details on the fields.
33  */
34 alias PangoLayoutRun = PangoGlyphItem;
35 
36 /**
37  * PangoAlignment:
38  * @PANGO_ALIGN_LEFT: Put all available space on the right
39  * @PANGO_ALIGN_CENTER: Center the line within the available space
40  * @PANGO_ALIGN_RIGHT: Put all available space on the left
41  *
42  * A #PangoAlignment describes how to align the lines of a #PangoLayout within the
43  * available space. If the #PangoLayout is set to justify
44  * using pango_layout_set_justify(), this only has effect for partial lines.
45  */
46 enum PangoAlignment {
47   PANGO_ALIGN_LEFT,
48   PANGO_ALIGN_CENTER,
49   PANGO_ALIGN_RIGHT
50 }
51 
52 /**
53  * PangoWrapMode:
54  * @PANGO_WRAP_WORD: wrap lines at word boundaries.
55  * @PANGO_WRAP_CHAR: wrap lines at character boundaries.
56  * @PANGO_WRAP_WORD_CHAR: wrap lines at word boundaries, but fall back to character boundaries if there is not
57  * enough space for a full word.
58  *
59  * A #PangoWrapMode describes how to wrap the lines of a #PangoLayout to the desired width.
60  */
61 enum PangoWrapMode {
62   PANGO_WRAP_WORD,
63   PANGO_WRAP_CHAR,
64   PANGO_WRAP_WORD_CHAR
65 }
66 
67 /**
68  * PangoEllipsizeMode:
69  * @PANGO_ELLIPSIZE_NONE: No ellipsization
70  * @PANGO_ELLIPSIZE_START: Omit characters at the start of the text
71  * @PANGO_ELLIPSIZE_MIDDLE: Omit characters in the middle of the text
72  * @PANGO_ELLIPSIZE_END: Omit characters at the end of the text
73  *
74  * The #PangoEllipsizeMode type describes what sort of (if any)
75  * ellipsization should be applied to a line of text. In
76  * the ellipsization process characters are removed from the
77  * text in order to make it fit to a given width and replaced
78  * with an ellipsis.
79  */
80 enum PangoEllipsizeMode {
81   PANGO_ELLIPSIZE_NONE,
82   PANGO_ELLIPSIZE_START,
83   PANGO_ELLIPSIZE_MIDDLE,
84   PANGO_ELLIPSIZE_END
85 }
86 
87 /**
88  * PangoLayoutLine:
89  * @start_index: start of line as byte index into layout->text
90  * @length: length of line in bytes
91  * @is_paragraph_start: #TRUE if this is the first line of the paragraph
92  * @resolved_dir: #Resolved PangoDirection of line
93  *
94  * The #PangoLayoutLine structure represents one of the lines resulting
95  * from laying out a paragraph via #PangoLayout. #PangoLayoutLine
96  * structures are obtained by calling pango_layout_get_line() and
97  * are only valid until the text, attributes, or settings of the
98  * parent #PangoLayout are modified.
99  *
100  * Routines for rendering PangoLayout objects are provided in
101  * code specific to each rendering system.
102  */
103 struct PangoLayoutLine
104 {
105   PangoLayout *layout;
106   gint         start_index;     /* start of line as byte index into layout->text */
107   gint         length;		/* length of line in bytes */
108   GSList      *runs;
109   mixin(bitfields!(
110         guint, "is_paragraph_start", 1,  /* TRUE if this is the first line of the paragraph */
111         guint, "resolved_dir", 3,  /* Resolved PangoDirection of line */
112         guint, "", 4));
113 };
114 
115 
116 /* The PangoLayout and PangoLayoutClass structs are private; if you
117  * need to create a subclass of these, file a bug.
118  */
119 
120 pure GType        pango_layout_get_type       ();
121 PangoLayout *pango_layout_new            (PangoContext   *context);
122 PangoLayout *pango_layout_copy           (PangoLayout    *src);
123 
124 PangoContext  *pango_layout_get_context    (PangoLayout    *layout);
125 
126 void           pango_layout_set_attributes (PangoLayout    *layout,
127 					    PangoAttrList  *attrs);
128 PangoAttrList *pango_layout_get_attributes (PangoLayout    *layout);
129 
130 void           pango_layout_set_text       (PangoLayout    *layout,
131 					    const(char)     *text,
132 					    int             length);
133 const(char)    *pango_layout_get_text       (PangoLayout    *layout);
134 
135 gint           pango_layout_get_character_count (PangoLayout *layout);
136 
137 void           pango_layout_set_markup     (PangoLayout    *layout,
138 					    const(char)     *markup,
139 					    int             length);
140 
141 void           pango_layout_set_markup_with_accel (PangoLayout    *layout,
142 						   const(char)     *markup,
143 						   int             length,
144 						   gunichar        accel_marker,
145 						   gunichar       *accel_char);
146 
147 void           pango_layout_set_font_description (PangoLayout                *layout,
148 						  const(PangoFontDescription) *desc);
149 
150 const(PangoFontDescription) *pango_layout_get_font_description (PangoLayout *layout);
151 
152 void           pango_layout_set_width            (PangoLayout                *layout,
153 						  int                         width);
154 int            pango_layout_get_width            (PangoLayout                *layout);
155 void           pango_layout_set_height           (PangoLayout                *layout,
156 						  int                         height);
157 int            pango_layout_get_height           (PangoLayout                *layout);
158 void           pango_layout_set_wrap             (PangoLayout                *layout,
159 						  PangoWrapMode               wrap);
160 PangoWrapMode  pango_layout_get_wrap             (PangoLayout                *layout);
161 gboolean       pango_layout_is_wrapped           (PangoLayout                *layout);
162 void           pango_layout_set_indent           (PangoLayout                *layout,
163 						  int                         indent);
164 int            pango_layout_get_indent           (PangoLayout                *layout);
165 void           pango_layout_set_spacing          (PangoLayout                *layout,
166 						  int                         spacing);
167 int            pango_layout_get_spacing          (PangoLayout                *layout);
168 void           pango_layout_set_justify          (PangoLayout                *layout,
169 						  gboolean                    justify);
170 gboolean       pango_layout_get_justify          (PangoLayout                *layout);
171 void           pango_layout_set_auto_dir         (PangoLayout                *layout,
172 						  gboolean                    auto_dir);
173 gboolean       pango_layout_get_auto_dir         (PangoLayout                *layout);
174 void           pango_layout_set_alignment        (PangoLayout                *layout,
175 						  PangoAlignment              alignment);
176 PangoAlignment pango_layout_get_alignment        (PangoLayout                *layout);
177 
178 void           pango_layout_set_tabs             (PangoLayout                *layout,
179 						  PangoTabArray              *tabs);
180 
181 PangoTabArray* pango_layout_get_tabs             (PangoLayout                *layout);
182 
183 void           pango_layout_set_single_paragraph_mode (PangoLayout                *layout,
184 						       gboolean                    setting);
185 gboolean       pango_layout_get_single_paragraph_mode (PangoLayout                *layout);
186 
187 void               pango_layout_set_ellipsize (PangoLayout        *layout,
188 					       PangoEllipsizeMode  ellipsize);
189 PangoEllipsizeMode pango_layout_get_ellipsize (PangoLayout        *layout);
190 gboolean           pango_layout_is_ellipsized (PangoLayout        *layout);
191 
192 int      pango_layout_get_unknown_glyphs_count (PangoLayout    *layout);
193 
194 void     pango_layout_context_changed (PangoLayout    *layout);
195 guint    pango_layout_get_serial      (PangoLayout    *layout);
196 
197 void     pango_layout_get_log_attrs (PangoLayout    *layout,
198 				     PangoLogAttr  **attrs,
199 				     gint           *n_attrs);
200 
201 const(PangoLogAttr) *pango_layout_get_log_attrs_readonly (PangoLayout *layout,
202 							 gint        *n_attrs);
203 
204 void     pango_layout_index_to_pos         (PangoLayout    *layout,
205 					    int             index_,
206 					    PangoRectangle *pos);
207 void     pango_layout_index_to_line_x      (PangoLayout    *layout,
208 					    int             index_,
209 					    gboolean        trailing,
210 					    int            *line,
211 					    int            *x_pos);
212 void     pango_layout_get_cursor_pos       (PangoLayout    *layout,
213 					    int             index_,
214 					    PangoRectangle *strong_pos,
215 					    PangoRectangle *weak_pos);
216 void     pango_layout_move_cursor_visually (PangoLayout    *layout,
217 					    gboolean        strong,
218 					    int             old_index,
219 					    int             old_trailing,
220 					    int             direction,
221 					    int            *new_index,
222 					    int            *new_trailing);
223 gboolean pango_layout_xy_to_index          (PangoLayout    *layout,
224 					    int             x,
225 					    int             y,
226 					    int            *index_,
227 					    int            *trailing);
228 void     pango_layout_get_extents          (PangoLayout    *layout,
229 					    PangoRectangle *ink_rect,
230 					    PangoRectangle *logical_rect);
231 void     pango_layout_get_pixel_extents    (PangoLayout    *layout,
232 					    PangoRectangle *ink_rect,
233 					    PangoRectangle *logical_rect);
234 void     pango_layout_get_size             (PangoLayout    *layout,
235 					    int            *width,
236 					    int            *height);
237 void     pango_layout_get_pixel_size       (PangoLayout    *layout,
238 					    int            *width,
239 					    int            *height);
240 int      pango_layout_get_baseline         (PangoLayout    *layout);
241 
242 int              pango_layout_get_line_count       (PangoLayout    *layout);
243 PangoLayoutLine *pango_layout_get_line             (PangoLayout    *layout,
244 						    int             line);
245 PangoLayoutLine *pango_layout_get_line_readonly    (PangoLayout    *layout,
246 						    int             line);
247 GSList *         pango_layout_get_lines            (PangoLayout    *layout);
248 GSList *         pango_layout_get_lines_readonly   (PangoLayout    *layout);
249 
250 
251 
252 pure GType    pango_layout_line_get_type     ();
253 
254 PangoLayoutLine *pango_layout_line_ref   (PangoLayoutLine *line);
255 void             pango_layout_line_unref (PangoLayoutLine *line);
256 
257 gboolean pango_layout_line_x_to_index   (PangoLayoutLine  *line,
258 					 int               x_pos,
259 					 int              *index_,
260 					 int              *trailing);
261 void     pango_layout_line_index_to_x   (PangoLayoutLine  *line,
262 					 int               index_,
263 					 gboolean          trailing,
264 					 int              *x_pos);
265 void     pango_layout_line_get_x_ranges (PangoLayoutLine  *line,
266 					 int               start_index,
267 					 int               end_index,
268 					 int             **ranges,
269 					 int              *n_ranges);
270 void     pango_layout_line_get_extents  (PangoLayoutLine  *line,
271 					 PangoRectangle   *ink_rect,
272 					 PangoRectangle   *logical_rect);
273 void     pango_layout_line_get_pixel_extents (PangoLayoutLine *layout_line,
274 					      PangoRectangle  *ink_rect,
275 					      PangoRectangle  *logical_rect);
276 
277 struct PangoLayoutIter;
278 
279 
280 pure GType            pango_layout_iter_get_type ();
281 
282 PangoLayoutIter *pango_layout_get_iter  (PangoLayout     *layout);
283 PangoLayoutIter *pango_layout_iter_copy (PangoLayoutIter *iter);
284 void             pango_layout_iter_free (PangoLayoutIter *iter);
285 
286 int              pango_layout_iter_get_index  (PangoLayoutIter *iter);
287 PangoLayoutRun  *pango_layout_iter_get_run    (PangoLayoutIter *iter);
288 PangoLayoutRun  *pango_layout_iter_get_run_readonly   (PangoLayoutIter *iter);
289 PangoLayoutLine *pango_layout_iter_get_line   (PangoLayoutIter *iter);
290 PangoLayoutLine *pango_layout_iter_get_line_readonly  (PangoLayoutIter *iter);
291 gboolean         pango_layout_iter_at_last_line (PangoLayoutIter *iter);
292 PangoLayout     *pango_layout_iter_get_layout (PangoLayoutIter *iter);
293 
294 gboolean pango_layout_iter_next_char    (PangoLayoutIter *iter);
295 gboolean pango_layout_iter_next_cluster (PangoLayoutIter *iter);
296 gboolean pango_layout_iter_next_run     (PangoLayoutIter *iter);
297 gboolean pango_layout_iter_next_line    (PangoLayoutIter *iter);
298 
299 void pango_layout_iter_get_char_extents    (PangoLayoutIter *iter,
300 					    PangoRectangle  *logical_rect);
301 void pango_layout_iter_get_cluster_extents (PangoLayoutIter *iter,
302 					    PangoRectangle  *ink_rect,
303 					    PangoRectangle  *logical_rect);
304 void pango_layout_iter_get_run_extents     (PangoLayoutIter *iter,
305 					    PangoRectangle  *ink_rect,
306 					    PangoRectangle  *logical_rect);
307 void pango_layout_iter_get_line_extents    (PangoLayoutIter *iter,
308 					    PangoRectangle  *ink_rect,
309 					    PangoRectangle  *logical_rect);
310 /* All the yranges meet, unlike the logical_rect's (i.e. the yranges
311  * assign between-line spacing to the nearest line)
312  */
313 void pango_layout_iter_get_line_yrange     (PangoLayoutIter *iter,
314 					    int             *y0_,
315 					    int             *y1_);
316 void pango_layout_iter_get_layout_extents  (PangoLayoutIter *iter,
317 					    PangoRectangle  *ink_rect,
318 					    PangoRectangle  *logical_rect);
319 int  pango_layout_iter_get_baseline        (PangoLayoutIter *iter);
320