744c81692d1d20a3b13cdb3390055293d876bb43
[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 typedef enum {
78   ART_IMAGE_SOURCE_CAN_CLEAR = 1,
79   ART_IMAGE_SOURCE_CAN_COMPOSITE = 2
80 } ArtImageSourceFlags;
81
82 struct _ArtRenderMaskRun {
83   int x;
84   int alpha;
85 };
86
87 struct _ArtRenderCallback {
88   void (*render) (ArtRenderCallback *self, ArtRender *render,
89                   art_u8 *dest, int y);
90   void (*done) (ArtRenderCallback *self, ArtRender *render);
91 };
92
93 struct _ArtImageSource {
94   ArtRenderCallback super;
95   void (*negotiate) (ArtImageSource *self, ArtRender *render,
96                      ArtImageSourceFlags *p_flags,
97                      int *p_buf_depth, ArtAlphaType *p_alpha_type);
98 };
99
100 struct _ArtMaskSource {
101   ArtRenderCallback super;
102   int (*can_drive) (ArtMaskSource *self, ArtRender *render);
103   /* For each mask source, ::prepare() is invoked if it is not
104      a driver, or ::invoke_driver() if it is. */
105   void (*invoke_driver) (ArtMaskSource *self, ArtRender *render);
106   void (*prepare) (ArtMaskSource *self, ArtRender *render, art_boolean first);
107 };
108
109 struct _ArtRender {
110   /* parameters of destination image */
111   int x0, y0;
112   int x1, y1;
113   art_u8 *pixels;
114   int rowstride;
115   int n_chan;
116   int depth;
117   ArtAlphaType alpha_type;
118
119   art_boolean clear;
120   ArtPixMaxDepth clear_color[ART_MAX_CHAN + 1];
121   art_u32 opacity; /* [0..0x10000] */
122
123   ArtCompositingMode compositing_mode;
124
125   ArtAlphaGamma *alphagamma;
126
127   art_u8 *alpha_buf;
128
129   /* parameters of intermediate buffer */
130   int buf_depth;
131   ArtAlphaType buf_alpha;
132   art_u8 *image_buf;
133
134   /* driving alpha scanline data */
135   /* A "run" is a contiguous sequence of x values with the same alpha value. */
136   int n_run;
137   ArtRenderMaskRun *run;
138
139   /* A "span" is a contiguous sequence of x values with non-zero alpha. */
140   int n_span;
141   int *span_x;
142
143   art_boolean need_span;
144 };
145
146 ArtRender *
147 art_render_new (int x0, int y0, int x1, int y1,
148                 art_u8 *pixels, int rowstride,
149                 int n_chan, int depth, ArtAlphaType alpha_type,
150                 ArtAlphaGamma *alphagamma);
151
152 void
153 art_render_invoke (ArtRender *render);
154
155 void
156 art_render_clear (ArtRender *render, const ArtPixMaxDepth *clear_color);
157
158 void
159 art_render_clear_rgb (ArtRender *render, art_u32 clear_rgb);
160
161 void
162 art_render_mask_solid (ArtRender *render, int opacity);
163
164 void
165 art_render_image_solid (ArtRender *render, ArtPixMaxDepth *color);
166
167 /* The next two functions are for custom mask sources only. */
168 void
169 art_render_add_mask_source (ArtRender *render, ArtMaskSource *mask_source);
170
171 void
172 art_render_invoke_callbacks (ArtRender *render, art_u8 *dest, int y);
173
174 /* The following function is for custom image sources only. */
175 void
176 art_render_add_image_source (ArtRender *render, ArtImageSource *image_source);
177
178 #ifdef __cplusplus
179 }
180 #endif /* __cplusplus */
181
182 #endif /* __ART_RENDER_H__ */
183