* Copyright (c) 1992 The Regents of the University of California.
* This code is derived from software contributed to Berkeley by
* Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc.
* %sccs.include.redist.c%
* from: $Hdr: fb_sub.c,v 4.300 91/06/27 20:43:09 root Rel41 $ SONY
* @(#)fb_sub.c 7.2 (Berkeley) %G%
#include <machine/fix_machine_type.h>
#include <machine/param.h>
#include <news3400/iop/framebuf.h>
#include <news3400/iop/fbreg.h>
#include "../ipc/newsipc.h"
#define ipc_phys(x) K0_TT0(x)
#define ipc_log(x) TT0_K0(x)
#define ipc_phys(x) (caddr_t)((int)(x) & ~0x80000000)
#define ipc_log(x) (caddr_t)((int)(x) | 0x80000000)
#define ipc_phys(x) (caddr_t)((int)(x))
#define ipc_log(x) (caddr_t)((int)(x) | 0x80000000)
static struct fb_map fbmap
[MAX_FBMAP
];
#define BLTTYPE(ts, td) ((ts) << 2 | (td))
static lSrcDest srcdestlist
[MAX_BATCHBITBLT
];
#define MAX_SIZE (MAX_BATCHBITBLT * sizeof(lSrcDest))
#define ODD_ADDR(x) (((unsigned)(x))&1)
#define BASE(a) ((int)(a) & ~(NBPG - 1))
COPYIN(src
, dst
, len
, seg
)
return (copyin(src
, dst
, len
));
register struct pte
*pte
;
if (addr
>= (caddr_t
)KERNBASE
) {
if (MACH_IS_CACHED(addr
)) {
*p
++ = (caddr_t
)K0_TT0(addr
);
if (MACH_IS_MAPPED(addr
))
else if (addr
>= (caddr_t
)&u
)
pte
= curproc
->p_addr
+ btop(addr
- (caddr_t
)&u
);
panic("fbgetmap: bad kernel addr");
*p
++ = (caddr_t
)PHYS_TT0(ptob(pte
++->pg_pfnum
));
*p
++ = (caddr_t
)ptob(pte
++->pg_pfnum
);
pte
= vtopte(curproc
, v
); /*KU:XXXXXXXXXXXXXXXXXX*/
panic("iop zero uentry");
*p
++ = (caddr_t
)PHYS_TT0(ptob(pte
++->pg_pfnum
));
*p
++ = (caddr_t
)ptob(pte
++->pg_pfnum
);
fblockmem(ad
, len
, rw
, map
, seg
)
register struct memseg
*msp
;
else if (seg
== UIO_USERSPACE
&&
!useracc(ad
, len
, rw
== B_READ
? B_WRITE
: B_READ
))
else if (segind
>= MAXMSEG
)
for (msp
= mseg
+ segind
- 1; msp
>= mseg
; msp
--) {
msp
->adrs
= (caddr_t
)BASE(ad
);
msp
->len
= (caddr_t
)BASE(ad
+ len
+ NBPG
- 1) - msp
->adrs
;
msp
->adrs
= (caddr_t
)BASE(ad
);
msp
->len
= (caddr_t
)BASE(ad
+ len
+ NBPG
- 1) - msp
->adrs
;
fblocksbitmap(bm
, rw
, map
)
if (bm
->type
== BM_FB
|| bm
->type
== BM_0
|| bm
->type
== BM_1
)
len
= bm
->width
* bm
->rect
.extent
.y
* bm
->depth
* sizeof(Word
);
if (len
< 0 || len
> FB_MAX_IO
)
error
= fblockmem((caddr_t
)(bm
->base
), len
, rw
, map
, UIO_USERSPACE
);
bm
->base
= (Word
*)ipc_phys(map
);
register struct memseg
*msp0
, *msp1
, *mspl
;
for (msp0
= mseg
, msp1
= mseg
+ 1; msp1
< mspl
; msp0
++, msp1
++) {
if (msp0
->adrs
+ msp0
->len
> msp1
->adrs
) {
tlen
= msp1
->adrs
- msp0
->adrs
+ msp1
->len
;
msp1
->len
= msp0
->len
> tlen
? msp0
->len
: tlen
;
msp1
->rw
= (msp0
->rw
== B_READ
|| msp1
->rw
== B_READ
) ?
curproc
->p_flag
|= SPHYSIO
;
for (i
= 0; i
< segind
; i
++)
if (mseg
[i
].len
&& mseg
[i
].adrs
&& mseg
[i
].adrs
vslock(mseg
[i
].adrs
, mseg
[i
].len
);
for (i
= 0; i
< segind
; i
++)
fbgetmap(mseg
[i
].oadrs
, mseg
[i
].olen
, mseg
[i
].map
);
for (i
= 0; i
< segind
; i
++) {
if (mseg
[i
].len
&& mseg
[i
].adrs
&& mseg
[i
].adrs
vsunlock(mseg
[i
].adrs
, mseg
[i
].len
, mseg
[i
].rw
);
#if defined(mips) && defined(CPU_DOUBLE)
if (mseg
[i
].rw
== B_READ
)
mseg
[i
].adrs
, mseg
[i
].len
);
curproc
->p_flag
&= ~SPHYSIO
;
/* for 'fbinitlock() o wasureru ukkariyasan'... */
if ((bm
->width
* bm
->rect
.extent
.y
) << 1 > FB_MAX_IO
)
if (bm
->rect
.extent
.x
< 0 || bm
->rect
.extent
.y
< 0)
register int ds
= sbm
->depth
;
register int dd
= dbm
->depth
;
if (ds
> 1 && dd
> 1 && ds
!= dd
)
return((ds
> 1) << 1 | (dd
> 1));
if (error
= fblocksbitmap(sbm
, B_WRITE
, fbmap
))
if (error
= fblocksbitmap(dbm
, B_READ
, fbmap
+ 1))
(Word
*)((struct fb_map
*)ipc_log(sbm
->base
))->fm_vaddr
;
(Word
*)((struct fb_map
*)ipc_log(dbm
->base
))->fm_vaddr
;
register struct fbreg
*fbp
;
register lBitblt
*regcmd
;
register int len
, lens
, lend
;
int blttype
= BLTTYPE(cmd
->srcBitmap
.type
, cmd
->destBitmap
.type
);
if ((blttype
== BLTTYPE(BM_MEM
, BM_MEM
)) ||
(blttype
== BLTTYPE(BM_0
, BM_MEM
)) ||
(blttype
== BLTTYPE(BM_1
, BM_MEM
))) {
return(mfbnbitblt(fbp
, cmd
));
if (error
= checkbitmap(&cmd
->srcBitmap
))
if (error
= checkbitmap(&cmd
->destBitmap
))
if ((mode
= checkdepth(&cmd
->srcBitmap
, &cmd
->destBitmap
)) < 0)
fbp
->fb_command
= FB_CBITBLT
;
regcmd
= &fbp
->fb_bitblt
;
/* process bitblt command */
case BLTTYPE(BM_FB
, BM_FB
):
case BLTTYPE(BM_0
, BM_FB
):
case BLTTYPE(BM_1
, BM_FB
):
case BLTTYPE(BM_FB
, BM_MEM
):
case BLTTYPE(BM_0
, BM_MEM
):
case BLTTYPE(BM_1
, BM_MEM
):
len
= cmd
->destBitmap
.width
* cmd
->destBitmap
.rect
.extent
.y
<< 1;
if (len
* cmd
->destBitmap
.depth
<= FB_MAX_IO
) {
error
= dobitblt(fbp
, ®cmd
->srcBitmap
,
regcmd
->destBitmap
.depth
= 1;
pmask
= regcmd
->planemask
;
for (i
= 0; i
< cmd
->destBitmap
.depth
; i
++) {
if (mode
== 3) /* N to N */
regcmd
->planemask
= pmask
& (1 << i
);
if (error
= dobitblt(fbp
, ®cmd
->srcBitmap
,
regcmd
->destBitmap
.base
+= len
>> 1;
if (mode
== 1) { /* N to N */
regcmd
->fore_color
>>= 1;
case BLTTYPE(BM_MEM
, BM_FB
):
len
= cmd
->srcBitmap
.width
* cmd
->srcBitmap
.rect
.extent
.y
<< 1;
if (len
* cmd
->srcBitmap
.depth
<= FB_MAX_IO
) {
error
= dobitblt(fbp
, ®cmd
->srcBitmap
,
regcmd
->srcBitmap
.depth
= 1;
pmask
= regcmd
->planemask
;
regcmd
->fore_color
= 0xff;
if (mode
== 2) { /* N to 1 */
for (i
= 0; i
< cmd
->srcBitmap
.depth
; i
++)
if (i
>= cmd
->srcBitmap
.depth
)
regcmd
->srcBitmap
.base
+= (len
>> 1) * i
;
error
= dobitblt(fbp
, ®cmd
->srcBitmap
,
for (i
= 0; i
< cmd
->srcBitmap
.depth
; i
++) {
regcmd
->planemask
= pmask
& (1 << i
);
if (error
= dobitblt(fbp
, ®cmd
->srcBitmap
,
regcmd
->srcBitmap
.base
+= len
>> 1;
case BLTTYPE(BM_MEM
, BM_MEM
):
lens
= cmd
->srcBitmap
.width
* cmd
->srcBitmap
.rect
.extent
.y
<< 1;
lend
= cmd
->destBitmap
.width
* cmd
->destBitmap
.rect
.extent
.y
<< 1;
if (lens
* cmd
->srcBitmap
.depth
<= FB_MAX_IO
&&
lend
* cmd
->destBitmap
.depth
<= FB_MAX_IO
) {
error
= dobitblt(fbp
, ®cmd
->srcBitmap
,
regcmd
->srcBitmap
.depth
= 1;
regcmd
->destBitmap
.depth
= 1;
pmask
= regcmd
->planemask
;
if (mode
== 2) { /* N to 1 */
regcmd
->fore_color
= 0xff;
for (i
= 0; i
< cmd
->srcBitmap
.depth
; i
++)
if (i
>= cmd
->srcBitmap
.depth
)
regcmd
->srcBitmap
.base
+= (lens
>> 1) * i
;
error
= dobitblt(fbp
, ®cmd
->srcBitmap
,
} else if (mode
== 1) { /* 1 to N */
for (i
= 0; i
< cmd
->srcBitmap
.depth
; i
++) {
if (error
= dobitblt(fbp
, ®cmd
->srcBitmap
,
regcmd
->fore_color
>>= 1;
regcmd
->destBitmap
.base
+= lend
>> 1;
regcmd
->fore_color
= 0xff;
for (i
= 0; i
< cmd
->srcBitmap
.depth
; i
++) {
if (error
= dobitblt(fbp
, ®cmd
->srcBitmap
,
regcmd
->srcBitmap
.base
+= lens
>> 1;
regcmd
->destBitmap
.base
+= lend
>> 1;
lcmdp
->transp
= cmd
->transp
;
lcmdp
->fore_color
= cmd
->fore_color
;
lcmdp
->aux_color
= cmd
->aux_color
;
lcmdp
->planemask
= cmd
->planemask
;
lcmdp
->srcBitmap
.type
= cmd
->srcBitmap
.type
;
lcmdp
->srcBitmap
.depth
= cmd
->srcBitmap
.depth
;
lcmdp
->srcBitmap
.width
= cmd
->srcBitmap
.width
;
lcmdp
->srcBitmap
.rect
.origin
.x
= cmd
->srcBitmap
.rect
.origin
.x
;
lcmdp
->srcBitmap
.rect
.origin
.y
= cmd
->srcBitmap
.rect
.origin
.y
;
lcmdp
->srcBitmap
.rect
.extent
.x
= cmd
->srcBitmap
.rect
.extent
.x
;
lcmdp
->srcBitmap
.rect
.extent
.y
= cmd
->srcBitmap
.rect
.extent
.y
;
lcmdp
->srcBitmap
.base
= cmd
->srcBitmap
.base
;
lcmdp
->srcRect
.origin
.x
= cmd
->srcRect
.origin
.x
;
lcmdp
->srcRect
.origin
.y
= cmd
->srcRect
.origin
.y
;
lcmdp
->srcRect
.extent
.x
= cmd
->srcRect
.extent
.x
;
lcmdp
->srcRect
.extent
.y
= cmd
->srcRect
.extent
.y
;
lcmdp
->destBitmap
.type
= cmd
->destBitmap
.type
;
lcmdp
->destBitmap
.depth
= cmd
->destBitmap
.depth
;
lcmdp
->destBitmap
.width
= cmd
->destBitmap
.width
;
lcmdp
->destBitmap
.rect
.origin
.x
= cmd
->destBitmap
.rect
.origin
.x
;
lcmdp
->destBitmap
.rect
.origin
.y
= cmd
->destBitmap
.rect
.origin
.y
;
lcmdp
->destBitmap
.rect
.extent
.x
= cmd
->destBitmap
.rect
.extent
.x
;
lcmdp
->destBitmap
.rect
.extent
.y
= cmd
->destBitmap
.rect
.extent
.y
;
lcmdp
->destBitmap
.base
= cmd
->destBitmap
.base
;
lcmdp
->destClip
.origin
.x
= cmd
->destClip
.origin
.x
;
lcmdp
->destClip
.origin
.y
= cmd
->destClip
.origin
.y
;
lcmdp
->destClip
.extent
.x
= cmd
->destClip
.extent
.x
;
lcmdp
->destClip
.extent
.y
= cmd
->destClip
.extent
.y
;
lcmdp
->destPoint
.x
= cmd
->destPoint
.x
;
lcmdp
->destPoint
.y
= cmd
->destPoint
.y
;
return (fbnbitblt(fbp
, lcmdp
));
procbatchbitblt(fbp
, mode
, cmd
)
register lBatchBitblt
*cmd
;
register lBatchBitblt
*regcmd
;
register int len
, lens
, lend
;
regcmd
= &fbp
->fb_batchbitblt
;
/* process batch bitblt command */
switch (BLTTYPE(regcmd
->srcBitmap
.type
, regcmd
->destBitmap
.type
)) {
case BLTTYPE(BM_FB
, BM_FB
):
case BLTTYPE(BM_0
, BM_FB
):
case BLTTYPE(BM_1
, BM_FB
):
fbstart(fbp
, cmd
->nSrcDest
);
case BLTTYPE(BM_FB
, BM_MEM
):
case BLTTYPE(BM_0
, BM_MEM
):
case BLTTYPE(BM_1
, BM_MEM
):
len
= cmd
->destBitmap
.width
* cmd
->destBitmap
.rect
.extent
.y
<< 1;
if (len
* cmd
->destBitmap
.depth
<= FB_MAX_IO
) {
error
= dobitblt(fbp
, ®cmd
->srcBitmap
,
regcmd
->destBitmap
.depth
= 1;
pmask
= regcmd
->planemask
;
for (i
= 0; i
< cmd
->destBitmap
.depth
; i
++) {
if (mode
== 3) /* N to N */
regcmd
->planemask
= pmask
& (1 << i
);
if (error
= dobitblt(fbp
, ®cmd
->srcBitmap
,
regcmd
->destBitmap
.base
+= len
>> 1;
if (mode
== 1) { /* N to N */
regcmd
->fore_color
>>= 1;
case BLTTYPE(BM_MEM
, BM_FB
):
len
= cmd
->srcBitmap
.width
* cmd
->srcBitmap
.rect
.extent
.y
<< 1;
if (len
* cmd
->srcBitmap
.depth
<= FB_MAX_IO
) {
error
= dobitblt(fbp
, ®cmd
->srcBitmap
,
regcmd
->srcBitmap
.depth
= 1;
pmask
= regcmd
->planemask
;
regcmd
->fore_color
= 0xff;
if (mode
== 2) { /* N to 1 */
for (i
= 0; i
< cmd
->srcBitmap
.depth
; i
++)
if (i
>= cmd
->srcBitmap
.depth
)
regcmd
->srcBitmap
.base
+= (len
>> 1) * i
;
error
= dobitblt(fbp
, ®cmd
->srcBitmap
,
for (i
= 0; i
< cmd
->srcBitmap
.depth
; i
++) {
regcmd
->planemask
= pmask
& (1 << i
);
if (error
= dobitblt(fbp
, ®cmd
->srcBitmap
,
regcmd
->srcBitmap
.base
+= len
>> 1;
case BLTTYPE(BM_MEM
, BM_MEM
):
lens
= cmd
->srcBitmap
.width
* cmd
->srcBitmap
.rect
.extent
.y
<< 1;
lend
= cmd
->destBitmap
.width
* cmd
->destBitmap
.rect
.extent
.y
<< 1;
if (lens
* cmd
->srcBitmap
.depth
<= FB_MAX_IO
&&
lend
* cmd
->destBitmap
.depth
<= FB_MAX_IO
) {
error
= dobitblt(fbp
, ®cmd
->srcBitmap
,
regcmd
->srcBitmap
.depth
= 1;
regcmd
->destBitmap
.depth
= 1;
pmask
= regcmd
->planemask
;
if (mode
== 2) { /* N to 1 */
regcmd
->fore_color
= 0xff;
for (i
= 0; i
< cmd
->srcBitmap
.depth
; i
++)
if (i
>= cmd
->srcBitmap
.depth
)
regcmd
->srcBitmap
.base
+= (lens
>> 1) * i
;
error
= dobitblt(fbp
, ®cmd
->srcBitmap
,
} else if (mode
== 1) { /* 1 to N */
for (i
= 0; i
< cmd
->srcBitmap
.depth
; i
++) {
if (error
= dobitblt(fbp
, ®cmd
->srcBitmap
,
regcmd
->fore_color
>>= 1;
regcmd
->destBitmap
.base
+= lend
>> 1;
regcmd
->fore_color
= 0xff;
for (i
= 0; i
< cmd
->srcBitmap
.depth
; i
++) {
if (error
= dobitblt(fbp
, ®cmd
->srcBitmap
,
regcmd
->srcBitmap
.base
+= lens
>> 1;
regcmd
->destBitmap
.base
+= lend
>> 1;
fbnbatchbitblt(fbp
, cmd
, seg
)
register struct fbreg
*fbp
;
register lBatchBitblt
*cmd
;
int blttype
= BLTTYPE(cmd
->srcBitmap
.type
, cmd
->destBitmap
.type
);
if ((blttype
== BLTTYPE(BM_MEM
, BM_MEM
)) ||
(blttype
== BLTTYPE(BM_0
, BM_MEM
)) ||
(blttype
== BLTTYPE(BM_1
, BM_MEM
))) {
return(mfbnbatchbitblt(fbp
, cmd
, seg
));
fbp
->fb_command
= FB_CBATCHBITBLT
;
fbp
->fb_batchbitblt
= *cmd
;
if (error
= checkbitmap(&cmd
->srcBitmap
))
if (error
= checkbitmap(&cmd
->destBitmap
))
if ((mode
= checkdepth(&cmd
->srcBitmap
, &cmd
->destBitmap
)) < 0)
if ((len
= cmd
->nSrcDest
* sizeof(lSrcDest
)) <= 0)
if (error
= fblockmem((caddr_t
)cmd
->srcDestList
,
len
, B_WRITE
, fbmap
+ 2, seg
))
fbp
->fb_batchbitblt
.srcDestList
= (lSrcDest
*)ipc_phys(fbmap
+ 2);
error
= procbatchbitblt(fbp
, mode
, cmd
);
fbp
->fb_batchbitblt
.srcDestList
= (lSrcDest
*)ipc_phys(srcdestlist
);
while(cmd
->nSrcDest
> 0) {
len
= min(cmd
->nSrcDest
, (MAX_SIZE
/ sizeof(lSrcDest
)));
error
= COPYIN((caddr_t
)cmd
->srcDestList
, (caddr_t
)srcdestlist
,
len
* sizeof(lSrcDest
), seg
);
fbp
->fb_batchbitblt
.nSrcDest
= len
;
if (error
= procbatchbitblt(fbp
, mode
, cmd
))
register sBatchBitblt
*cmd
;
register lBatchBitblt
*lcmdp
;
lcmdp
->transp
= cmd
->transp
;
lcmdp
->fore_color
= cmd
->fore_color
;
lcmdp
->aux_color
= cmd
->aux_color
;
lcmdp
->planemask
= cmd
->planemask
;
lcmdp
->srcBitmap
.type
= cmd
->srcBitmap
.type
;
lcmdp
->srcBitmap
.depth
= cmd
->srcBitmap
.depth
;
lcmdp
->srcBitmap
.width
= cmd
->srcBitmap
.width
;
lcmdp
->srcBitmap
.rect
.origin
.x
= cmd
->srcBitmap
.rect
.origin
.x
;
lcmdp
->srcBitmap
.rect
.origin
.y
= cmd
->srcBitmap
.rect
.origin
.y
;
lcmdp
->srcBitmap
.rect
.extent
.x
= cmd
->srcBitmap
.rect
.extent
.x
;
lcmdp
->srcBitmap
.rect
.extent
.y
= cmd
->srcBitmap
.rect
.extent
.y
;
lcmdp
->srcBitmap
.base
= cmd
->srcBitmap
.base
;
lcmdp
->destBitmap
.type
= cmd
->destBitmap
.type
;
lcmdp
->destBitmap
.depth
= cmd
->destBitmap
.depth
;
lcmdp
->destBitmap
.width
= cmd
->destBitmap
.width
;
lcmdp
->destBitmap
.rect
.origin
.x
= cmd
->destBitmap
.rect
.origin
.x
;
lcmdp
->destBitmap
.rect
.origin
.y
= cmd
->destBitmap
.rect
.origin
.y
;
lcmdp
->destBitmap
.rect
.extent
.x
= cmd
->destBitmap
.rect
.extent
.x
;
lcmdp
->destBitmap
.rect
.extent
.y
= cmd
->destBitmap
.rect
.extent
.y
;
lcmdp
->destBitmap
.base
= cmd
->destBitmap
.base
;
lcmdp
->destClip
.origin
.x
= cmd
->destClip
.origin
.x
;
lcmdp
->destClip
.origin
.y
= cmd
->destClip
.origin
.y
;
lcmdp
->destClip
.extent
.x
= cmd
->destClip
.extent
.x
;
lcmdp
->destClip
.extent
.y
= cmd
->destClip
.extent
.y
;
sp
= (sSrcDest
*)cmd
->srcDestList
;
lcmdp
->nSrcDest
= ns
= min(cmd
->nSrcDest
, 100);
error
= copyin((caddr_t
)sp
, (caddr_t
)&tmp
, sizeof(tmp
));
lp
->srcRect
.origin
.x
= tmp
.srcRect
.origin
.x
;
lp
->srcRect
.origin
.y
= tmp
.srcRect
.origin
.y
;
lp
->srcRect
.extent
.x
= tmp
.srcRect
.extent
.x
;
lp
->srcRect
.extent
.y
= tmp
.srcRect
.extent
.y
;
lp
->destPoint
.x
= tmp
.destPoint
.x
;
lp
->destPoint
.y
= tmp
.destPoint
.y
;
fbnbatchbitblt(fbp
, lcmdp
, UIO_SYSSPACE
);
register struct fbreg
*fbp
;
register lTileBitblt
*cmd
;
register lTileBitblt
*regcmd
;
register int len
, lens
, lend
;
int blttype
= BLTTYPE(cmd
->ptnBitmap
.type
, cmd
->destBitmap
.type
);
if ((blttype
== BLTTYPE(BM_MEM
, BM_MEM
)) ||
(blttype
== BLTTYPE(BM_0
, BM_MEM
)) ||
(blttype
== BLTTYPE(BM_1
, BM_MEM
))) {
return(mfbntilebitblt(fbp
, cmd
));
if (error
= checkbitmap(&cmd
->ptnBitmap
))
if (error
= checkbitmap(&cmd
->destBitmap
))
if ((mode
= checkdepth(&cmd
->ptnBitmap
, &cmd
->destBitmap
)) < 0)
fbp
->fb_command
= FB_CTILEBITBLT
;
fbp
->fb_tilebitblt
= *cmd
;
regcmd
= &fbp
->fb_tilebitblt
;
/* process bitblt command */
case BLTTYPE(BM_FB
, BM_FB
):
case BLTTYPE(BM_0
, BM_FB
):
case BLTTYPE(BM_1
, BM_FB
):
case BLTTYPE(BM_FB
, BM_MEM
):
case BLTTYPE(BM_0
, BM_MEM
):
case BLTTYPE(BM_1
, BM_MEM
):
len
= cmd
->destBitmap
.width
* cmd
->destBitmap
.rect
.extent
.y
<< 1;
if (len
* cmd
->destBitmap
.depth
<= FB_MAX_IO
) {
error
= dobitblt(fbp
, ®cmd
->ptnBitmap
,
regcmd
->destBitmap
.depth
= 1;
pmask
= regcmd
->planemask
;
for (i
= 0; i
< cmd
->destBitmap
.depth
; i
++) {
if (mode
== 3) /* N to N */
regcmd
->planemask
= pmask
& (1 << i
);
if (error
= dobitblt(fbp
, ®cmd
->ptnBitmap
,
regcmd
->destBitmap
.base
+= len
>> 1;
if (mode
== 1) { /* N to N */
regcmd
->fore_color
>>= 1;
case BLTTYPE(BM_MEM
, BM_FB
):
len
= cmd
->ptnBitmap
.width
* cmd
->ptnBitmap
.rect
.extent
.y
<< 1;
if (len
* cmd
->ptnBitmap
.depth
<= FB_MAX_IO
) {
error
= dobitblt(fbp
, ®cmd
->ptnBitmap
,
regcmd
->ptnBitmap
.depth
= 1;
pmask
= regcmd
->planemask
;
regcmd
->fore_color
= 0xff;
if (mode
== 2) { /* N to 1 */
for (i
= 0; i
< cmd
->ptnBitmap
.depth
; i
++)
if (i
>= cmd
->ptnBitmap
.depth
)
regcmd
->ptnBitmap
.base
+= (len
>> 1) * i
;
error
= dobitblt(fbp
, ®cmd
->ptnBitmap
,
for (i
= 0; i
< cmd
->ptnBitmap
.depth
; i
++) {
regcmd
->planemask
= pmask
& (1 << i
);
if (error
= dobitblt(fbp
, ®cmd
->ptnBitmap
,
regcmd
->ptnBitmap
.base
+= len
>> 1;
case BLTTYPE(BM_MEM
, BM_MEM
):
lens
= cmd
->ptnBitmap
.width
* cmd
->ptnBitmap
.rect
.extent
.y
<< 1;
lend
= cmd
->destBitmap
.width
* cmd
->destBitmap
.rect
.extent
.y
<< 1;
if (lens
* cmd
->ptnBitmap
.depth
<= FB_MAX_IO
&&
lend
* cmd
->destBitmap
.depth
<= FB_MAX_IO
) {
error
= dobitblt(fbp
, ®cmd
->ptnBitmap
,
regcmd
->ptnBitmap
.depth
= 1;
regcmd
->destBitmap
.depth
= 1;
pmask
= regcmd
->planemask
;
if (mode
== 2) { /* N to 1 */
regcmd
->fore_color
= 0xff;
for (i
= 0; i
< cmd
->ptnBitmap
.depth
; i
++)
if (i
>= cmd
->ptnBitmap
.depth
)
regcmd
->ptnBitmap
.base
+= (lens
>> 1) * i
;
error
= dobitblt(fbp
, ®cmd
->ptnBitmap
,
} else if (mode
== 1) { /* 1 to N */
for (i
= 0; i
< cmd
->ptnBitmap
.depth
; i
++) {
if (error
= dobitblt(fbp
, ®cmd
->ptnBitmap
,
regcmd
->fore_color
>>= 1;
regcmd
->destBitmap
.base
+= lend
>> 1;
for (i
= 0; i
< cmd
->ptnBitmap
.depth
; i
++) {
if (error
= dobitblt(fbp
, ®cmd
->ptnBitmap
,
regcmd
->ptnBitmap
.base
+= lens
>> 1;
regcmd
->destBitmap
.base
+= lend
>> 1;
register sTileBitblt
*cmd
;
register lTileBitblt
*lcmdp
;
lcmdp
->transp
= cmd
->transp
;
lcmdp
->fore_color
= cmd
->fore_color
;
lcmdp
->aux_color
= cmd
->aux_color
;
lcmdp
->planemask
= cmd
->planemask
;
lcmdp
->ptnBitmap
.type
= cmd
->ptnBitmap
.type
;
lcmdp
->ptnBitmap
.depth
= cmd
->ptnBitmap
.depth
;
lcmdp
->ptnBitmap
.width
= cmd
->ptnBitmap
.width
;
lcmdp
->ptnBitmap
.rect
.origin
.x
= cmd
->ptnBitmap
.rect
.origin
.x
;
lcmdp
->ptnBitmap
.rect
.origin
.y
= cmd
->ptnBitmap
.rect
.origin
.y
;
lcmdp
->ptnBitmap
.rect
.extent
.x
= cmd
->ptnBitmap
.rect
.extent
.x
;
lcmdp
->ptnBitmap
.rect
.extent
.y
= cmd
->ptnBitmap
.rect
.extent
.y
;
lcmdp
->ptnBitmap
.base
= cmd
->ptnBitmap
.base
;
lcmdp
->ptnRect
.origin
.x
= cmd
->ptnRect
.origin
.x
;
lcmdp
->ptnRect
.origin
.y
= cmd
->ptnRect
.origin
.y
;
lcmdp
->ptnRect
.extent
.x
= cmd
->ptnRect
.extent
.x
;
lcmdp
->ptnRect
.extent
.y
= cmd
->ptnRect
.extent
.y
;
lcmdp
->refPoint
.x
= cmd
->refPoint
.x
;
lcmdp
->refPoint
.y
= cmd
->refPoint
.y
;
lcmdp
->destBitmap
.type
= cmd
->destBitmap
.type
;
lcmdp
->destBitmap
.depth
= cmd
->destBitmap
.depth
;
lcmdp
->destBitmap
.width
= cmd
->destBitmap
.width
;
lcmdp
->destBitmap
.rect
.origin
.x
= cmd
->destBitmap
.rect
.origin
.x
;
lcmdp
->destBitmap
.rect
.origin
.y
= cmd
->destBitmap
.rect
.origin
.y
;
lcmdp
->destBitmap
.rect
.extent
.x
= cmd
->destBitmap
.rect
.extent
.x
;
lcmdp
->destBitmap
.rect
.extent
.y
= cmd
->destBitmap
.rect
.extent
.y
;
lcmdp
->destBitmap
.base
= cmd
->destBitmap
.base
;
lcmdp
->destClip
.origin
.x
= cmd
->destClip
.origin
.x
;
lcmdp
->destClip
.origin
.y
= cmd
->destClip
.origin
.y
;
lcmdp
->destClip
.extent
.x
= cmd
->destClip
.extent
.x
;
lcmdp
->destClip
.extent
.y
= cmd
->destClip
.extent
.y
;
lcmdp
->destRect
.origin
.x
= cmd
->destRect
.origin
.x
;
lcmdp
->destRect
.origin
.y
= cmd
->destRect
.origin
.y
;
lcmdp
->destRect
.extent
.x
= cmd
->destRect
.extent
.x
;
lcmdp
->destRect
.extent
.y
= cmd
->destRect
.extent
.y
;
return (fbntilebitblt(fbp
, lcmdp
));
fbnpolyline(fbp
, cmd
, dj
, seg
)
int dj
; /* if not zero, disjoint polyline */
if(cmd
->drawBM
.type
== BM_MEM
) {
return(mfbnpolyline(fbp
, cmd
, dj
, seg
));
fbp
->fb_command
= dj
? FB_CDJPOLYLINE
: FB_CPOLYLINE
;
if (error
= fblocksbitmap(&fbp
->fb_polyline
.drawBM
, B_READ
, fbmap
))
if ((len
= cmd
->np
* sizeof(lPoint
)) <= 0)
error
= fblockmem((caddr_t
)cmd
->plist
, len
, B_WRITE
, fbmap
+ 1, seg
);
fbp
->fb_polyline
.plist
= (lPoint
*)ipc_phys(fbmap
+ 1);
fbp
->fb_polyline
.plist
= (lPoint
*)ipc_phys(srcdestlist
);
len
= min(cmd
->np
, ((MAX_SIZE
/ sizeof(lPoint
)) & ~1));
fbp
->fb_polyline
.np
= len
;
if (error
= COPYIN((caddr_t
)cmd
->plist
, (caddr_t
)srcdestlist
,
len
* sizeof(lPoint
), seg
)) {
if (fbp
->fb_polyline
.drawBM
.type
== BM_MEM
) {
if (error
= fblocksbitmap(&fbp
->fb_polyline
.drawBM
,
register lPrimLine
*lcmdp
;
lcmdp
->transp
= cmd
->transp
;
lcmdp
->fore_color
= cmd
->fore_color
;
lcmdp
->aux_color
= cmd
->aux_color
;
lcmdp
->planemask
= cmd
->planemask
;
lcmdp
->drawBM
.type
= cmd
->drawBM
.type
;
lcmdp
->drawBM
.depth
= cmd
->drawBM
.depth
;
lcmdp
->drawBM
.width
= cmd
->drawBM
.width
;
lcmdp
->drawBM
.rect
.origin
.x
= cmd
->drawBM
.rect
.origin
.x
;
lcmdp
->drawBM
.rect
.origin
.y
= cmd
->drawBM
.rect
.origin
.y
;
lcmdp
->drawBM
.rect
.extent
.x
= cmd
->drawBM
.rect
.extent
.x
;
lcmdp
->drawBM
.rect
.extent
.y
= cmd
->drawBM
.rect
.extent
.y
;
lcmdp
->drawBM
.base
= cmd
->drawBM
.base
;
lcmdp
->clip
.origin
.x
= cmd
->clip
.origin
.x
;
lcmdp
->clip
.origin
.y
= cmd
->clip
.origin
.y
;
lcmdp
->clip
.extent
.x
= cmd
->clip
.extent
.x
;
lcmdp
->clip
.extent
.y
= cmd
->clip
.extent
.y
;
sp
= (sPoint
*)cmd
->plist
;
lcmdp
->np
= np
= min(cmd
->np
, 100);
if (error
= copyin((caddr_t
)sp
, (caddr_t
)&tmp
, sizeof (tmp
)))
fbnpolyline(fbp
, lcmdp
, dj
, UIO_SYSSPACE
);
fbnfillscan(fbp
, cmd
, seg
)
int blttype
= BLTTYPE(cmd
->ptnBM
.type
, cmd
->drawBM
.type
);
if ((blttype
== BLTTYPE(BM_MEM
, BM_MEM
)) ||
(blttype
== BLTTYPE(BM_0
, BM_MEM
)) ||
(blttype
== BLTTYPE(BM_1
, BM_MEM
))) {
return(mfbnfillscan(fbp
, cmd
, seg
));
fbp
->fb_command
= FB_CFILLSCAN
;
if (error
= fblocksbitmap(&fbp
->fb_fillscan
.ptnBM
, B_WRITE
, fbmap
))
if (error
= fblocksbitmap(&fbp
->fb_fillscan
.drawBM
, B_READ
, fbmap
+ 1))
if ((len
= cmd
->nscan
* sizeof(lScanl
)) <= 0)
if (error
= fblockmem(cmd
->scan
, len
, B_WRITE
, fbmap
+ 2, seg
))
fbp
->fb_fillscan
.scan
= (lScanl
*)ipc_phys(fbmap
+ 2);
fbp
->fb_fillscan
.scan
= (lScanl
*)ipc_phys(srcdestlist
);
len
= min(cmd
->nscan
, (MAX_SIZE
/ sizeof(lScanl
)));
fbp
->fb_fillscan
.nscan
= len
;
if (error
= COPYIN((caddr_t
)cmd
->scan
, (caddr_t
)srcdestlist
,
len
* sizeof(lScanl
), seg
)) {
if (fbp
->fb_fillscan
.ptnBM
.type
== BM_MEM
||
fbp
->fb_fillscan
.drawBM
.type
== BM_MEM
) {
if (error
= fblocksbitmap(&fbp
->fb_fillscan
.ptnBM
,
if (error
= fblocksbitmap(&fbp
->fb_fillscan
.drawBM
,
register lPrimFill
*lcmdp
;
lcmdp
->transp
= cmd
->transp
;
lcmdp
->fore_color
= cmd
->fore_color
;
lcmdp
->aux_color
= cmd
->aux_color
;
lcmdp
->planemask
= cmd
->planemask
;
lcmdp
->refPoint
.x
= cmd
->refPoint
.x
;
lcmdp
->refPoint
.y
= cmd
->refPoint
.y
;
lcmdp
->ptnRect
.origin
.x
= cmd
->ptnRect
.origin
.x
;
lcmdp
->ptnRect
.origin
.y
= cmd
->ptnRect
.origin
.y
;
lcmdp
->ptnRect
.extent
.x
= cmd
->ptnRect
.extent
.x
;
lcmdp
->ptnRect
.extent
.y
= cmd
->ptnRect
.extent
.y
;
lcmdp
->ptnBM
.type
= cmd
->ptnBM
.type
;
lcmdp
->ptnBM
.depth
= cmd
->ptnBM
.depth
;
lcmdp
->ptnBM
.width
= cmd
->ptnBM
.width
;
lcmdp
->ptnBM
.rect
.origin
.x
= cmd
->ptnBM
.rect
.origin
.x
;
lcmdp
->ptnBM
.rect
.origin
.y
= cmd
->ptnBM
.rect
.origin
.y
;
lcmdp
->ptnBM
.rect
.extent
.x
= cmd
->ptnBM
.rect
.extent
.x
;
lcmdp
->ptnBM
.rect
.extent
.y
= cmd
->ptnBM
.rect
.extent
.y
;
lcmdp
->ptnBM
.base
= cmd
->ptnBM
.base
;
lcmdp
->drawBM
.type
= cmd
->drawBM
.type
;
lcmdp
->drawBM
.depth
= cmd
->drawBM
.depth
;
lcmdp
->drawBM
.width
= cmd
->drawBM
.width
;
lcmdp
->drawBM
.rect
.origin
.x
= cmd
->drawBM
.rect
.origin
.x
;
lcmdp
->drawBM
.rect
.origin
.y
= cmd
->drawBM
.rect
.origin
.y
;
lcmdp
->drawBM
.rect
.extent
.x
= cmd
->drawBM
.rect
.extent
.x
;
lcmdp
->drawBM
.rect
.extent
.y
= cmd
->drawBM
.rect
.extent
.y
;
lcmdp
->drawBM
.base
= cmd
->drawBM
.base
;
lcmdp
->clip
.origin
.x
= cmd
->clip
.origin
.x
;
lcmdp
->clip
.origin
.y
= cmd
->clip
.origin
.y
;
lcmdp
->clip
.extent
.x
= cmd
->clip
.extent
.x
;
lcmdp
->clip
.extent
.y
= cmd
->clip
.extent
.y
;
sp
= (sScanl
*)cmd
->scan
;
lcmdp
->nscan
= ns
= min(cmd
->nscan
, 100);
if (error
= copyin((caddr_t
)sp
, (caddr_t
)&tmp
, sizeof (tmp
)))
fbnfillscan(fbp
, lcmdp
, UIO_SYSSPACE
);
int blttype
= BLTTYPE(cmd
->ptnBM
.type
, cmd
->drawBM
.type
);
if ((blttype
== BLTTYPE(BM_MEM
, BM_MEM
)) ||
(blttype
== BLTTYPE(BM_0
, BM_MEM
)) ||
(blttype
== BLTTYPE(BM_1
, BM_MEM
))) {
return(mfbnrectangle(fbp
, cmd
));
fbp
->fb_command
= FB_CRECTANGLE
;
fbp
->fb_rectangle
= *cmd
;
if (error
= fblocksbitmap(&fbp
->fb_rectangle
.drawBM
, B_READ
, fbmap
))
if (error
= fblocksbitmap(&fbp
->fb_rectangle
.ptnBM
, B_WRITE
, fbmap
+ 1))
if (fbp
->fb_rectangle
.drawBM
.type
== BM_MEM
||
fbp
->fb_rectangle
.ptnBM
.type
== BM_MEM
) {
register lPrimRect
*lcmdp
;
lcmdp
->transp
= cmd
->transp
;
lcmdp
->fore_color
= cmd
->fore_color
;
lcmdp
->aux_color
= cmd
->aux_color
;
lcmdp
->planemask
= cmd
->planemask
;
lcmdp
->rect
.origin
.x
= cmd
->rect
.origin
.x
;
lcmdp
->rect
.origin
.y
= cmd
->rect
.origin
.y
;
lcmdp
->rect
.extent
.x
= cmd
->rect
.extent
.x
;
lcmdp
->rect
.extent
.y
= cmd
->rect
.extent
.y
;
lcmdp
->refPoint
.x
= cmd
->refPoint
.x
;
lcmdp
->refPoint
.y
= cmd
->refPoint
.y
;
lcmdp
->ptnRect
.origin
.x
= cmd
->ptnRect
.origin
.x
;
lcmdp
->ptnRect
.origin
.y
= cmd
->ptnRect
.origin
.y
;
lcmdp
->ptnRect
.extent
.x
= cmd
->ptnRect
.extent
.x
;
lcmdp
->ptnRect
.extent
.y
= cmd
->ptnRect
.extent
.y
;
lcmdp
->ptnBM
.type
= cmd
->ptnBM
.type
;
lcmdp
->ptnBM
.depth
= cmd
->ptnBM
.depth
;
lcmdp
->ptnBM
.width
= cmd
->ptnBM
.width
;
lcmdp
->ptnBM
.rect
.origin
.x
= cmd
->ptnBM
.rect
.origin
.x
;
lcmdp
->ptnBM
.rect
.origin
.y
= cmd
->ptnBM
.rect
.origin
.y
;
lcmdp
->ptnBM
.rect
.extent
.x
= cmd
->ptnBM
.rect
.extent
.x
;
lcmdp
->ptnBM
.rect
.extent
.y
= cmd
->ptnBM
.rect
.extent
.y
;
lcmdp
->ptnBM
.base
= cmd
->ptnBM
.base
;
lcmdp
->drawBM
.type
= cmd
->drawBM
.type
;
lcmdp
->drawBM
.depth
= cmd
->drawBM
.depth
;
lcmdp
->drawBM
.width
= cmd
->drawBM
.width
;
lcmdp
->drawBM
.rect
.origin
.x
= cmd
->drawBM
.rect
.origin
.x
;
lcmdp
->drawBM
.rect
.origin
.y
= cmd
->drawBM
.rect
.origin
.y
;
lcmdp
->drawBM
.rect
.extent
.x
= cmd
->drawBM
.rect
.extent
.x
;
lcmdp
->drawBM
.rect
.extent
.y
= cmd
->drawBM
.rect
.extent
.y
;
lcmdp
->drawBM
.base
= cmd
->drawBM
.base
;
lcmdp
->clip
.origin
.x
= cmd
->clip
.origin
.x
;
lcmdp
->clip
.origin
.y
= cmd
->clip
.origin
.y
;
lcmdp
->clip
.extent
.x
= cmd
->clip
.extent
.x
;
lcmdp
->clip
.extent
.y
= cmd
->clip
.extent
.y
;
return (fbnrectangle(fbp
, lcmdp
));
fbnpolymarker(fbp
, cmd
, seg
)
register struct fbreg
*fbp
;
register lPrimMarker
*cmd
;
int blttype
= BLTTYPE(cmd
->ptnBM
.type
, cmd
->drawBM
.type
);
if ((blttype
== BLTTYPE(BM_MEM
, BM_MEM
)) ||
(blttype
== BLTTYPE(BM_0
, BM_MEM
)) ||
(blttype
== BLTTYPE(BM_1
, BM_MEM
))) {
return(mfbnpolymarker(fbp
, cmd
, seg
));
fbp
->fb_command
= FB_CPOLYMARKER
;
fbp
->fb_polymarker
= *cmd
;
if (error
= fblocksbitmap(&fbp
->fb_polymarker
.ptnBM
, B_WRITE
, fbmap
))
if (error
= fblocksbitmap(&fbp
->fb_polymarker
.drawBM
, B_READ
, fbmap
+1))
if ((len
= cmd
->np
* sizeof(lPoint
)) <= 0)
if (error
= fblockmem(cmd
->plist
, len
, B_WRITE
, fbmap
+ 2, seg
))
fbp
->fb_polymarker
.plist
= (lPoint
*)ipc_phys(fbmap
+ 2);
fbp
->fb_polymarker
.plist
= (lPoint
*)ipc_phys(srcdestlist
);
len
= min(cmd
->np
, (MAX_SIZE
/ sizeof(lPoint
)));
fbp
->fb_polymarker
.np
= len
;
if (error
= COPYIN((caddr_t
)cmd
->plist
, (caddr_t
)srcdestlist
,
len
* sizeof(lPoint
), seg
)) {
if (fbp
->fb_polymarker
.ptnBM
.type
== BM_MEM
||
fbp
->fb_polymarker
.drawBM
.type
== BM_MEM
) {
if (error
= fblocksbitmap(&fbp
->fb_polymarker
.ptnBM
,
if (error
= fblocksbitmap(&fbp
->fb_polymarker
.drawBM
,
register sPrimMarker
*cmd
;
register lPrimMarker
*lcmdp
;
lcmdp
->transp
= cmd
->transp
;
lcmdp
->fore_color
= cmd
->fore_color
;
lcmdp
->aux_color
= cmd
->aux_color
;
lcmdp
->planemask
= cmd
->planemask
;
lcmdp
->ptnRect
.origin
.x
= cmd
->ptnRect
.origin
.x
;
lcmdp
->ptnRect
.origin
.y
= cmd
->ptnRect
.origin
.y
;
lcmdp
->ptnRect
.extent
.x
= cmd
->ptnRect
.extent
.x
;
lcmdp
->ptnRect
.extent
.y
= cmd
->ptnRect
.extent
.y
;
lcmdp
->ptnBM
.type
= cmd
->ptnBM
.type
;
lcmdp
->ptnBM
.depth
= cmd
->ptnBM
.depth
;
lcmdp
->ptnBM
.width
= cmd
->ptnBM
.width
;
lcmdp
->ptnBM
.rect
.origin
.x
= cmd
->ptnBM
.rect
.origin
.x
;
lcmdp
->ptnBM
.rect
.origin
.y
= cmd
->ptnBM
.rect
.origin
.y
;
lcmdp
->ptnBM
.rect
.extent
.x
= cmd
->ptnBM
.rect
.extent
.x
;
lcmdp
->ptnBM
.rect
.extent
.y
= cmd
->ptnBM
.rect
.extent
.y
;
lcmdp
->ptnBM
.base
= cmd
->ptnBM
.base
;
lcmdp
->drawBM
.type
= cmd
->drawBM
.type
;
lcmdp
->drawBM
.depth
= cmd
->drawBM
.depth
;
lcmdp
->drawBM
.width
= cmd
->drawBM
.width
;
lcmdp
->drawBM
.rect
.origin
.x
= cmd
->drawBM
.rect
.origin
.x
;
lcmdp
->drawBM
.rect
.origin
.y
= cmd
->drawBM
.rect
.origin
.y
;
lcmdp
->drawBM
.rect
.extent
.x
= cmd
->drawBM
.rect
.extent
.x
;
lcmdp
->drawBM
.rect
.extent
.y
= cmd
->drawBM
.rect
.extent
.y
;
lcmdp
->drawBM
.base
= cmd
->drawBM
.base
;
lcmdp
->clip
.origin
.x
= cmd
->clip
.origin
.x
;
lcmdp
->clip
.origin
.y
= cmd
->clip
.origin
.y
;
lcmdp
->clip
.extent
.x
= cmd
->clip
.extent
.x
;
lcmdp
->clip
.extent
.y
= cmd
->clip
.extent
.y
;
sp
= (sPoint
*)cmd
->plist
;
lcmdp
->np
= np
= min(cmd
->np
, 100);
if (error
= copyin((caddr_t
)sp
, (caddr_t
)&tmp
, sizeof (tmp
)))
fbnpolymarker(fbp
, lcmdp
, UIO_SYSSPACE
);
fbnpolydot(fbp
, cmd
, seg
)
register struct fbreg
*fbp
;
if (cmd
->drawBM
.type
== BM_MEM
)
return (mfbnpolydot(fbp
, cmd
, seg
));
fbp
->fb_command
= FB_CPOLYDOT
;
if (error
= fblocksbitmap(&fbp
->fb_polydot
.drawBM
, B_READ
, fbmap
+ 1))
if ((len
= cmd
->np
* sizeof(lPoint
)) <= 0)
if (error
= fblockmem(cmd
->plist
, len
, B_WRITE
, fbmap
+ 2, seg
))
fbp
->fb_polydot
.plist
= (lPoint
*)ipc_phys(fbmap
+ 2);
fbp
->fb_polydot
.plist
= (lPoint
*)ipc_phys(srcdestlist
);
len
= min(cmd
->np
, (MAX_SIZE
/ sizeof(lPoint
)));
fbp
->fb_polydot
.np
= len
;
if (error
= COPYIN((caddr_t
)cmd
->plist
, (caddr_t
)srcdestlist
,
len
* sizeof(lPoint
), seg
)) {
if (fbp
->fb_polydot
.drawBM
.type
== BM_MEM
) {
if (error
= fblocksbitmap(&fbp
->fb_polydot
.drawBM
,
register lPrimDot
*lcmdp
;
lcmdp
->transp
= cmd
->transp
;
lcmdp
->fore_color
= cmd
->fore_color
;
lcmdp
->aux_color
= cmd
->aux_color
;
lcmdp
->planemask
= cmd
->planemask
;
lcmdp
->drawBM
.type
= cmd
->drawBM
.type
;
lcmdp
->drawBM
.depth
= cmd
->drawBM
.depth
;
lcmdp
->drawBM
.width
= cmd
->drawBM
.width
;
lcmdp
->drawBM
.rect
.origin
.x
= cmd
->drawBM
.rect
.origin
.x
;
lcmdp
->drawBM
.rect
.origin
.y
= cmd
->drawBM
.rect
.origin
.y
;
lcmdp
->drawBM
.rect
.extent
.x
= cmd
->drawBM
.rect
.extent
.x
;
lcmdp
->drawBM
.rect
.extent
.y
= cmd
->drawBM
.rect
.extent
.y
;
lcmdp
->drawBM
.base
= cmd
->drawBM
.base
;
lcmdp
->clip
.origin
.x
= cmd
->clip
.origin
.x
;
lcmdp
->clip
.origin
.y
= cmd
->clip
.origin
.y
;
lcmdp
->clip
.extent
.x
= cmd
->clip
.extent
.x
;
lcmdp
->clip
.extent
.y
= cmd
->clip
.extent
.y
;
sp
= (sPoint
*)cmd
->plist
;
lcmdp
->np
= np
= min(cmd
->np
, 100);
if (error
= copyin((caddr_t
)sp
, (caddr_t
)&tmp
, sizeof (tmp
)))
fbnpolydot(fbp
, lcmdp
, UIO_SYSSPACE
);
register struct fbreg
*fbp
;
int blttype
= BLTTYPE(cmd
->fontBM
.type
, cmd
->drawBM
.type
);
if ((cmd
->type
== ASCII
) &&
((blttype
== BLTTYPE(BM_MEM
, BM_MEM
)) ||
(blttype
== BLTTYPE(BM_0
, BM_MEM
)) ||
(blttype
== BLTTYPE(BM_1
, BM_MEM
)))
return(mfbntext(fbp
, cmd
));
fbp
->fb_command
= FB_CTEXT
;
if (error
= fblocksbitmap(&fbp
->fb_text
.drawBM
, B_READ
, fbmap
))
if (cmd
->type
== ASCII
) {
if (error
= fblocksbitmap(&fbp
->fb_text
.fontBM
,
if (error
= fblockmem(cmd
->str
, cmd
->len
, B_WRITE
, fbmap
+ 2, UIO_USERSPACE
))
fbp
->fb_text
.str
= (unsigned char *)ipc_phys(fbmap
+ 2);
fbp
->fb_text
.str
= (unsigned char *)ipc_phys(srcdestlist
);
if (error
= COPYIN((caddr_t
)cmd
->str
,
(caddr_t
)srcdestlist
, cmd
->len
, UIO_USERSPACE
)) {
if (fbp
->fb_text
.drawBM
.type
== BM_MEM
||
(cmd
->type
== ASCII
&& fbp
->fb_text
.fontBM
.type
== BM_MEM
)) {
register lPrimText
*lcmdp
;
lcmdp
->transp
= cmd
->transp
;
lcmdp
->fore_color
= cmd
->fore_color
;
lcmdp
->aux_color
= cmd
->aux_color
;
lcmdp
->planemask
= cmd
->planemask
;
lcmdp
->ex_factor
= cmd
->ex_factor
;
lcmdp
->width
= cmd
->width
;
lcmdp
->height
= cmd
->height
;
lcmdp
->column
= cmd
->column
;
lcmdp
->first_chr
= cmd
->first_chr
;
lcmdp
->last_chr
= cmd
->last_chr
;
lcmdp
->fontBM
.type
= cmd
->fontBM
.type
;
lcmdp
->fontBM
.depth
= cmd
->fontBM
.depth
;
lcmdp
->fontBM
.width
= cmd
->fontBM
.width
;
lcmdp
->fontBM
.rect
.origin
.x
= cmd
->fontBM
.rect
.origin
.x
;
lcmdp
->fontBM
.rect
.origin
.y
= cmd
->fontBM
.rect
.origin
.y
;
lcmdp
->fontBM
.rect
.extent
.x
= cmd
->fontBM
.rect
.extent
.x
;
lcmdp
->fontBM
.rect
.extent
.y
= cmd
->fontBM
.rect
.extent
.y
;
lcmdp
->fontBM
.base
= cmd
->fontBM
.base
;
lcmdp
->drawBM
.type
= cmd
->drawBM
.type
;
lcmdp
->drawBM
.depth
= cmd
->drawBM
.depth
;
lcmdp
->drawBM
.width
= cmd
->drawBM
.width
;
lcmdp
->drawBM
.rect
.origin
.x
= cmd
->drawBM
.rect
.origin
.x
;
lcmdp
->drawBM
.rect
.origin
.y
= cmd
->drawBM
.rect
.origin
.y
;
lcmdp
->drawBM
.rect
.extent
.x
= cmd
->drawBM
.rect
.extent
.x
;
lcmdp
->drawBM
.rect
.extent
.y
= cmd
->drawBM
.rect
.extent
.y
;
lcmdp
->drawBM
.base
= cmd
->drawBM
.base
;
lcmdp
->clip
.origin
.x
= cmd
->clip
.origin
.x
;
lcmdp
->clip
.origin
.y
= cmd
->clip
.origin
.y
;
lcmdp
->clip
.extent
.x
= cmd
->clip
.extent
.x
;
lcmdp
->clip
.extent
.y
= cmd
->clip
.extent
.y
;
return (fbntext(fbp
, lcmdp
));
register struct fbreg
*fbregp
;
fbregp
->fb_command
= FB_CSETCURSOR
;
fbregp
->fb_cursor
.func
= data
->func
;
fbregp
->fb_cursor
.cursor_color
= data
->cursor_color
;
fbregp
->fb_cursor
.mask_color
= data
->mask_color
;
fbregp
->fb_cursor
.hot
.x
= data
->hot
.x
;
fbregp
->fb_cursor
.hot
.y
= data
->hot
.y
;
fbregp
->fb_cursor
.size
.x
= data
->size
.x
;
fbregp
->fb_cursor
.size
.y
= data
->size
.y
;
fbregp
->fb_cursor
.cursorRect
.origin
.x
= data
->cursorRect
.origin
.x
;
fbregp
->fb_cursor
.cursorRect
.origin
.y
= data
->cursorRect
.origin
.y
;
fbregp
->fb_cursor
.cursorRect
.extent
.x
= data
->cursorRect
.extent
.x
;
fbregp
->fb_cursor
.cursorRect
.extent
.y
= data
->cursorRect
.extent
.y
;
fbregp
->fb_cursor
.maskRect
.origin
.x
= data
->maskRect
.origin
.x
;
fbregp
->fb_cursor
.maskRect
.origin
.y
= data
->maskRect
.origin
.y
;
fbregp
->fb_cursor
.maskRect
.extent
.x
= data
->maskRect
.extent
.x
;
fbregp
->fb_cursor
.maskRect
.extent
.y
= data
->maskRect
.extent
.y
;
fbregp
->fb_cursor
.saveRect
.origin
.x
= data
->saveRect
.origin
.x
;
fbregp
->fb_cursor
.saveRect
.origin
.y
= data
->saveRect
.origin
.y
;
fbregp
->fb_cursor
.saveRect
.extent
.x
= data
->saveRect
.extent
.x
;
fbregp
->fb_cursor
.saveRect
.extent
.y
= data
->saveRect
.extent
.y
;
fbregp
->fb_cursor
.moveArea
.origin
.x
= data
->moveArea
.origin
.x
;
fbregp
->fb_cursor
.moveArea
.origin
.y
= data
->moveArea
.origin
.y
;
fbregp
->fb_cursor
.moveArea
.extent
.x
= data
->moveArea
.extent
.x
;
fbregp
->fb_cursor
.moveArea
.extent
.y
= data
->moveArea
.extent
.y
;
register struct fbreg
*fbregp
;
fbregp
->fb_command
= FB_CSETCURSOR
;
fbregp
->fb_cursor
.func
= data
->func
;
fbregp
->fb_cursor
.cursor_color
= data
->cursor_color
;
fbregp
->fb_cursor
.mask_color
= data
->mask_color
;
fbregp
->fb_cursor
.hot
.x
= data
->hot
.x
;
fbregp
->fb_cursor
.hot
.y
= data
->hot
.y
;
fbregp
->fb_cursor
.size
.x
= data
->size
.x
;
fbregp
->fb_cursor
.size
.y
= data
->size
.y
;
fbregp
->fb_cursor
.cursorRect
.origin
.x
= data
->cursorRect
.origin
.x
;
fbregp
->fb_cursor
.cursorRect
.origin
.y
= data
->cursorRect
.origin
.y
;
fbregp
->fb_cursor
.cursorRect
.extent
.x
= data
->cursorRect
.extent
.x
;
fbregp
->fb_cursor
.cursorRect
.extent
.y
= data
->cursorRect
.extent
.y
;
fbregp
->fb_cursor
.maskRect
.origin
.x
= data
->maskRect
.origin
.x
;
fbregp
->fb_cursor
.maskRect
.origin
.y
= data
->maskRect
.origin
.y
;
fbregp
->fb_cursor
.maskRect
.extent
.x
= data
->maskRect
.extent
.x
;
fbregp
->fb_cursor
.maskRect
.extent
.y
= data
->maskRect
.extent
.y
;
fbregp
->fb_cursor
.saveRect
.origin
.x
= data
->saveRect
.origin
.x
;
fbregp
->fb_cursor
.saveRect
.origin
.y
= data
->saveRect
.origin
.y
;
fbregp
->fb_cursor
.saveRect
.extent
.x
= data
->saveRect
.extent
.x
;
fbregp
->fb_cursor
.saveRect
.extent
.y
= data
->saveRect
.extent
.y
;
fbregp
->fb_cursor
.moveArea
.origin
.x
= data
->moveArea
.origin
.x
;
fbregp
->fb_cursor
.moveArea
.origin
.y
= data
->moveArea
.origin
.y
;
fbregp
->fb_cursor
.moveArea
.extent
.x
= data
->moveArea
.extent
.x
;
fbregp
->fb_cursor
.moveArea
.extent
.y
= data
->moveArea
.extent
.y
;
fbp
->fb_command
= FB_CGETSCRTYPE
;
data
->colorwidth
= fbp
->fb_scrtype
.colorwidth
;
data
->plane
= fbp
->fb_scrtype
.plane
;
data
->bufferrect
.origin
.x
= fbp
->fb_scrtype
.bufferrect
.origin
.x
;
data
->bufferrect
.origin
.y
= fbp
->fb_scrtype
.bufferrect
.origin
.y
;
data
->bufferrect
.extent
.x
= fbp
->fb_scrtype
.bufferrect
.extent
.x
;
data
->bufferrect
.extent
.y
= fbp
->fb_scrtype
.bufferrect
.extent
.y
;
data
->visiblerect
.origin
.x
= fbp
->fb_scrtype
.visiblerect
.origin
.x
;
data
->visiblerect
.origin
.y
= fbp
->fb_scrtype
.visiblerect
.origin
.y
;
data
->visiblerect
.extent
.x
= fbp
->fb_scrtype
.visiblerect
.extent
.x
;
data
->visiblerect
.extent
.y
= fbp
->fb_scrtype
.visiblerect
.extent
.y
;
fbp
->fb_command
= FB_CSETXY
;
fbp
->fb_point
.x
= data
->x
;
fbp
->fb_point
.y
= data
->y
;
fbp
->fb_command
= FB_CSETPALETTE
;
fbp
->fb_palette
.count
= 1;
*(sPalette
*)srcdestlist
= *data
;
fbmap
[0].fm_vaddr
= (caddr_t
)srcdestlist
;
fbp
->fb_palette
.palette
= (sPalette
*)ipc_phys(fbmap
);
fbp
->fb_palette
.palette
= (sPalette
*)ipc_phys(srcdestlist
);
fbp
->fb_command
= FB_CSETPALETTE
;
fbp
->fb_palette
.count
= cmd
->count
;
if ((len
= cmd
->count
* sizeof(sPalette
)) <= 0)
if (error
= fblockmem(cmd
->palette
, len
, B_WRITE
, fbmap
, UIO_USERSPACE
))
fbp
->fb_palette
.palette
= (sPalette
*)ipc_phys(fbmap
);
fbp
->fb_palette
.palette
= (sPalette
*)ipc_phys(srcdestlist
);
count
= min(cmd
->count
, (MAX_SIZE
/ sizeof(sPalette
)));
fbp
->fb_palette
.count
= count
;
if (error
= COPYIN((caddr_t
)cmd
->palette
, (caddr_t
)srcdestlist
,
count
* sizeof(sPalette
), UIO_USERSPACE
)) {
fbp
->fb_command
= FB_CGETPALETTE
;
fbp
->fb_palette
.count
= 1;
*(sPalette
*)srcdestlist
= *data
;
fbmap
[0].fm_vaddr
= (caddr_t
)srcdestlist
;
fbp
->fb_palette
.palette
= (sPalette
*)ipc_phys(fbmap
);
fbp
->fb_palette
.palette
= (sPalette
*)ipc_phys(srcdestlist
);
MachFlushDCache((caddr_t
)srcdestlist
, sizeof (sPalette
));
*data
= *(sPalette
*)MACH_CACHED_TO_UNCACHED(srcdestlist
);
*data
= *(sPalette
*)srcdestlist
;
register sPalette
*savep
;
fbp
->fb_command
= FB_CGETPALETTE
;
fbp
->fb_palette
.count
= cmd
->count
;
if ((len
= cmd
->count
* sizeof(sPalette
)) <= 0)
if (error
= fblockmem(cmd
->palette
, len
, B_WRITE
, fbmap
, UIO_USERSPACE
))
fbp
->fb_palette
.palette
= (sPalette
*)ipc_phys(fbmap
);
fbp
->fb_palette
.palette
= (sPalette
*)ipc_phys(srcdestlist
);
count
= min(cmd
->count
, (MAX_SIZE
/ sizeof(sPalette
)));
fbp
->fb_palette
.count
= count
;
if (error
= COPYIN((caddr_t
)cmd
->palette
, (caddr_t
)srcdestlist
,
count
* sizeof(sPalette
), UIO_USERSPACE
)) {
MachFlushDCache((caddr_t
)srcdestlist
, sizeof (sPalette
));
error
= copyout((caddr_t
)MACH_CACHED_TO_UNCACHED(srcdestlist
),
count
* sizeof(sPalette
));
error
= copyout((caddr_t
)srcdestlist
,
count
* sizeof(sPalette
));