]> Pileus Git - ~andy/gtk/blob - gdk/x11/gdkpango-x11.c
Make PLT-reduction work with gcc4, and don't include everything in
[~andy/gtk] / gdk / x11 / gdkpango-x11.c
1 /* GDK - The GIMP Drawing Kit
2  * Copyright (C) 2000 Red Hat, Inc. 
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19
20 #include <config.h>
21 #include <stdlib.h>
22
23 #include "gdkx.h"
24 #include "gdkdisplay-x11.h"
25 #include "gdkpango.h"
26 #include <pango/pangoxft.h>
27 #include <pango/pangoxft-render.h>
28 #include "gdkalias.h"
29
30 #include <math.h>
31
32 typedef struct _GdkX11Renderer      GdkX11Renderer;
33 typedef struct _GdkX11RendererClass GdkX11RendererClass;
34
35 #define GDK_TYPE_X11_RENDERER            (_gdk_x11_renderer_get_type())
36 #define GDK_X11_RENDERER(object)         (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_X11_RENDERER, GdkX11Renderer))
37 #define GDK_IS_X11_RENDERER(object)      (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_X11_RENDERER))
38 #define GDK_X11_RENDERER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_X11_RENDERER, GdkX11RendererClass))
39 #define GDK_IS_X11_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_X11_RENDERER))
40 #define GDK_X11_RENDERER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_X11_RENDERER, GdkX11RendererClass))
41
42 #define MAX_RENDER_PART  PANGO_RENDER_PART_STRIKETHROUGH
43
44 struct _GdkX11Renderer
45 {
46   PangoXftRenderer parent_instance;
47
48   XRenderPictFormat *mask_format;
49   
50   GdkDrawable *drawable;
51   GdkGC *gc;
52 };
53
54 struct _GdkX11RendererClass
55 {
56   PangoXftRendererClass parent_class;
57 };
58
59 G_DEFINE_TYPE (GdkX11Renderer, _gdk_x11_renderer, PANGO_TYPE_XFT_RENDERER)
60
61 static void
62 gdk_x11_renderer_finalize (GObject *object)
63 {
64   G_OBJECT_CLASS (_gdk_x11_renderer_parent_class)->finalize (object);
65 }
66      
67 static void
68 gdk_x11_renderer_composite_trapezoids (PangoXftRenderer *xftrenderer,
69                                        PangoRenderPart   part,
70                                        XTrapezoid       *trapezoids,
71                                        int               n_trapezoids)
72 {
73   /* Because we only use this renderer for "draw_glyphs()" calls, we
74    * won't hit this code path much. However, it is hit for drawing
75    * the "unknown glyph" hex squares. We can safely ignore the part,
76    */
77   GdkX11Renderer *x11_renderer = GDK_X11_RENDERER (xftrenderer);
78
79   _gdk_x11_drawable_draw_xtrapezoids (x11_renderer->drawable,
80                                       x11_renderer->gc,
81                                       trapezoids, n_trapezoids);
82
83 }
84
85 static void
86 gdk_x11_renderer_composite_glyphs (PangoXftRenderer *xftrenderer,
87                                    XftFont          *xft_font,
88                                    XftGlyphSpec     *glyphs,
89                                    gint              n_glyphs)
90 {
91   GdkX11Renderer *x11_renderer = GDK_X11_RENDERER (xftrenderer);
92
93   _gdk_x11_drawable_draw_xft_glyphs (x11_renderer->drawable,
94                                      x11_renderer->gc,
95                                      xft_font, glyphs, n_glyphs);
96 }
97
98 static void
99 _gdk_x11_renderer_init (GdkX11Renderer *renderer)
100 {
101 }
102
103 static void
104 _gdk_x11_renderer_class_init (GdkX11RendererClass *klass)
105 {
106   PangoXftRendererClass *xftrenderer_class = PANGO_XFT_RENDERER_CLASS (klass);
107   GObjectClass *object_class = G_OBJECT_CLASS (klass);
108   
109   xftrenderer_class->composite_glyphs = gdk_x11_renderer_composite_glyphs;
110   xftrenderer_class->composite_trapezoids = gdk_x11_renderer_composite_trapezoids;
111
112   object_class->finalize = gdk_x11_renderer_finalize;
113 }
114
115 PangoRenderer *
116 _gdk_x11_renderer_get (GdkDrawable *drawable,
117                        GdkGC       *gc)
118 {
119   GdkScreen *screen = GDK_DRAWABLE_IMPL_X11 (drawable)->screen;
120   GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (screen);
121   GdkX11Renderer *x11_renderer;
122
123   if (!screen_x11->renderer)
124     {
125       screen_x11->renderer = g_object_new (GDK_TYPE_X11_RENDERER,
126                                            "display", GDK_SCREEN_XDISPLAY (screen),
127                                            "screen",  GDK_SCREEN_XNUMBER (screen),
128                                            NULL);
129     }
130
131   x11_renderer = GDK_X11_RENDERER (screen_x11->renderer);
132
133   x11_renderer->drawable = drawable;
134   x11_renderer->gc = gc;
135
136   return screen_x11->renderer;
137 }
138
139 /**
140  * gdk_pango_context_get_for_screen:
141  * @screen: the #GdkScreen for which the context is to be created.
142  * 
143  * Creates a #PangoContext for @screen.
144  *
145  * The context must be freed when you're finished with it.
146  * 
147  * When using GTK+, normally you should use gtk_widget_get_pango_context()
148  * instead of this function, to get the appropriate context for
149  * the widget you intend to render text onto.
150  * 
151  * Return value: a new #PangoContext for @screen
152  *
153  * Since: 2.2
154  **/
155 PangoContext *
156 gdk_pango_context_get_for_screen (GdkScreen *screen)
157 {
158   PangoContext *context;
159   
160   g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
161
162   if (screen->closed)
163     return NULL;
164   
165   context = pango_xft_get_context (GDK_SCREEN_XDISPLAY (screen),
166                                    GDK_SCREEN_X11 (screen)->screen_num);
167   
168   g_object_set_data (G_OBJECT (context), "gdk-pango-screen", screen);
169   
170   return context;
171 }
172
173 #define __GDK_PANGO_X11_C__
174 #include "gdkaliasdef.c"