#ifdef HAVE_XORG_CONFIG_H
#include <xorg-config.h>
#endif
#include "xf4bpp.h"
#include "mfbmap.h"
#include "mfb.h"
#include "maskbits.h"
#include "mi.h"
#include "mispans.h"
#include "ppcGCstr.h"
#include "ppcSpMcro.h"
#include "vgaVideo.h"
#include "ibmTrace.h"
#define LeftMostBitInScreenLongWord SCRLEFT( 0xFFFFFFFF, 31 )
#define SCRLEFT8(lw, n) ( (unsigned char) (((unsigned char) lw) << (n)) )
#define SCRRIGHT8(lw, n) ( (unsigned char) (((unsigned char)lw) >> (n)) )
static int
modulo
(
int n1,
int n2
)
{
int tmp;
if ( n1 < 0 ) {
tmp = (-n1) % n2;
if ( tmp == 0 ) {
return 0;
} else {
return n2 - tmp;
}
} else {
return n1 % n2;
}
}
void
xf4bppSolidPixmapFS( pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted )
DrawablePtr pDrawable ;
GCPtr pGC ;
int nInit ;
DDXPointPtr pptInit ;
int *pwidthInit ;
int fSorted ;
{
register unsigned long int pm, npm ;
register unsigned long int fg ;
register int alu ;
int n ;
register DDXPointPtr ppt ;
register int *pwidth ;
register unsigned char *addrl ;
int i ;
int *pwidthFree ;
DDXPointPtr pptFree ;
TRACE(("xf4bppSolidPixmapFS(pDrawable=0x%x, pGC=0x%x, nInit=%d, pptInit=0x%x, pwidthInit=0x%x, fSorted=%d)\n", pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted)) ;
if ( pDrawable->type != DRAWABLE_PIXMAP ) {
ErrorF("xf4bppSolidPixmapFS: drawable is not a pixmap\n") ;
return ;
}
if ( ( alu = ( (ppcPrivGC *) pGC->devPrivates[mfbGetGCPrivateIndex()].ptr )->colorRrop.alu ) == GXnoop )
return ;
n = nInit * miFindMaxBand(pGC->pCompositeClip) ;
if ( !( pwidthFree = (int *) ALLOCATE_LOCAL( n * sizeof( int ) ) ) )
return ;
pwidth = pwidthFree ;
if ( !( pptFree = (DDXPointRec *)
ALLOCATE_LOCAL( n * sizeof( DDXPointRec ) ) ) ) {
DEALLOCATE_LOCAL( pwidth ) ;
return ;
}
ppt = pptFree ;
n = miClipSpans( pGC->pCompositeClip, pptInit, pwidthInit, nInit,
ppt, pwidth, fSorted ) ;
pm = ( (ppcPrivGC *) pGC->devPrivates[mfbGetGCPrivateIndex()].ptr )->colorRrop.planemask ;
fg = ( (ppcPrivGC *) pGC->devPrivates[mfbGetGCPrivateIndex()].ptr )->colorRrop.fgPixel ;
npm = ( ~ pm ) & ( ( 1 << pDrawable->depth ) - 1 ) ;
for ( ; n-- ; ppt++, pwidth++ ) {
addrl = ( (unsigned char *) ( ( (PixmapPtr) pDrawable )->devPrivate.ptr ) )
+ ( ppt->y * ( (int) ( ( (PixmapPtr) pDrawable )->devKind ) ) )
+ ppt->x ;
for ( i = *pwidth ; i-- ; addrl++ )
{
unsigned _p;
DoRop( _p, alu, fg, *addrl );
*addrl = ( *addrl & npm ) | ( pm & _p ) ;
}
#ifdef notdef
*addrl = ( *addrl & npm ) | ( pm & DoRop( alu, fg, *addrl ) ) ;
#endif
}
DEALLOCATE_LOCAL( pptFree ) ;
DEALLOCATE_LOCAL( pwidthFree ) ;
return ;
}
static unsigned char
vgagetbits
(
register const int x,
register const unsigned int patternWidth,
register const unsigned char * const lineptr
)
{
register unsigned char bits ;
register const unsigned char *cptr ;
register int shift ;
register int wrap ;
cptr = lineptr + ( x >> 3 ) ;
bits = *cptr ;
if ((shift = x & 7))
bits = SCRLEFT8( bits, shift ) | SCRRIGHT8( cptr[1], ( 8 - shift ) ) ;
if ( ( wrap = x + 8 - patternWidth ) > 0 ) {
bits &= SCRLEFT8( 0xFF, wrap ) ;
bits |= SCRRIGHT8( *lineptr, ( 8 - wrap ) ) ;
}
switch (patternWidth) {
case 1:
bits &= ~SCRRIGHT8(0xFF,1);
bits |= SCRRIGHT8(bits,1);
bits |= SCRRIGHT8(bits,2);
bits |= SCRRIGHT8(bits,4);
break;
case 2:
bits &= ~SCRRIGHT8(0xFF,2);
bits |= SCRRIGHT8(bits,2); bits |= SCRRIGHT8(bits,4); break;
case 3:
bits &= ~SCRRIGHT8(0xFF,3);
bits |= (SCRRIGHT8(bits,3) | SCRRIGHT8(bits,6)); break;
case 4:
bits = (bits & ~SCRRIGHT8(0xFF,4)) | SCRRIGHT8(bits,4); break;
case 5:
bits = (bits & ~SCRRIGHT8(0xFF,5)) | SCRRIGHT8(bits,5); break;
case 6:
bits = (bits & ~SCRRIGHT8(0xFF,6)) | SCRRIGHT8(bits,6); break;
case 7:
bits = (bits & ~SCRRIGHT8(0xFF,7)) | SCRRIGHT8(bits,7); break;
default:
;
}
return bits ;
}
void
xf4bppStipplePixmapFS( pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted )
register DrawablePtr pDrawable ;
GC *pGC ;
int nInit ;
DDXPointPtr pptInit ;
int *pwidthInit ;
int fSorted ;
{
register unsigned char *pdst ;
register unsigned long int pm, npm ;
register unsigned long int fg ;
register int alu ;
int n ;
register DDXPointPtr ppt ;
register int *pwidth ;
PixmapPtr pTile ;
int width, x, xSrc, ySrc ;
int tlwidth, tileWidth ;
unsigned char *psrcT ;
int *pwidthFree ;
DDXPointPtr pptFree ;
int xoff, count, stip, i ;
TRACE(("xf4bppStipplePixmapFS(pDrawable=0x%x, pGC=0x%x, nInit=%d, pptInit=0x%x, pwidthInit=0x%x, fSorted=%d)\n",
pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted)) ;
if ( pDrawable->type != DRAWABLE_PIXMAP ) {
ErrorF( "xf4bppStippleWindowFS: drawable is not a pixmap\n") ;
return ;
}
if ( pGC->stipple->drawable.depth != 1 ) {
ErrorF( "ppcStippleFS: bad depth\ntype = %d, depth = %d\n",
pDrawable->type, pGC->stipple->drawable.depth ) ;
return ;
}
if ( ( alu = ( (ppcPrivGC *) pGC->devPrivates[mfbGetGCPrivateIndex()].ptr )->colorRrop.alu ) == GXnoop )
return ;
SETSPANPTRS( nInit, n, pwidthInit, pwidthFree, pptInit,
pptFree, pwidth, ppt, fSorted ) ;
pm = ( (ppcPrivGC *) pGC->devPrivates[mfbGetGCPrivateIndex()].ptr )->colorRrop.planemask ;
fg = ( (ppcPrivGC *) pGC->devPrivates[mfbGetGCPrivateIndex()].ptr )->colorRrop.fgPixel ;
pTile = pGC->stipple ;
tlwidth = pTile->devKind ;
tileWidth = pTile->drawable.width ;
npm = ( ~ pm ) & ( ( 1 << pDrawable->depth ) - 1 ) ;
xSrc = pGC->patOrg.x + pDrawable->x;
ySrc = pGC->patOrg.y + pDrawable->y;
while ( n-- ) {
pdst = ( (unsigned char *) ( (PixmapPtr) pDrawable )->devPrivate.ptr )
+ ( ppt->y * ( (int) ( ( (PixmapPtr) pDrawable )->devKind ) ) )
+ ppt->x ;
psrcT = (unsigned char *)pTile->devPrivate.ptr
+ ( modulo( ppt->y - ySrc, pTile->drawable.height ) * tlwidth ) ;
x = ppt->x ;
xoff = modulo( x - xSrc, tileWidth) ;
for ( width = *pwidth ; width ; width -= count, xoff+=count ) {
if ( xoff >= tileWidth ) xoff -= tileWidth;
if ( width < 8 )
count = width;
else
count = 8;
stip = vgagetbits( xoff, tileWidth, psrcT ) ;
for ( i = count ; i-- ; ) {
if ( stip & 128 )
{
unsigned _p;
DoRop( _p, alu, fg, *pdst ) ;
*pdst = ( *pdst & npm ) | ( pm & _p ) ;
}
#ifdef notdef
*pdst = ( *pdst & npm ) | ( pm & DoRop( alu, fg, *pdst ) ) ;
#endif
pdst++ ;
stip = SCRLEFT( stip, 1 ) ;
}
}
ppt++ ;
pwidth++ ;
}
DEALLOCATE_LOCAL( pptFree ) ;
DEALLOCATE_LOCAL( pwidthFree ) ;
return ;
}
void
xf4bppOpStipplePixmapFS( pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted )
DrawablePtr pDrawable ;
GC *pGC ;
int nInit ;
DDXPointPtr pptInit ;
int *pwidthInit ;
int fSorted ;
{
register unsigned char *pdst ;
register unsigned long int pm, npm ;
register unsigned long int fg, bg ;
register int alu ;
int n ;
register DDXPointPtr ppt ;
register int *pwidth ;
PixmapPtr pTile ;
int width ;
int xSrc, ySrc ;
int tlwidth, tileWidth ;
unsigned char *psrcT ;
int *pwidthFree ;
DDXPointPtr pptFree ;
int xoff, count, stip, i ;
TRACE( ( "xf4bppOpStipplePixmapFS(pDrawable=0x%x,pGC=0x%x,nInit=%d,pptInit=0x%x,pwidthInit=0x%x,fSorted=%d)\n",
pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted ) ) ;
if ( pGC->stipple->drawable.depth != 1 ) {
ErrorF( "xf4bppOpStipplePixmapFS: bad depth\ntype = %d, depth = %d\n",
pDrawable->type, pGC->stipple->drawable.depth ) ;
return ;
}
if ( ( alu = ( (ppcPrivGC *) pGC->devPrivates[mfbGetGCPrivateIndex()].ptr )->colorRrop.alu ) == GXnoop )
return ;
SETSPANPTRS( nInit, n, pwidthInit, pwidthFree, pptInit,
pptFree, pwidth, ppt, fSorted ) ;
fg = ( (ppcPrivGC *) pGC->devPrivates[mfbGetGCPrivateIndex()].ptr )->colorRrop.fgPixel ;
bg = ( (ppcPrivGC *) pGC->devPrivates[mfbGetGCPrivateIndex()].ptr )->colorRrop.bgPixel ;
pm = ( (ppcPrivGC *) pGC->devPrivates[mfbGetGCPrivateIndex()].ptr )->colorRrop.planemask ;
npm = ( ~ pm ) & ( ( 1 << pDrawable->depth ) - 1 ) ;
pTile = pGC->stipple ;
tlwidth = pTile->devKind ;
tileWidth = pTile->drawable.width ;
xSrc = pGC->patOrg.x + pDrawable->x;
ySrc = pGC->patOrg.y + pDrawable->y;
for ( ; n-- ; ppt++, pwidth++ ) {
pdst = ( (unsigned char *) ( (PixmapPtr) pDrawable )->devPrivate.ptr )
+ ( ppt->y * ( (int) ( (PixmapPtr) pDrawable )->devKind ) )
+ ppt->x ;
psrcT = (unsigned char *)pTile->devPrivate.ptr
+ ( modulo( ppt->y - ySrc, pTile->drawable.height ) * tlwidth ) ;
xoff = modulo( ppt->x - xSrc, tileWidth) ;
for ( width = *pwidth ; width ; width -= count, xoff+=count ) {
if ( xoff >= tileWidth ) xoff -= tileWidth;
if ( width < 8 )
count = width;
else
count = 8;
stip = vgagetbits( xoff, tileWidth, psrcT ) ;
for ( i = count ; i-- ; pdst++, stip = SCRLEFT( stip, 1 ) )
if ( stip & 128 )
{
unsigned _p;
DoRop( _p, alu, fg, *pdst ) ;
*pdst = ( *pdst & npm ) | ( pm & _p ) ;
}
#ifdef notdef
*pdst = ( *pdst & npm ) | ( pm & DoRop( alu, fg, *pdst ) ) ;
#endif
else
{
unsigned _p;
DoRop( _p, alu, bg, *pdst ) ;
*pdst = ( *pdst & npm ) | ( pm & _p ) ;
}
#ifdef notdef
*pdst = ( *pdst & npm ) | ( pm & DoRop( alu, bg, *pdst ) ) ;
#endif
}
}
DEALLOCATE_LOCAL( pptFree ) ;
DEALLOCATE_LOCAL( pwidthFree ) ;
return ;
}
void
xf4bppTilePixmapFS( pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted )
register DrawablePtr pDrawable ;
GC *pGC ;
int nInit ;
DDXPointPtr pptInit ;
int *pwidthInit ;
int fSorted ;
{
register DDXPointPtr ppt ;
register int *pwidth ;
register unsigned char *pdst ;
register unsigned char *psrc ;
register PixmapPtr pTile ;
int i ;
int alu ;
unsigned char pm, npm ;
int n ;
int tileWidth ;
int xSrc, ySrc;
unsigned char *psrcT ;
int *pwidthFree ;
DDXPointPtr pptFree ;
TRACE( ( "ppcTileFS(pDrawable=0x%x,pGC=0x%x,nInit=%d,pptInit=0x%x,pwidthInit=0x%x,fSorted=%d)\n",
pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted ) ) ;
if ( ( pDrawable->depth == 1 ) && ( pDrawable->type == DRAWABLE_PIXMAP ) ) {
mfbTileFS( pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted ) ;
return ;
}
if ( !xf4bppDepthOK( pDrawable, pGC->tile.pixmap->drawable.depth ) ) {
ErrorF( "ppcTileFS: bad depth\ntype = %d, depth = %d\n",
pDrawable->type, pDrawable->depth) ;
return ;
}
if ( ( alu = ( (ppcPrivGC *) pGC->devPrivates[mfbGetGCPrivateIndex()].ptr )->colorRrop.alu ) == GXnoop )
return ;
SETSPANPTRS( nInit, n, pwidthInit, pwidthFree, pptInit,
pptFree, pwidth, ppt, fSorted ) ;
pm = ( (ppcPrivGC *) pGC->devPrivates[mfbGetGCPrivateIndex()].ptr )->colorRrop.planemask ;
npm = ( ~ pm ) & ( ( 1 << pDrawable->depth ) - 1 ) ;
pTile = pGC->tile.pixmap ;
tileWidth = pTile->drawable.width ;
xSrc = pGC->patOrg.x + pDrawable->x;
ySrc = pGC->patOrg.y + pDrawable->y;
for ( ; n-- ; ppt++, pwidth++ ) {
pdst = ( (unsigned char *) ( (PixmapPtr) pDrawable )->devPrivate.ptr )
+ ( ppt->y * ( (int) ( (PixmapPtr) pDrawable )->devKind ) )
+ ppt->x ;
psrcT = (unsigned char *) pTile->devPrivate.ptr
+ ( modulo( ppt->y - ySrc, pTile->drawable.height) * pTile->devKind ) ;
psrc = psrcT + modulo( ppt->x - xSrc, tileWidth ) ;
for ( i = *pwidth ; i-- ; pdst++, psrc++ ) {
if ( psrc >= ( psrcT + tileWidth ) )
psrc = psrcT ;
{
unsigned _p;
DoRop( _p, alu, *psrc, *pdst ) ;
*pdst = ( *pdst & npm ) | ( pm & _p ) ;
}
#ifdef notdef
*pdst = ( *pdst & npm ) | ( pm & DoRop( alu, *psrc, *pdst ) ) ;
#endif
}
}
DEALLOCATE_LOCAL( pptFree ) ;
DEALLOCATE_LOCAL( pwidthFree ) ;
return ;
}