]> icculus.org git repositories - dana/openbox.git/blob - obrender/render.h
Adding RrButton to libobrender, ref counted appearances.
[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     gint ref;
226
227     RrSurface surface;
228     gint textures;
229     RrTexture *texture;
230     Pixmap pixmap;
231     XftDraw *xftdraw;
232
233     /* cached for internal use */
234     gint w, h;
235 };
236
237 /*! Holds a RGBA image picture */
238 struct _RrImagePic {
239     gint width, height;
240     RrPixel32 *data;
241     /* The sum of all the pixels.  This is used to compare pictures if their
242        hashes match. */
243     gint sum;
244     /* The name of the image.  This is used to determine
245        if the named image already is loaded.  May be NULL if the image
246        was not loaded from disk. */
247     gchar *name;
248 };
249
250 typedef void (*RrImageDestroyFunc)(RrImage *image, gpointer data);
251
252 /*! An RrImage is a sort of meta-image.  It can contain multiple versions of
253   an image at different sizes, which may or may not be completely different
254   pictures */
255 struct _RrImage {
256     gint ref;
257     RrImageCache *cache;
258
259     /*! An array of "originals", that is of RrPictures that have been added
260       to the image in various sizes, and that have not been resized.  These
261       are explicitly added to the RrImage. */
262     RrImagePic **original;
263     gint n_original;
264     /*! An array of "resized" pictures.  When an "original" RrPicture
265       needs to be resized for drawing, it is saved in here so that it doesn't
266       need to be resized again.  These are automatically added to the
267       RrImage. */
268     RrImagePic **resized;
269     gint n_resized;
270
271     /* This function (if not NULL) will be called just before destroying
272       RrImage. */
273     RrImageDestroyFunc destroy_func;
274     gpointer           destroy_data;
275 };
276
277 /* these are the same on all endian machines because it seems to be dependant
278    on the endianness of the gfx card, not the cpu. */
279 #define RrDefaultAlphaOffset 24
280 #define RrDefaultRedOffset 16
281 #define RrDefaultGreenOffset 8
282 #define RrDefaultBlueOffset 0
283
284 #define RrDefaultFontFamily       "arial,sans"
285 #define RrDefaultFontSize         8
286 #define RrDefaultFontWeight       RR_FONTWEIGHT_NORMAL
287 #define RrDefaultFontSlant        RR_FONTSLANT_NORMAL
288
289 RrInstance* RrInstanceNew (Display *display, gint screen);
290 void        RrInstanceFree (RrInstance *inst);
291
292 Display* RrDisplay      (const RrInstance *inst);
293 gint     RrScreen       (const RrInstance *inst);
294 Window   RrRootWindow   (const RrInstance *inst);
295 Visual*  RrVisual       (const RrInstance *inst);
296 gint     RrDepth        (const RrInstance *inst);
297 Colormap RrColormap     (const RrInstance *inst);
298 gint     RrRedOffset    (const RrInstance *inst);
299 gint     RrGreenOffset  (const RrInstance *inst);
300 gint     RrBlueOffset   (const RrInstance *inst);
301 gint     RrRedShift     (const RrInstance *inst);
302 gint     RrGreenShift   (const RrInstance *inst);
303 gint     RrBlueShift    (const RrInstance *inst);
304 gint     RrRedMask      (const RrInstance *inst);
305 gint     RrGreenMask    (const RrInstance *inst);
306 gint     RrBlueMask     (const RrInstance *inst);
307
308 RrColor *RrColorNew   (const RrInstance *inst, gint r, gint g, gint b);
309 RrColor *RrColorCopy  (RrColor *c);
310 RrColor *RrColorParse (const RrInstance *inst, gchar *colorname);
311 void     RrColorFree  (RrColor *in);
312
313 gint     RrColorRed   (const RrColor *c);
314 gint     RrColorGreen (const RrColor *c);
315 gint     RrColorBlue  (const RrColor *c);
316 gulong   RrColorPixel (const RrColor *c);
317 GC       RrColorGC    (RrColor *c);
318
319 RrAppearance *RrAppearanceNew  (const RrInstance *inst, gint numtex);
320 RrAppearance *RrAppearanceCopyShallow (RrAppearance *a);
321 RrAppearance *RrAppearanceCopy (RrAppearance *a);
322 void          RrAppearanceFree (RrAppearance *a);
323 void          RrAppearanceRemoveTextures(RrAppearance *a);
324 void          RrAppearanceAddTextures(RrAppearance *a, gint numtex);
325 /*! Always call this when changing the type of a texture in an appearance */
326 void          RrAppearanceClearTextures(RrAppearance *a);
327
328 RrButton *RrButtonNew (const RrInstance *inst);
329 void      RrButtonFree(RrButton *b);
330
331 RrFont *RrFontOpen          (const RrInstance *inst, const gchar *name,
332                              gint size, RrFontWeight weight, RrFontSlant slant);
333 RrFont *RrFontOpenDefault   (const RrInstance *inst);
334 void    RrFontClose         (RrFont *f);
335 /*! Returns an RrSize, that was allocated with g_slice_new().  Use g_slice_free() to
336   free it. */
337 RrSize *RrFontMeasureString (const RrFont *f, const gchar *str,
338                              gint shadow_offset_x, gint shadow_offset_y,
339                              gboolean flow, gint maxwidth);
340 gint    RrFontHeight        (const RrFont *f, gint shadow_offset_y);
341 gint    RrFontMaxCharWidth  (const RrFont *f);
342
343 /* Paint into the appearance. The old pixmap is returned (if there was one). It
344    is the responsibility of the caller to call XFreePixmap on the return when
345    it is non-null. */
346 Pixmap RrPaintPixmap (RrAppearance *a, gint w, gint h);
347 void   RrPaint       (RrAppearance *a, Window win, gint w, gint h);
348 void   RrMinSize     (RrAppearance *a, gint *w, gint *h);
349 gint   RrMinWidth    (RrAppearance *a);
350 /* For text textures, if flow is TRUE, then the string must be set before
351    calling this, otherwise it doesn't need to be */
352 gint   RrMinHeight   (RrAppearance *a);
353 void   RrMargins     (RrAppearance *a, gint *l, gint *t, gint *r, gint *b);
354
355 gboolean RrPixmapToRGBA(const RrInstance *inst,
356                         Pixmap pmap, Pixmap mask,
357                         gint *w, gint *h, RrPixel32 **data);
358
359 /*! Create a new image cache for RrImages.
360   @param max_resized_saved The number of resized copies of an image to save
361 */
362 RrImageCache* RrImageCacheNew(gint max_resized_saved);
363 void          RrImageCacheRef(RrImageCache *self);
364 void          RrImageCacheUnref(RrImageCache *self);
365
366 /*! Finds an image in the cache, if it is already in there */
367 RrImage*      RrImageCacheFind(RrImageCache *self,
368                                RrPixel32 *data, gint w, gint h);
369 /*! Finds an image in the cache, by searching for the name of the image */
370 RrImage*      RrImageCacheFindName(RrImageCache *self,
371                                    const gchar *name);
372
373 RrImage* RrImageNew(RrImageCache *cache);
374 void     RrImageRef(RrImage *im);
375 void     RrImageUnref(RrImage *im);
376
377 void     RrImageAddPicture(RrImage *im, const RrPixel32 *data, gint w, gint h);
378 /*! Adds a picture by name, from a file on disk. 
379   @name Can be a full path to an image, or it can be a name as per the
380         freedesktop.org icon spec. */
381 gboolean RrImageAddPictureName(RrImage *im, const gchar *name);
382 void     RrImageRemovePicture(RrImage *im, gint w, gint h);
383
384 G_END_DECLS
385
386 #endif /*__render_h*/