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 3 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, see <http://www.gnu.org/licenses/>.
19
* Boston, MA 02111-1307, USA.
22
#ifndef __ART_RENDER_H__
23
#define __ART_RENDER_H__
25
#ifdef LIBART_COMPILATION
26
#include "art_alphagamma.h"
28
#include <libart_lgpl/art_alphagamma.h>
33
#endif /* __cplusplus */
38
#define ART_MAX_DEPTH 16
41
#if ART_MAX_DEPTH == 16
42
typedef art_u16 ArtPixMaxDepth;
43
#define ART_PIX_MAX_FROM_8(x) ((x) | ((x) << 8))
44
#define ART_PIX_8_FROM_MAX(x) (((x) + 0x80 - (((x) + 0x80) >> 8)) >> 8)
46
#if ART_MAX_DEPTH == 8
47
typedef art_u8 ArtPixMaxDepth;
48
#define ART_PIX_MAX_FROM_8(x) (x)
49
#define ART_PIX_8_FROM_MAX(x) (x)
51
#error ART_MAX_DEPTH must be either 8 or 16
55
#define ART_MAX_CHAN 16
57
typedef struct _ArtRender ArtRender;
58
typedef struct _ArtRenderCallback ArtRenderCallback;
59
typedef struct _ArtRenderMaskRun ArtRenderMaskRun;
60
typedef struct _ArtImageSource ArtImageSource;
61
typedef struct _ArtMaskSource ArtMaskSource;
65
ART_ALPHA_SEPARATE = 1,
71
ART_COMPOSITE_MULTIPLY,
77
ART_IMAGE_SOURCE_CAN_CLEAR = 1,
78
ART_IMAGE_SOURCE_CAN_COMPOSITE = 2
79
} ArtImageSourceFlags;
81
struct _ArtRenderMaskRun {
86
struct _ArtRenderCallback {
87
void (*render) (ArtRenderCallback *self, ArtRender *render,
89
void (*done) (ArtRenderCallback *self, ArtRender *render);
92
struct _ArtImageSource {
93
ArtRenderCallback super;
94
void (*negotiate) (ArtImageSource *self, ArtRender *render,
95
ArtImageSourceFlags *p_flags,
96
int *p_buf_depth, ArtAlphaType *p_alpha_type);
99
struct _ArtMaskSource {
100
ArtRenderCallback super;
101
int (*can_drive) (ArtMaskSource *self, ArtRender *render);
102
/* For each mask source, ::prepare() is invoked if it is not
103
a driver, or ::invoke_driver() if it is. */
104
void (*invoke_driver) (ArtMaskSource *self, ArtRender *render);
105
void (*prepare) (ArtMaskSource *self, ArtRender *render, art_boolean first);
109
/* parameters of destination image */
116
ArtAlphaType alpha_type;
119
ArtPixMaxDepth clear_color[ART_MAX_CHAN + 1];
120
art_u32 opacity; /* [0..0x10000] */
122
ArtCompositingMode compositing_mode;
124
ArtAlphaGamma *alphagamma;
128
/* parameters of intermediate buffer */
130
ArtAlphaType buf_alpha;
133
/* driving alpha scanline data */
134
/* A "run" is a contiguous sequence of x values with the same alpha value. */
136
ArtRenderMaskRun *run;
138
/* A "span" is a contiguous sequence of x values with non-zero alpha. */
142
art_boolean need_span;
146
art_render_new (int x0, int y0, int x1, int y1,
147
art_u8 *pixels, int rowstride,
148
int n_chan, int depth, ArtAlphaType alpha_type,
149
ArtAlphaGamma *alphagamma);
152
art_render_invoke (ArtRender *render);
155
art_render_clear (ArtRender *render, const ArtPixMaxDepth *clear_color);
158
art_render_clear_rgb (ArtRender *render, art_u32 clear_rgb);
161
art_render_mask_solid (ArtRender *render, int opacity);
164
art_render_image_solid (ArtRender *render, ArtPixMaxDepth *color);
166
/* The next two functions are for custom mask sources only. */
168
art_render_add_mask_source (ArtRender *render, ArtMaskSource *mask_source);
171
art_render_invoke_callbacks (ArtRender *render, art_u8 *dest, int y);
173
/* The following function is for custom image sources only. */
175
art_render_add_image_source (ArtRender *render, ArtImageSource *image_source);
179
#endif /* __cplusplus */
181
#endif /* __ART_RENDER_H__ */