The BIG graph update
[rrdtool.git] / libraries / libart_lgpl-2.3.7 / art_render.h
1 /*
2  * art_render.h: Modular rendering architecture.
3  *
4  * Libart_LGPL - library of basic graphic primitives
5  * Copyright (C) 2000 Raph Levien
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public
18  * License along with this library; if not, write to the
19  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20  * Boston, MA 02111-1307, USA.
21  */
22
23 #ifndef __ART_RENDER_H__
24 #define __ART_RENDER_H__
25
26 #ifdef __cplusplus
27 extern "C" {
28 #endif /* __cplusplus */
29
30 /* Render object */
31
32 #ifndef ART_MAX_DEPTH
33 #define ART_MAX_DEPTH 16
34 #endif
35
36 #if ART_MAX_DEPTH == 16
37 typedef art_u16 ArtPixMaxDepth;
38 #define ART_PIX_MAX_FROM_8(x) ((x) | ((x) << 8))
39 #define ART_PIX_8_FROM_MAX(x) (((x) + 0x80 - (((x) + 0x80) >> 8)) >> 8)
40 #else
41 #if ART_MAX_DEPTH == 8
42 typedef art_u8 ArtPixMaxDepth;
43 #define ART_PIX_MAX_FROM_8(x) (x)
44 #define ART_PIX_8_FROM_MAX(x) (x)
45 #else
46 #error ART_MAX_DEPTH must be either 8 or 16
47 #endif
48 #endif
49
50 #define ART_MAX_CHAN 16
51
52 typedef struct _ArtRender ArtRender;
53 typedef struct _ArtRenderCallback ArtRenderCallback;
54 typedef struct _ArtRenderMaskRun ArtRenderMaskRun;
55 typedef struct _ArtImageSource ArtImageSource;
56 typedef struct _ArtMaskSource ArtMaskSource;
57
58 typedef enum {
59   ART_ALPHA_NONE      = 0,
60   ART_ALPHA_SEPARATE  = 1,
61   ART_ALPHA_PREMUL    = 2
62 } ArtAlphaType;
63
64 typedef enum {
65   ART_COMPOSITE_NORMAL,
66   ART_COMPOSITE_MULTIPLY,
67   /* todo: more */
68   ART_COMPOSITE_CUSTOM
69 } ArtCompositingMode;
70
71 typedef enum {
72   ART_IMAGE_SOURCE_CAN_CLEAR = 1,
73   ART_IMAGE_SOURCE_CAN_COMPOSITE = 2
74 } ArtImageSourceFlags;
75
76 struct _ArtRenderMaskRun {
77   int x;
78   int alpha;
79 };
80
81 struct _ArtRenderCallback {
82   void (*render) (ArtRenderCallback *self, ArtRender *render,
83                   art_u8 *dest, int y);
84   void (*done) (ArtRenderCallback *self, ArtRender *render);
85 };
86
87 struct _ArtImageSource {
88   ArtRenderCallback super;
89   void (*negotiate) (ArtImageSource *self, ArtRender *render,
90                      ArtImageSourceFlags *p_flags,
91                      int *p_buf_depth, ArtAlphaType *p_alpha_type);
92 };
93
94 struct _ArtMaskSource {
95   ArtRenderCallback super;
96   int (*can_drive) (ArtMaskSource *self, ArtRender *render);
97   /* For each mask source, ::prepare() is invoked if it is not
98      a driver, or ::invoke_driver() if it is. */
99   void (*invoke_driver) (ArtMaskSource *self, ArtRender *render);
100   void (*prepare) (ArtMaskSource *self, ArtRender *render, art_boolean first);
101 };
102
103 struct _ArtRender {
104   /* parameters of destination image */
105   int x0, y0;
106   int x1, y1;
107   art_u8 *pixels;
108   int rowstride;
109   int n_chan;
110   int depth;
111   ArtAlphaType alpha_type;
112
113   art_boolean clear;
114   ArtPixMaxDepth clear_color[ART_MAX_CHAN + 1];
115   art_u32 opacity; /* [0..0x10000] */
116
117   ArtCompositingMode compositing_mode;
118
119   ArtAlphaGamma *alphagamma;
120
121   art_u8 *alpha_buf;
122
123   /* parameters of intermediate buffer */
124   int buf_depth;
125   ArtAlphaType buf_alpha;
126   art_u8 *image_buf;
127
128   /* driving alpha scanline data */
129   /* A "run" is a contiguous sequence of x values with the same alpha value. */
130   int n_run;
131   ArtRenderMaskRun *run;
132
133   /* A "span" is a contiguous sequence of x values with non-zero alpha. */
134   int n_span;
135   int *span_x;
136
137   art_boolean need_span;
138 };
139
140 ArtRender *
141 art_render_new (int x0, int y0, int x1, int y1,
142                 art_u8 *pixels, int rowstride,
143                 int n_chan, int depth, ArtAlphaType alpha_type,
144                 ArtAlphaGamma *alphagamma);
145
146 void
147 art_render_invoke (ArtRender *render);
148
149 void
150 art_render_clear (ArtRender *render, const ArtPixMaxDepth *clear_color);
151
152 void
153 art_render_clear_rgb (ArtRender *render, art_u32 clear_rgb);
154
155 void
156 art_render_mask_solid (ArtRender *render, int opacity);
157
158 void
159 art_render_image_solid (ArtRender *render, ArtPixMaxDepth *color);
160
161 /* The next two functions are for custom mask sources only. */
162 void
163 art_render_add_mask_source (ArtRender *render, ArtMaskSource *mask_source);
164
165 void
166 art_render_invoke_callbacks (ArtRender *render, art_u8 *dest, int y);
167
168 /* The following function is for custom image sources only. */
169 void
170 art_render_add_image_source (ArtRender *render, ArtImageSource *image_source);
171
172 #ifdef __cplusplus
173 }
174 #endif /* __cplusplus */
175
176 #endif /* __ART_RENDER_H__ */
177