139 lines
3.9 KiB
C
139 lines
3.9 KiB
C
/* @(#)pr_util.h 1.1 94/10/31 SMI */
|
|
|
|
/*
|
|
* Copyright 1983, 1986, 1987 by Sun Microsystems, Inc.
|
|
*/
|
|
|
|
#ifndef pr_util_DEFINED
|
|
#define pr_util_DEFINED
|
|
|
|
/*
|
|
* WARNING: This include file is obsolete and may disappear in the future.
|
|
*
|
|
* pr_product has been moved to pixrect.h
|
|
* struct pr_devdata etc. has been moved to pr_impl_make.h
|
|
* new loop macros are in pr_impl_util.h
|
|
*/
|
|
|
|
/*
|
|
* Utilities for implementing pixrect operations.
|
|
*/
|
|
|
|
/*
|
|
* Aids to handling overlapping source and destination.
|
|
* Given the from and to pr_pos's, rop_direction tells
|
|
* whether the rasterop is up or down and left or right,
|
|
* encoded as the ROP_UP and ROP_LEFT bits or their absence.
|
|
* The macros rop_is(up|down|left|right) can then be used.
|
|
*/
|
|
#define ROP_UP 0x1
|
|
#define ROP_LEFT 0x2
|
|
|
|
#define rop_direction(src, so, dst, do) \
|
|
( ( (((dst).x+(do).x) < ((src).x+(so).x)) << 1) | \
|
|
(((dst).y+(do).y) < ((src).y+(so).y)) )
|
|
#define rop_isleft(dir) ((dir)&ROP_LEFT)
|
|
#define rop_isup(dir) ((dir)&ROP_UP)
|
|
#define rop_isright(dir) (((dir)&ROP_LEFT)==0)
|
|
#define rop_isdown(dir) (((dir)&ROP_UP)==0)
|
|
|
|
/*
|
|
* Aids to producing fast loops, either unrolled or very tight:
|
|
*
|
|
* Cases8(n, op) produces the dense case part of a case statement
|
|
* for the cases [n+1..n+8), repeating ``op'' 1-8 times respectively.
|
|
*
|
|
* Rop_slowloop(n, op) produces a loop to do ``op'' n times, in little space.
|
|
*
|
|
* Rop_fastloop(n, op) produces a loop to do ``op'' n times, in little time.
|
|
*
|
|
* Loop_d6(label, op) produces a dbra loop to do ``op'' the number of times
|
|
* in register d6 (second non-pointer register variable).
|
|
*
|
|
* Loop_d6 is only possible on a 68000 family processor, and rop_fastloop
|
|
* generates an unrolled loop only on a 68010 (assumes other processors
|
|
* will have some kind of I-cache).
|
|
*/
|
|
#ifdef mc68000
|
|
/* generates a nice dbra loop */
|
|
#define rop_slowloop(n, op) \
|
|
{ register int _loop = (n); \
|
|
if (--_loop >= 0) do { op; } while (--_loop != -1); }
|
|
|
|
#define loopd6(label, op) \
|
|
if (0) { \
|
|
asm("label:"); \
|
|
op; \
|
|
}; \
|
|
asm("dbra d6,label");
|
|
#else mc68000
|
|
#define rop_slowloop(n, op) \
|
|
{ register int _loop = (n); \
|
|
while (--_loop >= 0) { op; } }
|
|
#endif mc68000
|
|
|
|
#ifdef mc68010
|
|
#define cases8(n, op) \
|
|
case (n)+8: op; case (n)+7: op; case (n)+6: op; \
|
|
case (n)+5: op; case (n)+4: op; case (n)+3: op; \
|
|
case (n)+2: op; case (n)+1: op; \
|
|
|
|
#define rop_fastloop(n, op) \
|
|
{ register int _loop ; \
|
|
for (_loop = (n); _loop > 15; _loop -= 16) \
|
|
{ op; op; op; op; op; op; op; op; \
|
|
op; op; op; op; op; op; op; op; } \
|
|
switch (_loop) { \
|
|
cases8(8, op); \
|
|
cases8(0, op); \
|
|
case 0: break; \
|
|
} }
|
|
#else mc68010
|
|
#define rop_fastloop rop_slowloop
|
|
#endif mc68010
|
|
|
|
/*
|
|
* Alloctype(datatype) allocates a datatype structure using calloc
|
|
* with the appropriate type cast.
|
|
*/
|
|
#define alloctype(datatype) \
|
|
(datatype *)calloc(1, sizeof (datatype))
|
|
|
|
/*
|
|
* Pr_product is used when doing multiplications involving pixrects,
|
|
* and casts its arguments to that the compiler will use 16 by 16 multiplies.
|
|
*/
|
|
#ifndef pr_product
|
|
#ifdef sun
|
|
#define pr_product(a, b) ((short)(a) * (short)(b))
|
|
#else
|
|
#define pr_product(a, b) ((a) * (b))
|
|
#endif
|
|
#endif
|
|
|
|
/*
|
|
* Pr_area is the area of a rectangle.
|
|
*/
|
|
#define pr_area(size) pr_product((size).x, (size).y)
|
|
|
|
/*
|
|
* Pr_devdata is used to keep track of the valloced/mmapped virtual
|
|
* address of a device to prevent doing it more than necessary.
|
|
*/
|
|
struct pr_devdata {
|
|
struct pr_devdata *next; /* link to next device of this type */
|
|
dev_t rdev; /* device type */
|
|
int count; /* reference count */
|
|
int fd; /* fd of frame buffer, -1 if unused */
|
|
short *va; /* virtual address */
|
|
int bytes; /* size of va, 0 for no munmap */
|
|
caddr_t va2; /* second virtual address, 0 if unused */
|
|
int bytes2; /* second size */
|
|
};
|
|
|
|
#ifndef KERNEL
|
|
Pixrect *pr_makefromfd();
|
|
#endif !KERNEL
|
|
|
|
#endif pr_util_DEFINED
|