#include "savage_driver.h"
#include "xaarop.h"
#include "savage_bci.h"
void SavageSubsequentImageWriteRect (
ScrnInfoPtr pScrn,
int x,
int y,
int w,
int h,
int skipleft);
void SavageSetupForImageWrite (
ScrnInfoPtr pScrn,
int rop,
unsigned planemask,
int transparency_color,
int bpp,
int depth);
void SavageWriteBitmapCPUToScreenColorExpand (
ScrnInfoPtr pScrn,
int x, int y, int w, int h,
unsigned char * src,
int srcwidth,
int skipleft,
int fg, int bg,
int rop,
unsigned int planemask);
#if 0
void SavageWriteBitmapScreenToScreenColorExpand(
ScrnPtr pScrn,
int x,
int y,
int w,
int h,
unsigned char * src,
int srcwidth,
int srcx,
int srcy,
int bg,
int fg,
int rop,
unsigned int planemask
)
{
SavagePtr psav = SAVPTR(pScrn);
BCI_GET_PTR;
unsigned int cmd;
unsigned char * bd_offset;
unsigned int bd;
cmd = BCI_CMD_RECT | BCI_CMD_RECT_XP | BCI_CMD_RECT_YP
| BCI_CMD_SEND_COLOR
| BCI_CMD_DEST_GBD | BCI_CMD_SRC_SBD_MONO_NEW;
cmd |= (bg != -1) ? BCI_CMD_SEND_COLOR : BCI_CMD_SRC_TRANSPARENT;
cmd |= s3vAlu[rop];
bd |= BCI_BD_BW_DISABLE;
BCI_BD_SET_BPP(bd, 1);
BCI_BD_SET_STRIDE(bd, srcwidth);
bd_offset = srcwidth * srcy + (srcx >> 3) + src;
psav->WaitQueue(psav,10);
BCI_SEND(cmd);
BCI_SEND((unsigned int)bd_offset);
BCI_SEND(bd);
BCI_SEND(fg);
BCI_SEND((bg != -1) ? bg : 0);
BCI_SEND(BCI_X_Y(srcx, srcy));
BCI_SEND(BCI_X_Y(x, y));
BCI_SEND(BCI_W_H(w, h));
}
#endif
void
SavageWriteBitmapCPUToScreenColorExpand (
ScrnInfoPtr pScrn,
int x, int y, int w, int h,
unsigned char * src,
int srcwidth,
int skipleft,
int fg, int bg,
int rop,
unsigned int planemask
)
{
SavagePtr psav = SAVPTR(pScrn);
BCI_GET_PTR;
int i, j, count, reset;
unsigned int cmd;
CARD32 * srcp;
if( !srcwidth )
return;
cmd = BCI_CMD_RECT | BCI_CMD_RECT_XP | BCI_CMD_RECT_YP
| BCI_CMD_SEND_COLOR | BCI_CMD_CLIP_LR
| BCI_CMD_DEST_GBD | BCI_CMD_SRC_MONO;
cmd |= XAACopyROP[rop] << 16;
if( bg == -1 )
cmd |= BCI_CMD_SRC_TRANSPARENT;
BCI_SEND(cmd);
BCI_SEND(BCI_CLIP_LR(x+skipleft, x+w-1));
BCI_SEND(fg);
if( bg != -1 )
BCI_SEND(bg);
count = (w + 31) / 32;
reset = 65536 / count;
for (j = 0; j < h; j ++) {
BCI_SEND(BCI_X_Y(x, y+j));
BCI_SEND(BCI_W_H(w, 1));
srcp = (CARD32 *) src;
for (i = count; i > 0; srcp ++, i --) {
CARD32 u = *srcp;
u = ((u & 0x0f0f0f0f) << 4) | ((u & 0xf0f0f0f0) >> 4);
u = ((u & 0x33333333) << 2) | ((u & 0xcccccccc) >> 2);
u = ((u & 0x55555555) << 1) | ((u & 0xaaaaaaaa) >> 1);
BCI_SEND(u);
}
src += srcwidth;
if( !--reset ) {
BCI_RESET;
reset = 65536 / count;
}
}
}
void
SavageSetupForImageWrite(
ScrnInfoPtr pScrn,
int rop,
unsigned planemask,
int transparency_color,
int bpp,
int depth)
{
SavagePtr psav = SAVPTR(pScrn);
int cmd;
cmd = BCI_CMD_RECT | BCI_CMD_RECT_XP | BCI_CMD_RECT_YP
| BCI_CMD_CLIP_LR
| BCI_CMD_DEST_GBD | BCI_CMD_SRC_COLOR;
cmd |= XAACopyROP[rop] << 16;
if( transparency_color != -1 )
cmd |= BCI_CMD_SRC_TRANSPARENT;
psav->SavedBciCmd = cmd;
psav->SavedBgColor = transparency_color;
}
void SavageSubsequentImageWriteRect
(
ScrnInfoPtr pScrn,
int x,
int y,
int w,
int h,
int skipleft)
{
SavagePtr psav = SAVPTR(pScrn);
BCI_GET_PTR;
int count;
count = ((w * pScrn->bitsPerPixel + 31) / 32) * h;
psav->WaitQueue( psav, count );
BCI_SEND(psav->SavedBciCmd);
BCI_SEND(BCI_CLIP_LR(x+skipleft, x+w-1));
if( psav->SavedBgColor != -1 )
BCI_SEND(psav->SavedBgColor);
BCI_SEND(BCI_X_Y(x, y));
BCI_SEND(BCI_W_H(w, h));
}