new function list_deep_free
[swftools.git] / lib / art / 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 LIBART_COMPILATION
27 #include "art_alphagamma.h"
28 #else
29 #include "art_alphagamma.h"
30 #endif
31
32 #ifdef __cplusplus
33 extern "C" {
34 #endif /* __cplusplus */
35
36 /* Render object */
37
38 #ifndef ART_MAX_DEPTH
39 #define ART_MAX_DEPTH 16
40 #endif
41
42 #if ART_MAX_DEPTH == 16
43 typedef art_u16 ArtPixMaxDepth;
44 #define ART_PIX_MAX_FROM_8(x) ((x) | ((x) << 8))
45 #define ART_PIX_8_FROM_MAX(x) (((x) + 0x80 - (((x) + 0x80) >> 8)) >> 8)
46 #else
47 #if ART_MAX_DEPTH == 8
48 typedef art_u8 ArtPixMaxDepth;
49 #define ART_PIX_MAX_FROM_8(x) (x)
50 #define ART_PIX_8_FROM_MAX(x) (x)
51 #else
52 #error ART_MAX_DEPTH must be either 8 or 16
53 #endif
54 #endif
55
56 #define ART_MAX_CHAN 16
57
58 typedef struct _ArtRender ArtRender;
59 typedef struct _ArtRenderCallback ArtRenderCallback;
60 typedef struct _ArtRenderMaskRun ArtRenderMaskRun;
61 typedef struct _ArtImageSource ArtImageSource;
62 typedef struct _ArtMaskSource ArtMaskSource;
63
64 typedef enum {
65   ART_ALPHA_NONE      = 0,
66   ART_ALPHA_SEPARATE  = 1,
67   ART_ALPHA_PREMUL    = 2
68 } ArtAlphaType;
69
70 typedef enum {
71   ART_COMPOSITE_NORMAL,
72   ART_COMPOSITE_MULTIPLY,
73   /* todo: more */
74   ART_COMPOSITE_CUSTOM
75 } ArtCompositingMode;
76
77 #define ART_IMAGE_SOURCE_CAN_CLEAR 1
78 #define ART_IMAGE_SOURCE_CAN_COMPOSITE 2
79
80 struct _ArtRenderMaskRun {
81   int x;
82   int alpha;
83 };
84
85 struct _ArtRenderCallback {
86   void (*render) (ArtRenderCallback *self, ArtRender *render,
87                   art_u8 *dest, int y);
88   void (*done) (ArtRenderCallback *self, ArtRender *render);
89 };
90
91 struct _ArtImageSource {
92   ArtRenderCallback super;
93   void (*negotiate) (ArtImageSource *self, ArtRender *render,
94                      int *p_flags,
95                      int *p_buf_depth, ArtAlphaType *p_alpha_type);
96 };
97
98 struct _ArtMaskSource {
99   ArtRenderCallback super;
100   int (*can_drive) (ArtMaskSource *self, ArtRender *render);
101   /* For each mask source, ::prepare() is invoked if it is not
102      a driver, or ::invoke_driver() if it is. */
103   void (*invoke_driver) (ArtMaskSource *self, ArtRender *render);
104   void (*prepare) (ArtMaskSource *self, ArtRender *render, art_boolean first);
105 };
106
107 struct _ArtRender {
108   /* parameters of destination image */
109   int x0, y0;
110   int x1, y1;
111   art_u8 *pixels;
112   int rowstride;
113   int n_chan;
114   int depth;
115   ArtAlphaType alpha_type;
116
117   art_boolean clear;
118   ArtPixMaxDepth clear_color[ART_MAX_CHAN + 1];
119   art_u32 opacity; /* [0..0x10000] */
120
121   ArtCompositingMode compositing_mode;
122
123   ArtAlphaGamma *alphagamma;
124
125   art_u8 *alpha_buf;
126
127   /* parameters of intermediate buffer */
128   int buf_depth;
129   ArtAlphaType buf_alpha;
130   art_u8 *image_buf;
131
132   /* driving alpha scanline data */
133   /* A "run" is a contiguous sequence of x values with the same alpha value. */
134   int n_run;
135   ArtRenderMaskRun *run;
136
137   /* A "span" is a contiguous sequence of x values with non-zero alpha. */
138   int n_span;
139   int *span_x;
140
141   art_boolean need_span;
142 };
143
144 ArtRender *
145 art_render_new (int x0, int y0, int x1, int y1,
146                 art_u8 *pixels, int rowstride,
147                 int n_chan, int depth, ArtAlphaType alpha_type,
148                 ArtAlphaGamma *alphagamma);
149
150 void
151 art_render_invoke (ArtRender *render);
152
153 void
154 art_render_clear (ArtRender *render, const ArtPixMaxDepth *clear_color);
155
156 void
157 art_render_clear_rgb (ArtRender *render, art_u32 clear_rgb);
158
159 void
160 art_render_mask_solid (ArtRender *render, int opacity);
161
162 void
163 art_render_image_solid (ArtRender *render, ArtPixMaxDepth *color);
164
165 /* The next two functions are for custom mask sources only. */
166 void
167 art_render_add_mask_source (ArtRender *render, ArtMaskSource *mask_source);
168
169 void
170 art_render_invoke_callbacks (ArtRender *render, art_u8 *dest, int y);
171
172 /* The following function is for custom image sources only. */
173 void
174 art_render_add_image_source (ArtRender *render, ArtImageSource *image_source);
175
176 #ifdef __cplusplus
177 }
178 #endif /* __cplusplus */
179
180 #endif /* __ART_RENDER_H__ */
181