]> icculus.org git repositories - dana/openbox.git/blob - render2/render.h
fix a seg, fix the loop for rendering a string
[dana/openbox.git] / render2 / render.h
1 #ifndef __render_h__
2 #define __render_h__
3
4 #include <glib.h>
5 #include <X11/Xlib.h>
6
7 /* instances */
8
9 struct RrInstance;
10
11 /*! Returns a struct to be used when calling members of the library.
12   If the library fails to initialize, NULL is returned.
13   @param display The X Display to use.
14   @param screen The number of the screen to use.
15 */
16 struct RrInstance *RrInstanceNew(Display *display,
17                                  int screen);
18
19 /*! Destroys an instance of the library. The instance should not be used after
20   calling this function.
21   @param inst The instance to destroy.
22 */
23 void RrInstanceFree(struct RrInstance *inst);
24
25 int RrInstanceDepth(struct RrInstance *inst);
26 Colormap RrInstanceColormap(struct RrInstance *inst);
27 Visual *RrInstanceVisual(struct RrInstance *inst);
28
29 /* colors */
30
31 /*! A Color (including alpha component) for the Render library. This should be
32   treated as an opaque data type, and be accessed only via the available
33   functions. */
34 struct RrColor {
35     /*! The red component. */
36     float r;
37     /*! The green component. */
38     float g;
39     /*! The blue component. */
40     float b;
41     /*! The alpha component. */
42     float a;
43 };
44
45 /*! Returns if an RrColor is non-opaque */
46 #define RrColorHasAlpha(c) ((c).a > 0.0000001)
47
48 /*! Sets the values of all components for an RrColor */
49 #define RrColorSet(c, w, x, y, z) (c)->r = (w), (c)->g = (x), \
50                                   (c)->b = (y), (c)->a = z
51
52
53 /*! Gets color values from a colorname.
54   @param inst An instance of the library
55   @param colorname The name of the color.
56   @param ret The RrColor to set the colorvalues in.
57   @return nonzero if the colorname could be parsed; on error, it returns zero.
58 */
59 int RrColorParse(struct RrInstance *inst, const char *colorname,
60                  struct RrColor *ret);
61
62 /* fonts */
63
64 struct RrFont;
65
66 struct RrFont *RrFontOpen(struct RrInstance *inst, const char *fontstring);
67 void RrFontClose(struct RrFont *font);
68
69 int RrFontMeasureString(struct RrFont *font, const char *string);
70 int RrFontHeight(struct RrFont *font);
71 int RrFontMaxCharWidth(struct RrFont *font);
72
73 /* surfaces */
74
75 struct RrSurface;
76
77 enum RrSurfaceType {
78     RR_SURFACE_NONE,
79     RR_SURFACE_PLANAR,
80     RR_SURFACE_NONPLANAR
81 };
82
83 /*! Create a new RrSurface prototype that can't render. A prototype can be
84  copied to a new RrSurface that can render. */
85 struct RrSurface *RrSurfaceNewProto(enum RrSurfaceType type,
86                                     int numtex);
87 /*! Create a new top-level RrSurface for a Window. The new RrSurface defaults
88   to a non-visible state.*/
89 struct RrSurface *RrSurfaceNew(struct RrInstance *inst,
90                                enum RrSurfaceType type,
91                                Window win,
92                                int numtex);
93 /*! Create a new RrSurface which is a child of another. The new RrSurface
94   defaults to a visible state. */
95 struct RrSurface *RrSurfaceNewChild(enum RrSurfaceType type,
96                                     struct RrSurface *parent,
97                                     int numtex);
98 /*! Copy an RrSurface, creating a new top-level RrSurface for a Window. The
99   new RrSurface defaults to a non-visible state.*/
100 struct RrSurface *RrSurfaceCopy(struct RrInstance *inst,
101                                 struct RrSurface *sur,
102                                 Window win);
103 /*! Copy an RrSurface, creating a nwe RrSurface which is a child of another.
104   The new RrSurface defaults to a visible state.*/
105 struct RrSurface *RrSurfaceCopyChild(struct RrSurface *sur,
106                                      struct RrSurface *parent);
107 /*! Destroys an RrSurface. */
108 void RrSurfaceFree(struct RrSurface *sur);
109
110 void RrSurfaceSetArea(struct RrSurface *sur,
111                       int x,
112                       int y,
113                       int w,
114                       int h);
115 void RrSurfaceSetPos(struct RrSurface *sur,
116                      int x,
117                      int y);
118 void RrSurfaceSetSize(struct RrSurface *sur,
119                       int w,
120                       int h);
121
122 Window RrSurfaceWindow(struct RrSurface *sur);
123
124 void RrSurfaceShow(struct RrSurface *sur);
125 void RrSurfaceHide(struct RrSurface *sur);
126 int RrSurfaceVisible(struct RrSurface *sur);
127
128 void RrSurfaceMinSize(struct RrSurface *sur,
129                       int *w,
130                       int *h);
131
132 /*! Shape a surface to its children. This is not done implicitly inside the
133   library at *any* time. You must call this for each surface you want to
134   shape, when you want to update it. This means when you resize the surface
135   or change its base shape, or move/resize any of its children, you will need
136   to call this explicitly. Also, please note that you must call it on the
137   children surfaces first and work your way up to the top level surface for it
138   to function properly.
139 */
140 void RrSurfaceShape(struct RrSurface *sur);
141
142 /*! Set the base shape for a surface. To clear the base, pass 0 for all
143   of the arguments (except for the surface of course!)
144 */
145 void RrSurfaceShapeSetBase(struct RrSurface *sur,
146                            Window base,
147                            int x,
148                            int y);
149
150 /* planar surfaces */
151
152 /*! The options available for the background of an RrSurface */
153 enum RrSurfaceColorType {
154     /*! No rendering on the surface background, its contents will be
155       undefined. */
156     RR_PLANAR_NONE,
157     /*! Solid color fill. */
158     RR_PLANAR_SOLID,
159     /*! Horizontal gradient. */
160     RR_PLANAR_HORIZONTAL,
161     /*! Vertical gradient. */
162     RR_PLANAR_VERTICAL,
163     /*! Diagonal (TL->BR) gradient. */
164     RR_PLANAR_DIAGONAL,
165     /*! Cross-Diagonal (TR->BL) gradient. */
166     RR_PLANAR_CROSSDIAGONAL,
167     /*! Pipecross gradient. */
168     RR_PLANAR_PIPECROSS,
169     /*! Rectangle gradient. */
170     RR_PLANAR_RECTANGLE,
171     /*! Pyramid gradient. */
172     RR_PLANAR_PYRAMID
173 };
174
175 void RrPlanarSet(struct RrSurface *sur,
176                  enum RrSurfaceColorType type,
177                  struct RrColor *primary,
178                  struct RrColor *secondary);
179
180 /* textures */
181
182 enum RrLayout {
183     RR_TOP_LEFT,
184     RR_TOP,
185     RR_TOP_RIGHT,
186     RR_LEFT,
187     RR_CENTER,
188     RR_RIGHT,
189     RR_BOTTOM_LEFT,
190     RR_BOTTOM,
191     RR_BOTTOM_RIGHT
192 };
193
194 #ifndef __LONG64
195 typedef long RrData32;
196 #else
197 typedef int RrData32;
198 #endif
199
200 void RrTextureSetRGBA(struct RrSurface *sur,
201                       int texnum,
202                       RrData32 *data,
203                       int x,
204                       int y,
205                       int w,
206                       int h);
207 void RrTextureSetText(struct RrSurface *sur,
208                       int texnum,
209                       struct RrFont *font,
210                       enum RrLayout layout,
211                       const char *text);
212 void RrTextureSetNone(struct RrSurface *sur,
213                       int texnum);
214
215 /* drawing */
216
217 /*! Paints the surface, and all its children */
218 void RrPaint(struct RrSurface *sur);
219
220 void RrExpose(struct RrInstance *inst, XExposeEvent *e);
221
222 #endif