1 /* Pango
2  * pango-renderer.h: Base class for rendering
3  *
4  * Copyright (C) 2004, Red Hat, Inc.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public
17  * License along with this library; if not, write to the
18  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  */
21 #ifndef __PANGO_RENDERER_H_
22 #define __PANGO_RENDERER_H_
23 
24 #include <pango/pango-layout.h>
25 
26 G_BEGIN_DECLS
27 
28 #define PANGO_TYPE_RENDERER            (pango_renderer_get_type())
29 #define PANGO_RENDERER(object)         (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_TYPE_RENDERER, PangoRenderer))
30 #define PANGO_IS_RENDERER(object)      (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_TYPE_RENDERER))
31 #define PANGO_RENDERER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), PANGO_TYPE_RENDERER, PangoRendererClass))
32 #define PANGO_IS_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PANGO_TYPE_RENDERER))
33 #define PANGO_RENDERER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), PANGO_TYPE_RENDERER, PangoRendererClass))
34 
35 typedef struct _PangoRenderer        PangoRenderer;
36 typedef struct _PangoRendererClass   PangoRendererClass;
37 typedef struct _PangoRendererPrivate PangoRendererPrivate;
38 
39 /**
40  * PangoRenderPart:
41  * @PANGO_RENDER_PART_FOREGROUND: the text itself
42  * @PANGO_RENDER_PART_BACKGROUND: the area behind the text
43  * @PANGO_RENDER_PART_UNDERLINE: underlines
44  * @PANGO_RENDER_PART_STRIKETHROUGH: strikethrough lines
45  * @PANGO_RENDER_PART_OVERLINE: overlines
46  *
47  * `PangoRenderPart` defines different items to render for such
48  * purposes as setting colors.
49  *
50  * Since: 1.8
51  **/
52 /* When extending, note N_RENDER_PARTS #define in pango-renderer.c */
53 typedef enum
54 {
55   PANGO_RENDER_PART_FOREGROUND,
56   PANGO_RENDER_PART_BACKGROUND,
57   PANGO_RENDER_PART_UNDERLINE,
58   PANGO_RENDER_PART_STRIKETHROUGH,
59   PANGO_RENDER_PART_OVERLINE
60 } PangoRenderPart;
61 
62 /**
63  * PangoRenderer:
64  * @matrix: (nullable): the current transformation matrix for
65  *   the Renderer; may be %NULL, which should be treated the
66  *   same as the identity matrix.
67  *
68  * `PangoRenderer` is a base class for objects that can render text
69  * provided as `PangoGlyphString` or `PangoLayout`.
70  *
71  * By subclassing `PangoRenderer` and overriding operations such as
72  * @draw_glyphs and @draw_rectangle, renderers for particular font
73  * backends and destinations can be created.
74  *
75  * Since: 1.8
76  */
77 struct _PangoRenderer
78 {
79   /*< private >*/
80   GObject parent_instance;
81 
82   PangoUnderline underline;
83   gboolean strikethrough;
84   int active_count;
85 
86   /*< public >*/
87   PangoMatrix *matrix;          /* May be NULL */
88 
89   /*< private >*/
90   PangoRendererPrivate *priv;
91 };
92 
93 /**
94  * PangoRendererClass:
95  * @draw_glyphs: draws a `PangoGlyphString`
96  * @draw_rectangle: draws a rectangle
97  * @draw_error_underline: draws a squiggly line that approximately
98  * covers the given rectangle in the style of an underline used to
99  * indicate a spelling error.
100  * @draw_shape: draw content for a glyph shaped with `PangoAttrShape`
101  *   @x, @y are the coordinates of the left edge of the baseline,
102  *   in user coordinates.
103  * @draw_trapezoid: draws a trapezoidal filled area
104  * @draw_glyph: draws a single glyph
105  * @part_changed: do renderer specific processing when rendering
106  *  attributes change
107  * @begin: Do renderer-specific initialization before drawing
108  * @end: Do renderer-specific cleanup after drawing
109  * @prepare_run: updates the renderer for a new run
110  * @draw_glyph_item: draws a `PangoGlyphItem`
111  *
112  * Class structure for `PangoRenderer`.
113  *
114  * The following vfuncs take user space coordinates in Pango units
115  * and have default implementations:
116  * - draw_glyphs
117  * - draw_rectangle
118  * - draw_error_underline
119  * - draw_shape
120  * - draw_glyph_item
121  *
122  * The default draw_shape implementation draws nothing.
123  *
124  * The following vfuncs take device space coordinates as doubles
125  * and must be implemented:
126  * - draw_trapezoid
127  * - draw_glyph
128  *
129  * Since: 1.8
130  */
131 struct _PangoRendererClass
132 {
133   /*< private >*/
134   GObjectClass parent_class;
135 
136   /* vtable - not signals */
137   /*< public >*/
138 
139   void (*draw_glyphs)          (PangoRenderer    *renderer,
140                                 PangoFont        *font,
141                                 PangoGlyphString *glyphs,
142                                 int               x,
143                                 int               y);
144   void (*draw_rectangle)       (PangoRenderer    *renderer,
145                                 PangoRenderPart   part,
146                                 int               x,
147                                 int               y,
148                                 int               width,
149                                 int               height);
150   void (*draw_error_underline) (PangoRenderer    *renderer,
151                                 int               x,
152                                 int               y,
153                                 int               width,
154                                 int               height);
155   void (*draw_shape)           (PangoRenderer    *renderer,
156                                 PangoAttrShape   *attr,
157                                 int               x,
158                                 int               y);
159 
160   void (*draw_trapezoid)       (PangoRenderer    *renderer,
161                                 PangoRenderPart   part,
162                                 double            y1_,
163                                 double            x11,
164                                 double            x21,
165                                 double            y2,
166                                 double            x12,
167                                 double            x22);
168   void (*draw_glyph)           (PangoRenderer    *renderer,
169                                 PangoFont        *font,
170                                 PangoGlyph        glyph,
171                                 double            x,
172                                 double            y);
173 
174   void (*part_changed)         (PangoRenderer    *renderer,
175                                 PangoRenderPart   part);
176 
177   void (*begin)                (PangoRenderer    *renderer);
178   void (*end)                  (PangoRenderer    *renderer);
179 
180   void (*prepare_run)          (PangoRenderer    *renderer,
181                                 PangoLayoutRun   *run);
182 
183   void (*draw_glyph_item)      (PangoRenderer    *renderer,
184                                 const char       *text,
185                                 PangoGlyphItem   *glyph_item,
186                                 int               x,
187                                 int               y);
188 
189   /*< private >*/
190 
191   /* Padding for future expansion */
192   void (*_pango_reserved2) (void);
193   void (*_pango_reserved3) (void);
194   void (*_pango_reserved4) (void);
195 };
196 
197 PANGO_AVAILABLE_IN_1_8
198 GType pango_renderer_get_type            (void) G_GNUC_CONST;
199 
200 PANGO_AVAILABLE_IN_1_8
201 void pango_renderer_draw_layout          (PangoRenderer    *renderer,
202                                           PangoLayout      *layout,
203                                           int               x,
204                                           int               y);
205 PANGO_AVAILABLE_IN_1_8
206 void pango_renderer_draw_layout_line     (PangoRenderer    *renderer,
207                                           PangoLayoutLine  *line,
208                                           int               x,
209                                           int               y);
210 PANGO_AVAILABLE_IN_1_8
211 void pango_renderer_draw_glyphs          (PangoRenderer    *renderer,
212                                           PangoFont        *font,
213                                           PangoGlyphString *glyphs,
214                                           int               x,
215                                           int               y);
216 PANGO_AVAILABLE_IN_1_22
217 void pango_renderer_draw_glyph_item      (PangoRenderer    *renderer,
218                                           const char       *text,
219                                           PangoGlyphItem   *glyph_item,
220                                           int               x,
221                                           int               y);
222 PANGO_AVAILABLE_IN_1_8
223 void pango_renderer_draw_rectangle       (PangoRenderer    *renderer,
224                                           PangoRenderPart   part,
225                                           int               x,
226                                           int               y,
227                                           int               width,
228                                           int               height);
229 PANGO_AVAILABLE_IN_1_8
230 void pango_renderer_draw_error_underline (PangoRenderer    *renderer,
231                                           int               x,
232                                           int               y,
233                                           int               width,
234                                           int               height);
235 PANGO_AVAILABLE_IN_1_8
236 void pango_renderer_draw_trapezoid       (PangoRenderer    *renderer,
237                                           PangoRenderPart   part,
238                                           double            y1_,
239                                           double            x11,
240                                           double            x21,
241                                           double            y2,
242                                           double            x12,
243                                           double            x22);
244 PANGO_AVAILABLE_IN_1_8
245 void pango_renderer_draw_glyph           (PangoRenderer    *renderer,
246                                           PangoFont        *font,
247                                           PangoGlyph        glyph,
248                                           double            x,
249                                           double            y);
250 
251 PANGO_AVAILABLE_IN_1_8
252 void pango_renderer_activate             (PangoRenderer    *renderer);
253 PANGO_AVAILABLE_IN_1_8
254 void pango_renderer_deactivate           (PangoRenderer    *renderer);
255 
256 PANGO_AVAILABLE_IN_1_8
257 void pango_renderer_part_changed         (PangoRenderer   *renderer,
258                                           PangoRenderPart  part);
259 
260 PANGO_AVAILABLE_IN_1_8
261 void        pango_renderer_set_color     (PangoRenderer    *renderer,
262                                           PangoRenderPart   part,
263                                           const PangoColor *color);
264 PANGO_AVAILABLE_IN_1_8
265 PangoColor *pango_renderer_get_color     (PangoRenderer    *renderer,
266                                           PangoRenderPart   part);
267 
268 PANGO_AVAILABLE_IN_1_38
269 void        pango_renderer_set_alpha     (PangoRenderer    *renderer,
270                                           PangoRenderPart   part,
271                                           guint16           alpha);
272 PANGO_AVAILABLE_IN_1_38
273 guint16     pango_renderer_get_alpha     (PangoRenderer    *renderer,
274                                           PangoRenderPart   part);
275 
276 PANGO_AVAILABLE_IN_1_8
277 void               pango_renderer_set_matrix      (PangoRenderer     *renderer,
278                                                    const PangoMatrix *matrix);
279 PANGO_AVAILABLE_IN_1_8
280 const PangoMatrix *pango_renderer_get_matrix      (PangoRenderer     *renderer);
281 
282 PANGO_AVAILABLE_IN_1_20
283 PangoLayout       *pango_renderer_get_layout      (PangoRenderer     *renderer);
284 PANGO_AVAILABLE_IN_1_20
285 PangoLayoutLine   *pango_renderer_get_layout_line (PangoRenderer     *renderer);
286 
287 G_END_DECLS
288 
289 #endif /* __PANGO_RENDERER_H_ */
290 
291