/****
 *
 * Copyright (c) 1988 by Sun Microsystems, Inc.
 * @(#)sh_RAS.h 22.1 89/08/10 Copyright 1988 Sun Micro
 *
 * RASTER.H - Raster information for user level code (needed by shapes.h).
 *
 ****/

#ifndef	_SH_CLASS_RAS
/*
 * Raster types (legal values for the RAS_TYPE attribute)
 * There are several different types of RASTER objects, differing
 * in where their pixel data comes from.
 *   RAS_MEMORY = the pixel data is in memory.
 *   RAS_SCREEN = the raster is actually part of a frame buffer
 *     (which may or may not be visible on the screen.) It may not
 *      be the whole framebuffer, but just a region.
 *   RAS_CHILD = the pixel data comes from that of the parent raster.
 */
typedef RASTER (*RAS_type)();

#define	RAS_MEMORY	sh_RAS_MEMORY
#define	RAS_SCREEN	sh_RAS_SCREEN
#define	RAS_CHILD	sh_RAS_CHILD

/*
 * These will go away soon - obsolete
 */
#define	RAS_TYPE_MEMORY	sh_RAS_MEMORY
#define	RAS_TYPE_SCREEN	sh_RAS_SCREEN
#define	RAS_TYPE_CHILD	sh_RAS_CHILD

/*
 * Internal Raster types
 */
#define	RAS_MEM		0	/* memory raster */
#define	RAS_SCR		1	/* screen raster */
#define	RAS_CHLD_MEM	2	/* child memory raster */
#define	RAS_CHLD_SCR	3	/* child screen raster */

extern	RASTER	sh_RAS_MEMORY();
extern	RASTER	sh_RAS_SCREEN();
extern	RASTER	sh_RAS_CHILD();
extern	SHAPE	sh_Shape_Raster();
extern	SHAPE	sh_Clip_Raster();

#define	Create_Raster(t,n)	t(t,n,1)
#define	Temp_Raster(t,n)	t(t,n,0)

/*
 * Raster attributes
 */
typedef enum
  {
   RAS_TYPE,		/* type of raster object */
   RAS_ORG,		/* origin of raster in physical device space */
   RAS_DIM,		/* dimensions of raster in pixels */
   RAS_DEPTH,		/* depth of raster */
   RAS_AREA_STYLE,	/* clip path area style */
   RAS_CLIP_PATH,	/* current clip path */
   RAS_ANTI_ALIAS,	/* antialias switch */
   RAS_PLANE_ENABLE,	/* raster plane enable mask */
   RAS_CMAP,		/* color map */
   RAS_LINEBYTES,	/* number of bytes in a scanline */
   RAS_DATA,		/* the first row of the raster image */
   RAS_CURSOR_OVERLAP,	/* flag set by client when cursor overlaps raster */
   RAS_WIN_GRAB,	/* window grabber status */
   RAS_WIN_FD,          /* Sunview compatibility frame buffer file descrptr */
   RAS_VSYNC,		/* wait for vertical sync */
  } RAS_attr;

#define RAS_ATTRS   ((int) RAS_WIN_FD)


#define	RAS_ANTI_ALIAS_ON	1
#define	RAS_ANTI_ALIAS_OFF	0

/*
 * Raster data type formats.
 * Read_Raster, Write_Raster and Create_Glyph use the RAS_data_type
 * to determine depth and alignment of incoming user data.
 */
#define	RAS_DEPTH_1		0
#define	RAS_DEPTH_8		0x01
#define	RAS_DEPTH_32		0x02
#define RAS_DEPTH_FLD_WDTH	0x02
#define RAS_DEPTH_MASK  	0x03
#define	RAS_ALIGN_8		0x10
#define	RAS_ALIGN_16		0x20
#define	RAS_ALIGN_32		0x40
#define	RAS_OPT_SPEED		0x80
#define	RAS_OPT_SPACE		0

typedef	Unsgn8	RAS_data_type;

/*
 * RASTER operators.
 *
 * RASTER Create_Raster(t, r)		create raster
 * RASTER Temp_Raster(t, r)		create temporary raster
 * Read_Raster(ras, data, opt)		read raster into user data area
 * Write_Raster(ras, data, opt)		write raster into user data area
 * Display_Raster(ras, ctx, m)		display raster in context
 * Store_Raster(ras, ctx)		store raster from context
 * Destroy_Raster(ras)			destroy raster object
 * Get_Raster(ras, attr)		get raster attribute
 * Set_Raster(ras, attr, val)		set raster attribute
 *
 * Print_Raster(ras)			print raster object info
 * Attach_Raster(ras, ctx)		attach raster to context
 * Path_Raster(ras,path,ctx,o)		display path on raster
 * Color_Raster(ras,col)		set foreground color
 * Clear_Raster(ras,ctx)		clear raster
 * Dispatch_Raster(ras,a,f)		set up function dispatch
 * Glyph_Raster(ras,ctx,..)		render glyphs on raster (X11/NeWS)
 * Image_Raster(rasi, raso, ctx,...)	raster image transformations (X11/NeWS)
 * Points_Raster(ctx, points, npoints)	render points on raster (X11/NeWS)
 */
#define	RAS_OP_Destroy	0
#define	RAS_OP_Init	1
#define	RAS_OP_Get	2
#define	RAS_OP_Set	3
#define	RAS_OP_Print	4
#define	RAS_OP_Read	5
#define	RAS_OP_Write	6
#define	RAS_OP_Display	7
#define	RAS_OP_Store	8

#define	RAS_OP_Attach	9
#define	RAS_OP_Path	10
#define	RAS_OP_Color	11
#define	RAS_OP_Clear	12
#define	RAS_OP_Dispatch	13
#define	RAS_OP_Glyph	14
#define	RAS_OP_Image	15
#define	RAS_OP_Points	16
#define	RAS_OPERS	17

/* Flags for the ras_flags field */
#define RAS_PRIVATEDATA 1	/* set iff the ras_data of a raster is in
				   memory allocated by the client */

#define Clip_Raster(r,c) (((r)->ras_clip_key == (c)->ctx_clip_key) ? \
	(r)->ras_clip_shape : sh_Clip_Raster(r,c))
#define Shape_Raster(r) ((r)->ras_shape ? (r)->ras_shape : sh_Shape_Raster(r))

#define	Destroy_Raster(r)	Destroy_Obj(r)

#ifndef	SH_MONITOR

#define	Set_Raster(r,a,v) \
    ((void) GetOper_Obj(r,RAS_OP_Set)((RASTER)(r), a, v))

#else	/* SH_MONITOR */

#define	Set_Raster(r,a,v) \
    ((void) GetOper_Obj(r,RAS_OP_Set)((RASTER)sh_Monitor_Set_Raster(r), a, v))

#endif	/* SH_MONITOR */

#define Store_Raster(r,c)	((void) GetOper_Obj(r,RAS_OP_Store)(r,c))
#define Read_Raster(r,d,o)	((RASTER) GetOper_Obj(r,RAS_OP_Read)(r,d,o))
#define Write_Raster(r,d,o)	((RASTER) GetOper_Obj(r,RAS_OP_Write)(r,d,o))
#define Display_Raster(r,c,m) \
	((void) GetOper_Obj(c->CTX_RASTER,RAS_OP_Display)(r,c,m))

#define	Print_Raster(r)		((void) GetOper_Obj(r,RAS_OP_Print)(r))
#define	Attach_Raster(r,c)	((RASTER) GetOper_Obj(r,RAS_OP_Attach)(r,c))
#define Path_Raster(r,p,c,h)	((void) GetOper_Obj(r,RAS_OP_Path)(r,p,c,h))
#define	Color_Raster(r,c)	((void) GetOper_Obj(r,RAS_OP_Color)(r,c))
#define	Image_Raster(ri,ro,c,d,dt,st,sc,dc,i,t,fr)	\
	((RASTER) GetOper_Obj(ri,RAS_OP_Image)(ri,ro,c,d,dt,st,sc,dc,i,(t),fr))
#define	Points_Raster(c,p,np) \
	((void) GetOper_Obj(c->CTX_RASTER,RAS_OP_Points)(c,p,np))
#define	Clear_Raster(r,c)	((void) GetOper_Obj(r,RAS_OP_Clear)(r,c))
#define	Dispatch_Raster(r,a,f)	((void) GetOper_Obj(r,RAS_OP_Dispatch)(r,a,f))
#define	Glyph_Raster(r,c,gr,n,o,d,opt) \
	((void) GetOper_Obj(r,RAS_OP_Glyph)(r,c,gr,n,o,d,opt))

/*
 * Internal RASTER object structure
 */
struct class_RAS
  {
#include "sh_RAS.ah"
  };

/*
 * Get_Raster(ras, attr)
 * Fast way to access raster attributes.
 * This macro depends on the "attr" argument being a compile time constant.
 */

#ifndef	SH_MONITOR

#define	Get_Raster(r,a) 	CAT(a,get)((RASTER)(r))

#else	/* SH_MONITOR */

#define	Get_Raster(r,a) 	CAT(a,get)((RASTER)(sh_Monitor_Get_Raster(r)))

#endif	/* SH_MONITOR */

#define RAS_TYPEget(r)		((r)->RAS_TYPE)
#define	RAS_ORGget(r)		(&((r)->RAS_ORG))
#define	RAS_DIMget(r)		(&((r)->RAS_DIM))
#define RAS_DEPTHget(r)		((r)->RAS_DEPTH)
#define RAS_ANTI_ALIASget(r)	((r)->RAS_ANTI_ALIAS)
#define RAS_PLANE_ENABLEget(r)	((r)->RAS_PLANE_ENABLE)
#define RAS_TRANSFORMget(r)	((r)->RAS_TRANSFORM)
#define RAS_CMAPget(r)		((r)->RAS_CMAP)
#define RAS_CLIP_PATHget(r)	((r)->RAS_CLIP_PATH)
#define RAS_AREA_STYLEget(r)	((r)->RAS_AREA_STYLE)
#define RAS_CURSOR_OVERLAPget(r) ((r)->RAS_CURSOR_OVERLAP)
#define RAS_DATAget(r)		((r)->RAS_DATA)
#define RAS_LINEBYTESget(r)	((r)->RAS_LINEBYTES)

#define	RAS_VSYNCget(r)   ((int) GetOper_Obj(r, RAS_OP_Get)(r,RAS_VSYNC))
#define	RAS_WIN_FDget(r)   ((int) GetOper_Obj(r, RAS_OP_Get)(r,RAS_WIN_FD))
#define RAS_WIN_GRABget(r) ((int) GetOper_Obj(r,RAS_OP_Get)(r,RAS_WIN_GRAB))

#define	ras_clip_shapeget(r)	((r)->ras_clip_shape)

#define	_SH_CLASS_RAS
#endif	/* _SH_CLASS_RAS */
