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"
29 #include "art_alphagamma.h"
34 #endif /* __cplusplus */
39 #define ART_MAX_DEPTH 16
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)
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)
52 #error ART_MAX_DEPTH must be either 8 or 16
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
;
66 ART_ALPHA_SEPARATE
= 1,
72 ART_COMPOSITE_MULTIPLY
,
77 #define ART_IMAGE_SOURCE_CAN_CLEAR 1
78 #define ART_IMAGE_SOURCE_CAN_COMPOSITE 2
80 struct _ArtRenderMaskRun
{
85 struct _ArtRenderCallback
{
86 void (*render
) (ArtRenderCallback
*self
, ArtRender
*render
,
88 void (*done
) (ArtRenderCallback
*self
, ArtRender
*render
);
91 struct _ArtImageSource
{
92 ArtRenderCallback super
;
93 void (*negotiate
) (ArtImageSource
*self
, ArtRender
*render
,
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
);
108 /* parameters of destination image */
115 ArtAlphaType alpha_type
;
118 ArtPixMaxDepth clear_color
[ART_MAX_CHAN
+ 1];
119 art_u32 opacity
; /* [0..0x10000] */
121 ArtCompositingMode compositing_mode
;
123 ArtAlphaGamma
*alphagamma
;
127 /* parameters of intermediate buffer */
129 ArtAlphaType buf_alpha
;
132 /* driving alpha scanline data */
133 /* A "run" is a contiguous sequence of x values with the same alpha value. */
135 ArtRenderMaskRun
*run
;
137 /* A "span" is a contiguous sequence of x values with non-zero alpha. */
141 art_boolean need_span
;
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
);
151 art_render_invoke (ArtRender
*render
);
154 art_render_clear (ArtRender
*render
, const ArtPixMaxDepth
*clear_color
);
157 art_render_clear_rgb (ArtRender
*render
, art_u32 clear_rgb
);
160 art_render_mask_solid (ArtRender
*render
, int opacity
);
163 art_render_image_solid (ArtRender
*render
, ArtPixMaxDepth
*color
);
165 /* The next two functions are for custom mask sources only. */
167 art_render_add_mask_source (ArtRender
*render
, ArtMaskSource
*mask_source
);
170 art_render_invoke_callbacks (ArtRender
*render
, art_u8
*dest
, int y
);
172 /* The following function is for custom image sources only. */
174 art_render_add_image_source (ArtRender
*render
, ArtImageSource
*image_source
);
178 #endif /* __cplusplus */
180 #endif /* __ART_RENDER_H__ */