1 /* $NetBSD: raster.h,v 1.7 2005/12/11 12:23:44 christos Exp $ */
4 * Copyright (c) 1991, 1993
5 * The Regents of the University of California. All rights reserved.
7 * This code is derived from software contributed to the Computer Systems
8 * Engineering Group at Lawrence Berkeley Laboratory and to the University
9 * of California at Berkeley by Jef Poskanzer.
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * 3. Neither the name of the University nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 * @(#)raster.h 8.1 (Berkeley) 6/11/93
39 * Simple raster and frame buffer routines.
41 * Currently this set of routines is fairly minimal. It's enough to
42 * implement a console terminal emulator on monochrome and pseudocolor
43 * screens, and that's about it.
45 * Future additions might be other kinds of frame buffers (direct color?),
46 * lines, dashed lines, three-operand blits (stipples/stencils), etc.
52 /* Configurable definitions. */
55 #include <machine/endian.h>
56 #if BYTE_ORDER == BIG_ENDIAN
57 /* CONFIGURE: define or undef for your machine's byte order */
59 /* CONFIGURE: define or under for your frame buffer's bit order */
63 /* CONFIGURE: The text routines can optionally keep a cache of 8-bit
64 ** characters. This uses about 30K, but makes text on a color screen
65 ** go 3.2 times faster. XXX: it will also break 2bpp displays.
67 #undef COLORFONT_CACHE
72 /* ANSI prototype conditionalizer. */
75 #define ARGS(alist) alist
77 #define ARGS(alist) ()
83 int width
, height
; /* size in pixels */
84 int depth
; /* bits per pixel - 1, 2, or 8 */
85 int linelongs
; /* longs from one line to the next - for padding */
86 u_int32_t
*pixels
; /* pointer to the actual bits */
87 void *data
; /* special pointer for frame buffers and subregions */
90 /* Colormap struct. */
91 struct raster_colormap
{
98 /* Font character struct. */
105 #ifdef COLORFONT_CACHE
106 struct raster_fontcache
{
107 struct raster
* cr
[256];
110 #endif /*COLORFONT_CACHE*/
114 int width
, height
, ascent
; /* nominal character size */
116 #define RASFONT_FIXEDWIDTH 0x1
117 #define RASFONT_NOVERTICALMOVEMENT 0x2
118 struct raster_char chars
[256];
119 #ifdef COLORFONT_CACHE
120 struct raster_fontcache
* cache
;
121 #endif /*COLORFONT_CACHE*/
124 /* Defines for the raster_op() and raster_text() rop parameter - the bitblit
125 ** operation. A rop can be some Boolean combination of RAS_SRC and
126 ** RAS_DST. For instance, just RAS_SRC means copy the source to the
127 ** destination without modification. RAS_SRC|RAS_DST means "or" the source
128 ** and destination together, while "xor" would be RAS_SRC^RAS_DST. The
129 ** RAS_NOT macro should be used to express negation - RAS_NOT(RAS_SRC)&RAS_DST
130 ** would "and" the complement of the source with the destination.
132 ** Or, you can just use one of the pre-defined ops. There are only 16
133 ** possible combinations, so all 16 are defined here.
135 ** For color rasters, you specify the color of the operation by simply
136 ** oring RAS_COLOR(color) into the rop.
139 #define RAS_NOT(op) ( 0xf & ( ~ (op) ) )
141 #define RAS_CLEAR 0x0 /* 0 */
142 #define RAS_NOTOR 0x1 /* !( src | dst ) */
143 #define RAS_NOTSRC_AND_DST 0x2 /* !src & dst */
144 #define RAS_INVERTSRC 0x3 /* !src */
145 #define RAS_SRC_AND_NOTDST 0x4 /* src & !dst */
146 #define RAS_INVERT 0x5 /* !dst */
147 #define RAS_XOR 0x6 /* src ^ dst */
148 #define RAS_NOTAND 0x7 /* !( src & dst ) */
149 #define RAS_AND 0x8 /* src & dst */
150 #define RAS_NOTXOR 0x9 /* !( src ^ dst ) */
151 #define RAS_DST 0xa /* dst */
152 #define RAS_NOTSRC_OR_DST 0xb /* !src | dst */
153 #define RAS_SRC 0xc /* src */
154 #define RAS_SRC_OR_NOTDST 0xd /* src | !dst */
155 #define RAS_OR 0xe /* src | dst */
156 #define RAS_SET 0xf /* 1 */
159 #define RAS_COLOR(color) ( ( (color) & 0xff ) << 4 )
161 #define RAS_COLOR(color) ( ( (color) & 0xffff ) << 4 )
164 /* Get the op from a rop. */
165 #define RAS_GETOP(op) ( (op) & 0xf )
166 /* Get the color from a rop. */
168 #define RAS_GETCOLOR(op) ( ( (op) >> 4 ) & 0xff )
170 #define RAS_GETCOLOR(op) ( ( (op) >> 4 ) & 0xffff )
172 /* Get the longword address of a pixel. */
173 #define RAS_ADDR( r, x, y ) \
174 ( (r)->pixels + (y) * (r)->linelongs + (x) * (r)->depth / 32 )
177 /* Raster routines. */
179 extern struct raster
* raster_alloc
ARGS(( int width
, int height
, int depth
));
180 /* Allocates a raster. Returns (struct raster*) 0 on failure. */
182 extern void raster_free
ARGS(( struct raster
* r
));
183 /* Frees/closes a raster. */
185 extern int raster_get
ARGS(( struct raster
* r
, int x
, int y
));
186 /* Gets a single pixel from a raster. */
188 extern void raster_put
ARGS(( struct raster
* r
, int x
, int y
, int v
));
189 /* Puts a single pixel into a raster. */
191 extern struct raster
* raster_subregion
ARGS(( struct raster
* r
, int x
, int y
, int width
, int height
));
192 /* Makes a raster that points to a region of another. Returns
193 ** (struct raster*) 0 on failure.
197 /* Raster operations. */
199 extern int raster_op
ARGS(( struct raster
* dst
, int dx
, int dy
, int w
, int h
, int rop
, struct raster
* src
, int sx
, int sy
));
200 /* Performs a bitblit. Returns 0 on success, -1 on failure. */
202 extern int raster_op_noclip
ARGS(( struct raster
* dst
, int dx
, int dy
, int w
, int h
, int rop
, struct raster
* src
, int sx
, int sy
));
203 /* Bitblit without clipping. Returns 0 on success, -1 on failure. */
205 extern int raster_op_nosrc_noclip
ARGS(( struct raster
* dst
, int dx
, int dy
, int w
, int h
, int rop
));
206 /* No-src bitblit without clipping. Returns 0 on success, -1 on failure. */
208 extern int raster_replsrc
ARGS(( struct raster
* dst
, int dx
, int dy
, int w
, int h
, int rop
, struct raster
* src
, int sx
, int sy
));
209 /* Tiles the src to fit the dst. Returns 0 on success, -1 on failure. Only
210 ** implements RAS_SRC.
214 /* Raster text routines */
216 extern struct raster_font
* raster_fontopen
ARGS(( char* fontname
));
217 /* Opens a font. Returns (struct raster_font*) 0 on failure. */
219 extern int raster_text
ARGS(( struct raster
* r
, int x
, int y
, int rop
, struct raster_font
* rf
, unsigned char* text
));
220 /* Draws text. Returns 0 on success, -1 on failure. */
222 extern int raster_textn
ARGS(( struct raster
* r
, int x
, int y
, int rop
, struct raster_font
* rf
, unsigned char* text
, int len
));
223 /* Draws n characters of text. Returns 0 on success, -1 on failure. */
225 extern void raster_fontclose
ARGS(( struct raster_font
* rf
));
229 /* Frame buffer routines. */
231 extern struct raster
* raster_open
ARGS(( char* fbname
));
232 /* Opens a frame buffer as a raster. Returns (struct raster*) 0 on failure. */
234 extern struct raster
* raster_coloropen
ARGS(( void ));
235 /* Opens a color frame buffer if there is one. Returns (struct raster*) 0 on
239 extern int raster_video_off
ARGS(( struct raster
* r
));
240 /* Blanks the screen. Returns 0 on success, -1 on failure. This might
241 ** be implemented as actual video blanking, or it might just load black
242 ** into all colormap entries (and disable further colormap changes).
245 extern int raster_video_on
ARGS(( struct raster
* r
));
246 /* Re-enables video. Returns 0 on success, -1 on failure. */
248 extern struct raster_colormap
* raster_colormap_alloc
ARGS(( int length
));
249 /* Allocates a colormap structure, returns 0 on failure. */
251 extern struct raster_colormap
* raster_colormap_get
ARGS(( struct raster
* r
));
252 /* Allocates a colormap structure and returns the frame buffer's
253 ** current colormap, or (struct raster_colormap*) 0 on failure. The raster
254 ** must be one returned by raster_open(), not raster_alloc().
257 extern int raster_colormap_set
ARGS(( struct raster
* r
, struct raster_colormap
* cm
));
258 /* Sets a frame buffer's colormap. The raster must be one returned
259 ** by raster_open(), not raster_alloc(). Returns 0 on success, -1 on
263 extern void raster_colormap_free
ARGS(( struct raster_colormap
* cm
));
264 /* Frees a colormap. */
266 #endif /*_RASTER_H_*/