Split RrPaint to RrPaint and RrPaintPixmap, so you can paint things other than window...
[mikachu/openbox.git] / render / render.h
1 /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
2
3    render.h for the Openbox window manager
4    Copyright (c) 2006        Mikael Magnusson
5    Copyright (c) 2003-2007   Dana Jansens
6    Copyright (c) 2003        Derek Foreman
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    See the COPYING file for a copy of the GNU General Public License.
19 */
20
21 #ifndef __render_h
22 #define __render_h
23
24 #include "geom.h"
25 #include "version.h"
26
27 #include <X11/Xlib.h> /* some platforms dont include this as needed for Xft */
28 #include <pango/pangoxft.h>
29 #include <glib.h>
30
31 G_BEGIN_DECLS
32
33 typedef union  _RrTextureData      RrTextureData;
34 typedef struct _RrAppearance       RrAppearance;
35 typedef struct _RrSurface          RrSurface;
36 typedef struct _RrFont             RrFont;
37 typedef struct _RrTexture          RrTexture;
38 typedef struct _RrTextureMask      RrTextureMask;
39 typedef struct _RrTextureRGBA      RrTextureRGBA;
40 typedef struct _RrTextureText      RrTextureText;
41 typedef struct _RrTextureLineArt   RrTextureLineArt;
42 typedef struct _RrPixmapMask       RrPixmapMask;
43 typedef struct _RrInstance         RrInstance;
44 typedef struct _RrColor            RrColor;
45
46 typedef guint32 RrPixel32;
47 typedef guint16 RrPixel16;
48
49 typedef enum {
50     RR_RELIEF_FLAT,
51     RR_RELIEF_RAISED,
52     RR_RELIEF_SUNKEN
53 } RrReliefType;
54
55 typedef enum {
56     RR_BEVEL_1,
57     RR_BEVEL_2
58 } RrBevelType;
59
60 typedef enum {
61     RR_SURFACE_NONE,
62     RR_SURFACE_PARENTREL,
63     RR_SURFACE_SOLID,
64     RR_SURFACE_SPLIT_VERTICAL,
65     RR_SURFACE_HORIZONTAL,
66     RR_SURFACE_VERTICAL,
67     RR_SURFACE_DIAGONAL,
68     RR_SURFACE_CROSS_DIAGONAL,
69     RR_SURFACE_PYRAMID,
70     RR_SURFACE_MIRROR_HORIZONTAL
71 } RrSurfaceColorType;
72
73 typedef enum {
74     RR_TEXTURE_NONE,
75     RR_TEXTURE_MASK,
76     RR_TEXTURE_TEXT,
77     RR_TEXTURE_LINE_ART,
78     RR_TEXTURE_RGBA
79 } RrTextureType;
80
81 typedef enum {
82     RR_JUSTIFY_LEFT,
83     RR_JUSTIFY_CENTER,
84     RR_JUSTIFY_RIGHT
85 } RrJustify;
86
87 typedef enum {
88     RR_FONTWEIGHT_LIGHT,
89     RR_FONTWEIGHT_NORMAL,
90     RR_FONTWEIGHT_SEMIBOLD,
91     RR_FONTWEIGHT_BOLD,
92     RR_FONTWEIGHT_ULTRABOLD
93 } RrFontWeight;
94
95 typedef enum {
96     RR_FONTSLANT_NORMAL,
97     RR_FONTSLANT_ITALIC,
98     RR_FONTSLANT_OBLIQUE
99 } RrFontSlant;
100
101 struct _RrSurface {
102     RrSurfaceColorType grad;
103     RrReliefType relief;
104     RrBevelType bevel;
105     RrColor *primary;
106     RrColor *secondary;
107     RrColor *border_color;
108     RrColor *bevel_dark; 
109     RrColor *bevel_light;
110     RrColor *interlace_color;
111     gboolean interlaced;
112     gboolean border;
113     RrAppearance *parent;
114     gint parentx;
115     gint parenty;
116     RrPixel32 *pixel_data;
117 };
118
119 struct _RrTextureText {
120     RrFont *font;
121     RrJustify justify;
122     RrColor *color;
123     gchar *string;
124     gint shadow_offset_x;
125     gint shadow_offset_y;
126     RrColor *shadow_color;
127     gchar shadow_alpha;
128 };
129
130 struct _RrPixmapMask {
131     const RrInstance *inst;
132     Pixmap mask;
133     gint width;
134     gint height;
135     gchar *data;
136 };
137
138 struct _RrTextureMask {
139     RrColor *color;
140     RrPixmapMask *mask;
141 };
142
143 struct _RrTextureRGBA {
144     gint width;
145     gint height;
146     RrPixel32 *data;
147 /* cached scaled so we don't have to scale often */
148     gint cwidth;
149     gint cheight;
150     RrPixel32 *cache;
151 };
152
153 struct _RrTextureLineArt {
154     RrColor *color;
155     gint x1;
156     gint y1;
157     gint x2;
158     gint y2;
159 };
160
161 union _RrTextureData {
162     RrTextureRGBA rgba;
163     RrTextureText text;
164     RrTextureMask mask;
165     RrTextureLineArt lineart;
166 };
167
168 struct _RrTexture {
169     RrTextureType type;
170     RrTextureData data;
171 };
172
173 struct _RrAppearance {
174     const RrInstance *inst;
175
176     RrSurface surface;
177     gint textures;
178     RrTexture *texture;
179     Pixmap pixmap;
180     XftDraw *xftdraw;
181
182     /* cached for internal use */
183     gint w, h;
184 };
185
186 /* these are the same on all endian machines because it seems to be dependant
187    on the endianness of the gfx card, not the cpu. */
188 #define RrDefaultAlphaOffset 24
189 #define RrDefaultRedOffset 16
190 #define RrDefaultGreenOffset 8
191 #define RrDefaultBlueOffset 0
192
193 #define RrDefaultFontFamily       "arial,sans"
194 #define RrDefaultFontSize         8
195 #define RrDefaultFontWeight       RR_FONTWEIGHT_NORMAL
196 #define RrDefaultFontSlant        RR_FONTSLANT_NORMAL
197
198 RrInstance* RrInstanceNew (Display *display, gint screen);
199 void        RrInstanceFree (RrInstance *inst);
200
201 Display* RrDisplay      (const RrInstance *inst);
202 gint     RrScreen       (const RrInstance *inst);
203 Window   RrRootWindow   (const RrInstance *inst);
204 Visual*  RrVisual       (const RrInstance *inst);
205 gint     RrDepth        (const RrInstance *inst);
206 Colormap RrColormap     (const RrInstance *inst);
207 gint     RrRedOffset    (const RrInstance *inst);
208 gint     RrGreenOffset  (const RrInstance *inst);
209 gint     RrBlueOffset   (const RrInstance *inst);
210 gint     RrRedShift     (const RrInstance *inst);
211 gint     RrGreenShift   (const RrInstance *inst);
212 gint     RrBlueShift    (const RrInstance *inst);
213 gint     RrRedMask      (const RrInstance *inst);
214 gint     RrGreenMask    (const RrInstance *inst);
215 gint     RrBlueMask     (const RrInstance *inst);
216
217 RrColor *RrColorNew   (const RrInstance *inst, gint r, gint g, gint b);
218 RrColor *RrColorParse (const RrInstance *inst, gchar *colorname);
219 void     RrColorFree  (RrColor *in);
220
221 gint     RrColorRed   (const RrColor *c);
222 gint     RrColorGreen (const RrColor *c);
223 gint     RrColorBlue  (const RrColor *c);
224 gulong   RrColorPixel (const RrColor *c);
225 GC       RrColorGC    (RrColor *c);
226
227 RrAppearance *RrAppearanceNew  (const RrInstance *inst, gint numtex);
228 RrAppearance *RrAppearanceCopy (RrAppearance *a);
229 void          RrAppearanceFree (RrAppearance *a);
230
231 RrFont *RrFontOpen          (const RrInstance *inst, gchar *name, gint size,
232                              RrFontWeight weight, RrFontSlant slant);
233 RrFont *RrFontOpenDefault   (const RrInstance *inst);
234 void    RrFontClose         (RrFont *f);
235 RrSize *RrFontMeasureString (const RrFont *f, const gchar *str,
236                              gint shadow_offset_x, gint shadow_offset_y);
237 gint    RrFontHeight        (const RrFont *f, gint shadow_offset_y);
238 gint    RrFontMaxCharWidth  (const RrFont *f);
239
240 /* Paint into the appearance. The old pixmap is returned (if there was one). It
241    is the responsibility of the caller to call XFreePixmap on the return when
242    it is non-null. */
243 Pixmap RrPaintPixmap (RrAppearance *a, gint w, gint h);
244 void   RrPaint       (RrAppearance *a, Window win, gint w, gint h);
245 void   RrMinsize     (RrAppearance *a, gint *w, gint *h);
246 void   RrMargins     (RrAppearance *a, gint *l, gint *t, gint *r, gint *b);
247
248 gboolean RrPixmapToRGBA(const RrInstance *inst,
249                         Pixmap pmap, Pixmap mask,
250                         gint *w, gint *h, RrPixel32 **data);
251
252 G_END_DECLS
253
254 #endif /*__render_h*/