/* @(#)pr_util.h 1.18 88/02/08 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