fix crashes reported by Debian Cylab Mayhem Team
[swftools.git] / lib / art / art_render.h
blobdfb7ca23f58a1e8bcb59cf47e98676738dbf9ae5
1 /*
2 * art_render.h: Modular rendering architecture.
4 * Libart_LGPL - library of basic graphic primitives
5 * Copyright (C) 2000 Raph Levien
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.
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.
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.
23 #ifndef __ART_RENDER_H__
24 #define __ART_RENDER_H__
26 #ifdef LIBART_COMPILATION
27 #include "art_alphagamma.h"
28 #else
29 #include "art_alphagamma.h"
30 #endif
32 #ifdef __cplusplus
33 extern "C" {
34 #endif /* __cplusplus */
36 /* Render object */
38 #ifndef ART_MAX_DEPTH
39 #define ART_MAX_DEPTH 16
40 #endif
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
56 #define ART_MAX_CHAN 16
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;
64 typedef enum {
65 ART_ALPHA_NONE = 0,
66 ART_ALPHA_SEPARATE = 1,
67 ART_ALPHA_PREMUL = 2
68 } ArtAlphaType;
70 typedef enum {
71 ART_COMPOSITE_NORMAL,
72 ART_COMPOSITE_MULTIPLY,
73 /* todo: more */
74 ART_COMPOSITE_CUSTOM
75 } ArtCompositingMode;
77 #define ART_IMAGE_SOURCE_CAN_CLEAR 1
78 #define ART_IMAGE_SOURCE_CAN_COMPOSITE 2
80 struct _ArtRenderMaskRun {
81 int x;
82 int alpha;
85 struct _ArtRenderCallback {
86 void (*render) (ArtRenderCallback *self, ArtRender *render,
87 art_u8 *dest, int y);
88 void (*done) (ArtRenderCallback *self, ArtRender *render);
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);
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);
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;
117 art_boolean clear;
118 ArtPixMaxDepth clear_color[ART_MAX_CHAN + 1];
119 art_u32 opacity; /* [0..0x10000] */
121 ArtCompositingMode compositing_mode;
123 ArtAlphaGamma *alphagamma;
125 art_u8 *alpha_buf;
127 /* parameters of intermediate buffer */
128 int buf_depth;
129 ArtAlphaType buf_alpha;
130 art_u8 *image_buf;
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;
137 /* A "span" is a contiguous sequence of x values with non-zero alpha. */
138 int n_span;
139 int *span_x;
141 art_boolean need_span;
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);
150 void
151 art_render_invoke (ArtRender *render);
153 void
154 art_render_clear (ArtRender *render, const ArtPixMaxDepth *clear_color);
156 void
157 art_render_clear_rgb (ArtRender *render, art_u32 clear_rgb);
159 void
160 art_render_mask_solid (ArtRender *render, int opacity);
162 void
163 art_render_image_solid (ArtRender *render, ArtPixMaxDepth *color);
165 /* The next two functions are for custom mask sources only. */
166 void
167 art_render_add_mask_source (ArtRender *render, ArtMaskSource *mask_source);
169 void
170 art_render_invoke_callbacks (ArtRender *render, art_u8 *dest, int y);
172 /* The following function is for custom image sources only. */
173 void
174 art_render_add_image_source (ArtRender *render, ArtImageSource *image_source);
176 #ifdef __cplusplus
178 #endif /* __cplusplus */
180 #endif /* __ART_RENDER_H__ */