when resizing images, pick a source image with the same aspect ratio if possible
[dana/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 _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
50 typedef guint32 RrPixel32;
51 typedef guint16 RrPixel16;
52 typedef guchar  RrPixel8;
53
54 typedef enum {
55     RR_RELIEF_FLAT,
56     RR_RELIEF_RAISED,
57     RR_RELIEF_SUNKEN
58 } RrReliefType;
59
60 typedef enum {
61     RR_BEVEL_1,
62     RR_BEVEL_2
63 } RrBevelType;
64
65 typedef enum {
66     RR_SURFACE_NONE,
67     RR_SURFACE_PARENTREL,
68     RR_SURFACE_SOLID,
69     RR_SURFACE_SPLIT_VERTICAL,
70     RR_SURFACE_HORIZONTAL,
71     RR_SURFACE_VERTICAL,
72     RR_SURFACE_DIAGONAL,
73     RR_SURFACE_CROSS_DIAGONAL,
74     RR_SURFACE_PYRAMID,
75     RR_SURFACE_MIRROR_HORIZONTAL
76 } RrSurfaceColorType;
77
78 typedef enum {
79     RR_TEXTURE_NONE,
80     RR_TEXTURE_MASK,
81     RR_TEXTURE_TEXT,
82     RR_TEXTURE_LINE_ART,
83     RR_TEXTURE_RGBA,
84     RR_TEXTURE_IMAGE
85 } RrTextureType;
86
87 typedef enum {
88     RR_JUSTIFY_LEFT,
89     RR_JUSTIFY_CENTER,
90     RR_JUSTIFY_RIGHT
91 } RrJustify;
92
93 /* Put middle first so it's the default */
94 typedef enum {
95     RR_ELLIPSIZE_MIDDLE,
96     RR_ELLIPSIZE_NONE,
97     RR_ELLIPSIZE_START,
98     RR_ELLIPSIZE_END
99 } RrEllipsizeMode;
100
101 typedef enum {
102     RR_FONTWEIGHT_LIGHT,
103     RR_FONTWEIGHT_NORMAL,
104     RR_FONTWEIGHT_SEMIBOLD,
105     RR_FONTWEIGHT_BOLD,
106     RR_FONTWEIGHT_ULTRABOLD
107 } RrFontWeight;
108
109 typedef enum {
110     RR_FONTSLANT_NORMAL,
111     RR_FONTSLANT_ITALIC,
112     RR_FONTSLANT_OBLIQUE
113 } RrFontSlant;
114
115 struct _RrSurface {
116     RrSurfaceColorType grad;
117     RrReliefType relief;
118     RrBevelType bevel;
119     RrColor *primary;
120     RrColor *secondary;
121     RrColor *border_color;
122     RrColor *bevel_dark;
123     RrColor *bevel_light;
124     RrColor *interlace_color;
125     gboolean interlaced;
126     gboolean border;
127     RrAppearance *parent;
128     gint parentx;
129     gint parenty;
130     RrPixel32 *pixel_data;
131     gint bevel_dark_adjust;  /* 0-255, default is 64 */
132     gint bevel_light_adjust; /* 0-255, default is 128 */
133     RrColor *split_primary;
134     RrColor *split_secondary;
135 };
136
137 struct _RrTextureText {
138     RrFont *font;
139     RrJustify justify;
140     RrColor *color;
141     const gchar *string;
142     gint shadow_offset_x;
143     gint shadow_offset_y;
144     RrColor *shadow_color;
145     gboolean shortcut; /*!< Underline a character */
146     guint shortcut_pos; /*!< Position in bytes of the character to underline */
147     RrEllipsizeMode ellipsize;
148     gboolean flow; /* allow multiple lines.  must set maxwidth below */
149     gint maxwidth;
150     guchar shadow_alpha; /* at the bottom to improve alignment */
151 };
152
153 struct _RrPixmapMask {
154     const RrInstance *inst;
155     Pixmap mask;
156     gint width;
157     gint height;
158     gchar *data;
159 };
160
161 struct _RrTextureMask {
162     RrColor *color;
163     RrPixmapMask *mask;
164 };
165
166 struct _RrTextureRGBA {
167     gint width;
168     gint height;
169     gint alpha;
170     RrPixel32 *data;
171     /* size and position to draw at (if these are zero, then it will be
172        drawn to fill the entire texture */
173     gint tx;
174     gint ty;
175     gint twidth;
176     gint theight;
177 };
178
179 struct _RrTextureImage {
180     RrImage *image;
181     gint alpha;
182     /* size and position to draw at (if these are zero, then it will be
183        drawn to fill the entire texture */
184     gint tx;
185     gint ty;
186     gint twidth;
187     gint theight;
188 };
189
190 struct _RrTextureLineArt {
191     RrColor *color;
192     gint x1;
193     gint y1;
194     gint x2;
195     gint y2;
196 };
197
198 union _RrTextureData {
199     RrTextureRGBA rgba;
200     RrTextureImage image;
201     RrTextureText text;
202     RrTextureMask mask;
203     RrTextureLineArt lineart;
204 };
205
206 struct _RrTexture {
207     /* If changing the type of a texture, you should DEFINITELY call
208        RrAppearanceClearTextures() first! */
209     RrTextureType type;
210     RrTextureData data;
211 };
212
213 struct _RrAppearance {
214     const RrInstance *inst;
215
216     RrSurface surface;
217     gint textures;
218     RrTexture *texture;
219     Pixmap pixmap;
220     XftDraw *xftdraw;
221
222     /* cached for internal use */
223     gint w, h;
224 };
225
226 /*! Holds a RGBA image picture */
227 struct _RrImagePic {
228     gint width, height;
229     RrPixel32 *data;
230 };
231
232 /*! An RrImage is a sort of meta-image.  It can contain multiple versions of
233   an image at different sizes, which may or may not be completely different
234   pictures */
235 struct _RrImage {
236     gint ref;
237     struct _RrImageCache *cache;
238
239     struct _RrImagePic **original;
240     gint n_original;
241     struct _RrImagePic **resized;
242     gint n_resized;
243 };
244
245 /* these are the same on all endian machines because it seems to be dependant
246    on the endianness of the gfx card, not the cpu. */
247 #define RrDefaultAlphaOffset 24
248 #define RrDefaultRedOffset 16
249 #define RrDefaultGreenOffset 8
250 #define RrDefaultBlueOffset 0
251
252 #define RrDefaultFontFamily       "arial,sans"
253 #define RrDefaultFontSize         8
254 #define RrDefaultFontWeight       RR_FONTWEIGHT_NORMAL
255 #define RrDefaultFontSlant        RR_FONTSLANT_NORMAL
256
257 RrInstance* RrInstanceNew (Display *display, gint screen);
258 void        RrInstanceFree (RrInstance *inst);
259
260 Display* RrDisplay      (const RrInstance *inst);
261 gint     RrScreen       (const RrInstance *inst);
262 Window   RrRootWindow   (const RrInstance *inst);
263 Visual*  RrVisual       (const RrInstance *inst);
264 gint     RrDepth        (const RrInstance *inst);
265 Colormap RrColormap     (const RrInstance *inst);
266 gint     RrRedOffset    (const RrInstance *inst);
267 gint     RrGreenOffset  (const RrInstance *inst);
268 gint     RrBlueOffset   (const RrInstance *inst);
269 gint     RrRedShift     (const RrInstance *inst);
270 gint     RrGreenShift   (const RrInstance *inst);
271 gint     RrBlueShift    (const RrInstance *inst);
272 gint     RrRedMask      (const RrInstance *inst);
273 gint     RrGreenMask    (const RrInstance *inst);
274 gint     RrBlueMask     (const RrInstance *inst);
275
276 RrColor *RrColorNew   (const RrInstance *inst, gint r, gint g, gint b);
277 RrColor *RrColorParse (const RrInstance *inst, gchar *colorname);
278 void     RrColorFree  (RrColor *in);
279
280 gint     RrColorRed   (const RrColor *c);
281 gint     RrColorGreen (const RrColor *c);
282 gint     RrColorBlue  (const RrColor *c);
283 gulong   RrColorPixel (const RrColor *c);
284 GC       RrColorGC    (RrColor *c);
285
286 RrAppearance *RrAppearanceNew  (const RrInstance *inst, gint numtex);
287 RrAppearance *RrAppearanceCopy (RrAppearance *a);
288 void          RrAppearanceFree (RrAppearance *a);
289 void          RrAppearanceRemoveTextures(RrAppearance *a);
290 void          RrAppearanceAddTextures(RrAppearance *a, gint numtex);
291 /*! Always call this when changing the type of a texture in an appearance */
292 void          RrAppearanceClearTextures(RrAppearance *a);
293
294 RrFont *RrFontOpen          (const RrInstance *inst, const gchar *name,
295                              gint size, RrFontWeight weight, RrFontSlant slant);
296 RrFont *RrFontOpenDefault   (const RrInstance *inst);
297 void    RrFontClose         (RrFont *f);
298 RrSize *RrFontMeasureString (const RrFont *f, const gchar *str,
299                              gint shadow_offset_x, gint shadow_offset_y,
300                              gboolean flow, gint maxwidth);
301 gint    RrFontHeight        (const RrFont *f, gint shadow_offset_y);
302 gint    RrFontMaxCharWidth  (const RrFont *f);
303
304 /* Paint into the appearance. The old pixmap is returned (if there was one). It
305    is the responsibility of the caller to call XFreePixmap on the return when
306    it is non-null. */
307 Pixmap RrPaintPixmap (RrAppearance *a, gint w, gint h);
308 void   RrPaint       (RrAppearance *a, Window win, gint w, gint h);
309 void   RrMinSize     (RrAppearance *a, gint *w, gint *h);
310 gint   RrMinWidth    (RrAppearance *a);
311 /* For text textures, if flow is TRUE, then the string must be set before
312    calling this, otherwise it doesn't need to be */
313 gint   RrMinHeight   (RrAppearance *a);
314 void   RrMargins     (RrAppearance *a, gint *l, gint *t, gint *r, gint *b);
315
316 gboolean RrPixmapToRGBA(const RrInstance *inst,
317                         Pixmap pmap, Pixmap mask,
318                         gint *w, gint *h, RrPixel32 **data);
319
320 RrImageCache* RrImageCacheNew();
321 void          RrImageCacheRef(RrImageCache *self);
322 void          RrImageCacheUnref(RrImageCache *self);
323
324 /*! Finds an image in the cache, if it is already in there */
325 RrImage*      RrImageCacheFind(RrImageCache *self,
326                                RrPixel32 *data, gint w, gint h);
327
328 RrImage* RrImageNew(RrImageCache *cache);
329 void     RrImageRef(RrImage *im);
330 void     RrImageUnref(RrImage *im);
331
332 void     RrImageAddPicture(RrImage *im, RrPixel32 *data, gint w, gint h);
333 void     RrImageRemovePicture(RrImage *im, gint w, gint h);
334
335 G_END_DECLS
336
337 #endif /*__render_h*/