dad3c540713afee263f2bb2f0caf94422a916dd9
[dana/openbox.git] / obrender / 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 <X11/Xlib.h> /* some platforms dont include this as needed for Xft */
25 #include <pango/pangoxft.h>
26 #include <glib.h>
27
28 G_BEGIN_DECLS
29
30 #include "obrender/geom.h"
31 #include "obrender/version.h"
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 _RrTextureImage     RrTextureImage;
41 typedef struct _RrTextureText      RrTextureText;
42 typedef struct _RrTextureLineArt   RrTextureLineArt;
43 typedef struct _RrPixmapMask       RrPixmapMask;
44 typedef struct _RrInstance         RrInstance;
45 typedef struct _RrColor            RrColor;
46 typedef struct _RrImage            RrImage;
47 typedef struct _RrImagePic         RrImagePic;
48 typedef struct _RrImageCache       RrImageCache;
49 typedef struct _RrButton           RrButton;
50
51 typedef guint32 RrPixel32;
52 typedef guint16 RrPixel16;
53 typedef guchar  RrPixel8;
54
55 typedef enum {
56     RR_RELIEF_FLAT,
57     RR_RELIEF_RAISED,
58     RR_RELIEF_SUNKEN,
59     RR_RELIEF_NUM_TYPES
60 } RrReliefType;
61
62 typedef enum {
63     RR_BEVEL_1,
64     RR_BEVEL_2,
65     RR_BEVEL_NUM_TYPES
66 } RrBevelType;
67
68 typedef enum {
69     RR_SURFACE_NONE,
70     RR_SURFACE_PARENTREL,
71     RR_SURFACE_SOLID,
72     RR_SURFACE_SPLIT_VERTICAL,
73     RR_SURFACE_HORIZONTAL,
74     RR_SURFACE_VERTICAL,
75     RR_SURFACE_DIAGONAL,
76     RR_SURFACE_CROSS_DIAGONAL,
77     RR_SURFACE_PYRAMID,
78     RR_SURFACE_MIRROR_HORIZONTAL,
79     RR_SURFACE_NUM_TYPES
80 } RrSurfaceColorType;
81
82 typedef enum {
83     RR_TEXTURE_NONE,
84     RR_TEXTURE_MASK,
85     RR_TEXTURE_TEXT,
86     RR_TEXTURE_LINE_ART,
87     RR_TEXTURE_RGBA,
88     RR_TEXTURE_IMAGE,
89     RR_TEXTURE_NUM_TYPES
90 } RrTextureType;
91
92 typedef enum {
93     RR_JUSTIFY_LEFT,
94     RR_JUSTIFY_CENTER,
95     RR_JUSTIFY_RIGHT,
96     RR_JUSTIFY_NUM_TYPES
97 } RrJustify;
98
99 /* Put middle first so it's the default */
100 typedef enum {
101     RR_ELLIPSIZE_MIDDLE,
102     RR_ELLIPSIZE_NONE,
103     RR_ELLIPSIZE_START,
104     RR_ELLIPSIZE_END,
105     RR_ELLIPSIZE_NUM_TYPES
106 } RrEllipsizeMode;
107
108 typedef enum {
109     RR_FONTWEIGHT_LIGHT,
110     RR_FONTWEIGHT_NORMAL,
111     RR_FONTWEIGHT_SEMIBOLD,
112     RR_FONTWEIGHT_BOLD,
113     RR_FONTWEIGHT_ULTRABOLD,
114     RR_FONTWEIGHT_NUM_TYPES
115 } RrFontWeight;
116
117 typedef enum {
118     RR_FONTSLANT_NORMAL,
119     RR_FONTSLANT_ITALIC,
120     RR_FONTSLANT_OBLIQUE,
121     RR_FONTSLANT_NUM_TYPES
122 } RrFontSlant;
123
124 struct _RrSurface {
125     RrSurfaceColorType grad;
126     RrReliefType relief;
127     RrBevelType bevel;
128     RrColor *primary;
129     RrColor *secondary;
130     RrColor *border_color;
131     RrColor *bevel_dark;
132     RrColor *bevel_light;
133     RrColor *interlace_color;
134     gboolean interlaced;
135     gboolean border;
136     RrAppearance *parent;
137     gint parentx;
138     gint parenty;
139     RrPixel32 *pixel_data;
140     gint bevel_dark_adjust;  /* 0-255, default is 64 */
141     gint bevel_light_adjust; /* 0-255, default is 128 */
142     RrColor *split_primary;
143     RrColor *split_secondary;
144 };
145
146 struct _RrTextureText {
147     RrFont *font;
148     RrJustify justify;
149     RrColor *color;
150     const gchar *string;
151     gint shadow_offset_x;
152     gint shadow_offset_y;
153     RrColor *shadow_color;
154     gboolean shortcut; /*!< Underline a character */
155     guint shortcut_pos; /*!< Position in bytes of the character to underline */
156     RrEllipsizeMode ellipsize;
157     gboolean flow; /* allow multiple lines.  must set maxwidth below */
158     gint maxwidth;
159     guchar shadow_alpha; /* at the bottom to improve alignment */
160 };
161
162 struct _RrPixmapMask {
163     const RrInstance *inst;
164     Pixmap mask;
165     gint width;
166     gint height;
167     gchar *data;
168 };
169
170 struct _RrTextureMask {
171     RrColor *color;
172     RrPixmapMask *mask;
173 };
174
175 struct _RrTextureRGBA {
176     gint width;
177     gint height;
178     gint alpha;
179     RrPixel32 *data;
180     /* size and position to draw at (if these are zero, then it will be
181        drawn to fill the entire texture */
182     gint tx;
183     gint ty;
184     gint twidth;
185     gint theight;
186 };
187
188 struct _RrTextureImage {
189     RrImage *image;
190     gint alpha;
191     /* size and position to draw at (if these are zero, then it will be
192        drawn to fill the entire texture */
193     gint tx;
194     gint ty;
195     gint twidth;
196     gint theight;
197 };
198
199 struct _RrTextureLineArt {
200     RrColor *color;
201     gint x1;
202     gint y1;
203     gint x2;
204     gint y2;
205 };
206
207 union _RrTextureData {
208     RrTextureRGBA rgba;
209     RrTextureImage image;
210     RrTextureText text;
211     RrTextureMask mask;
212     RrTextureLineArt lineart;
213 };
214
215 struct _RrTexture {
216     /* If changing the type of a texture, you should DEFINITELY call
217        RrAppearanceClearTextures() first! */
218     RrTextureType type;
219     RrTextureData data;
220 };
221
222 struct _RrAppearance {
223     const RrInstance *inst;
224     
225     RrSurface surface;
226     gint textures;
227     RrTexture *texture;
228     Pixmap pixmap;
229     XftDraw *xftdraw;
230
231     /* cached for internal use */
232     gint w, h;
233 };
234
235 /*! Holds a RGBA image picture */
236 struct _RrImagePic {
237     gint width, height;
238     RrPixel32 *data;
239     /* The sum of all the pixels.  This is used to compare pictures if their
240        hashes match. */
241     gint sum;
242     /* The name of the image.  This is used to determine
243        if the named image already is loaded.  May be NULL if the image
244        was not loaded from disk. */
245     gchar *name;
246 };
247
248 typedef void (*RrImageDestroyFunc)(RrImage *image, gpointer data);
249
250 /*! An RrImage is a sort of meta-image.  It can contain multiple versions of
251   an image at different sizes, which may or may not be completely different
252   pictures */
253 struct _RrImage {
254     gint ref;
255     RrImageCache *cache;
256
257     /*! An array of "originals", that is of RrPictures that have been added
258       to the image in various sizes, and that have not been resized.  These
259       are explicitly added to the RrImage. */
260     RrImagePic **original;
261     gint n_original;
262     /*! An array of "resized" pictures.  When an "original" RrPicture
263       needs to be resized for drawing, it is saved in here so that it doesn't
264       need to be resized again.  These are automatically added to the
265       RrImage. */
266     RrImagePic **resized;
267     gint n_resized;
268
269     /* This function (if not NULL) will be called just before destroying
270       RrImage. */
271     RrImageDestroyFunc destroy_func;
272     gpointer           destroy_data;
273 };
274
275 /* these are the same on all endian machines because it seems to be dependant
276    on the endianness of the gfx card, not the cpu. */
277 #define RrDefaultAlphaOffset 24
278 #define RrDefaultRedOffset 16
279 #define RrDefaultGreenOffset 8
280 #define RrDefaultBlueOffset 0
281
282 #define RrDefaultFontFamily       "arial,sans"
283 #define RrDefaultFontSize         8
284 #define RrDefaultFontWeight       RR_FONTWEIGHT_NORMAL
285 #define RrDefaultFontSlant        RR_FONTSLANT_NORMAL
286
287 RrInstance* RrInstanceNew (Display *display, gint screen);
288 void        RrInstanceFree (RrInstance *inst);
289
290 Display* RrDisplay      (const RrInstance *inst);
291 gint     RrScreen       (const RrInstance *inst);
292 Window   RrRootWindow   (const RrInstance *inst);
293 Visual*  RrVisual       (const RrInstance *inst);
294 gint     RrDepth        (const RrInstance *inst);
295 Colormap RrColormap     (const RrInstance *inst);
296 gint     RrRedOffset    (const RrInstance *inst);
297 gint     RrGreenOffset  (const RrInstance *inst);
298 gint     RrBlueOffset   (const RrInstance *inst);
299 gint     RrRedShift     (const RrInstance *inst);
300 gint     RrGreenShift   (const RrInstance *inst);
301 gint     RrBlueShift    (const RrInstance *inst);
302 gint     RrRedMask      (const RrInstance *inst);
303 gint     RrGreenMask    (const RrInstance *inst);
304 gint     RrBlueMask     (const RrInstance *inst);
305
306 RrColor *RrColorNew   (const RrInstance *inst, gint r, gint g, gint b);
307 RrColor *RrColorCopy  (RrColor *c);
308 RrColor *RrColorParse (const RrInstance *inst, gchar *colorname);
309 void     RrColorFree  (RrColor *in);
310
311 gint     RrColorRed   (const RrColor *c);
312 gint     RrColorGreen (const RrColor *c);
313 gint     RrColorBlue  (const RrColor *c);
314 gulong   RrColorPixel (const RrColor *c);
315 GC       RrColorGC    (RrColor *c);
316
317 RrAppearance *RrAppearanceNew  (const RrInstance *inst, gint numtex);
318 RrAppearance *RrAppearanceCopy (RrAppearance *a);
319 void          RrAppearanceFree (RrAppearance *a);
320 void          RrAppearanceRemoveTextures(RrAppearance *a);
321 void          RrAppearanceAddTextures(RrAppearance *a, gint numtex);
322 /*! Always call this when changing the type of a texture in an appearance */
323 void          RrAppearanceClearTextures(RrAppearance *a);
324
325 RrButton *RrButtonNew (const RrInstance *inst);
326 void      RrButtonFree(RrButton *b);
327
328 RrFont *RrFontOpen          (const RrInstance *inst, const gchar *name,
329                              gint size, RrFontWeight weight, RrFontSlant slant);
330 RrFont *RrFontOpenDefault   (const RrInstance *inst);
331 void    RrFontClose         (RrFont *f);
332 /*! Returns an RrSize, that was allocated with g_slice_new().  Use g_slice_free() to
333   free it. */
334 RrSize *RrFontMeasureString (const RrFont *f, const gchar *str,
335                              gint shadow_offset_x, gint shadow_offset_y,
336                              gboolean flow, gint maxwidth);
337 gint    RrFontHeight        (const RrFont *f, gint shadow_offset_y);
338 gint    RrFontMaxCharWidth  (const RrFont *f);
339
340 /* Paint into the appearance. The old pixmap is returned (if there was one). It
341    is the responsibility of the caller to call XFreePixmap on the return when
342    it is non-null. */
343 Pixmap RrPaintPixmap (RrAppearance *a, gint w, gint h);
344 void   RrPaint       (RrAppearance *a, Window win, gint w, gint h);
345 void   RrMinSize     (RrAppearance *a, gint *w, gint *h);
346 gint   RrMinWidth    (RrAppearance *a);
347 /* For text textures, if flow is TRUE, then the string must be set before
348    calling this, otherwise it doesn't need to be */
349 gint   RrMinHeight   (RrAppearance *a);
350 void   RrMargins     (RrAppearance *a, gint *l, gint *t, gint *r, gint *b);
351
352 gboolean RrPixmapToRGBA(const RrInstance *inst,
353                         Pixmap pmap, Pixmap mask,
354                         gint *w, gint *h, RrPixel32 **data);
355
356 /*! Create a new image cache for RrImages.
357   @param max_resized_saved The number of resized copies of an image to save
358 */
359 RrImageCache* RrImageCacheNew(gint max_resized_saved);
360 void          RrImageCacheRef(RrImageCache *self);
361 void          RrImageCacheUnref(RrImageCache *self);
362
363 /*! Finds an image in the cache, if it is already in there */
364 RrImage*      RrImageCacheFind(RrImageCache *self,
365                                RrPixel32 *data, gint w, gint h);
366 /*! Finds an image in the cache, by searching for the name of the image */
367 RrImage*      RrImageCacheFindName(RrImageCache *self,
368                                    const gchar *name);
369
370 RrImage* RrImageNew(RrImageCache *cache);
371 void     RrImageRef(RrImage *im);
372 void     RrImageUnref(RrImage *im);
373
374 void     RrImageAddPicture(RrImage *im, const RrPixel32 *data, gint w, gint h);
375 /*! Adds a picture by name, from a file on disk. 
376   @name Can be a full path to an image, or it can be a name as per the
377         freedesktop.org icon spec. */
378 gboolean RrImageAddPictureName(RrImage *im, const gchar *name);
379 void     RrImageRemovePicture(RrImage *im, gint w, gint h);
380
381 G_END_DECLS
382
383 #endif /*__render_h*/