Merge remote branch 'sandmann/fbdelete'
This commit is contained in:
commit
73f6de1ad8
125
fb/fbpict.c
125
fb/fbpict.c
|
@ -35,112 +35,6 @@
|
||||||
#include "mipict.h"
|
#include "mipict.h"
|
||||||
#include "fbpict.h"
|
#include "fbpict.h"
|
||||||
|
|
||||||
#define mod(a,b) ((b) == 1 ? 0 : (a) >= 0 ? (a) % (b) : (b) - (-a) % (b))
|
|
||||||
|
|
||||||
void
|
|
||||||
fbWalkCompositeRegion (CARD8 op,
|
|
||||||
PicturePtr pSrc,
|
|
||||||
PicturePtr pMask,
|
|
||||||
PicturePtr pDst,
|
|
||||||
INT16 xSrc,
|
|
||||||
INT16 ySrc,
|
|
||||||
INT16 xMask,
|
|
||||||
INT16 yMask,
|
|
||||||
INT16 xDst,
|
|
||||||
INT16 yDst,
|
|
||||||
CARD16 width,
|
|
||||||
CARD16 height,
|
|
||||||
Bool srcRepeat,
|
|
||||||
Bool maskRepeat,
|
|
||||||
CompositeFunc compositeRect)
|
|
||||||
{
|
|
||||||
RegionRec region;
|
|
||||||
int n;
|
|
||||||
BoxPtr pbox;
|
|
||||||
int w, h, w_this, h_this;
|
|
||||||
int x_msk, y_msk, x_src, y_src, x_dst, y_dst;
|
|
||||||
|
|
||||||
xDst += pDst->pDrawable->x;
|
|
||||||
yDst += pDst->pDrawable->y;
|
|
||||||
if (pSrc->pDrawable)
|
|
||||||
{
|
|
||||||
xSrc += pSrc->pDrawable->x;
|
|
||||||
ySrc += pSrc->pDrawable->y;
|
|
||||||
}
|
|
||||||
if (pMask && pMask->pDrawable)
|
|
||||||
{
|
|
||||||
xMask += pMask->pDrawable->x;
|
|
||||||
yMask += pMask->pDrawable->y;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!miComputeCompositeRegion (®ion, pSrc, pMask, pDst, xSrc, ySrc,
|
|
||||||
xMask, yMask, xDst, yDst, width, height))
|
|
||||||
return;
|
|
||||||
|
|
||||||
n = RegionNumRects (®ion);
|
|
||||||
pbox = RegionRects (®ion);
|
|
||||||
while (n--)
|
|
||||||
{
|
|
||||||
h = pbox->y2 - pbox->y1;
|
|
||||||
y_src = pbox->y1 - yDst + ySrc;
|
|
||||||
y_msk = pbox->y1 - yDst + yMask;
|
|
||||||
y_dst = pbox->y1;
|
|
||||||
while (h)
|
|
||||||
{
|
|
||||||
h_this = h;
|
|
||||||
w = pbox->x2 - pbox->x1;
|
|
||||||
x_src = pbox->x1 - xDst + xSrc;
|
|
||||||
x_msk = pbox->x1 - xDst + xMask;
|
|
||||||
x_dst = pbox->x1;
|
|
||||||
if (maskRepeat)
|
|
||||||
{
|
|
||||||
y_msk = mod (y_msk - pMask->pDrawable->y, pMask->pDrawable->height);
|
|
||||||
if (h_this > pMask->pDrawable->height - y_msk)
|
|
||||||
h_this = pMask->pDrawable->height - y_msk;
|
|
||||||
y_msk += pMask->pDrawable->y;
|
|
||||||
}
|
|
||||||
if (srcRepeat)
|
|
||||||
{
|
|
||||||
y_src = mod (y_src - pSrc->pDrawable->y, pSrc->pDrawable->height);
|
|
||||||
if (h_this > pSrc->pDrawable->height - y_src)
|
|
||||||
h_this = pSrc->pDrawable->height - y_src;
|
|
||||||
y_src += pSrc->pDrawable->y;
|
|
||||||
}
|
|
||||||
while (w)
|
|
||||||
{
|
|
||||||
w_this = w;
|
|
||||||
if (maskRepeat)
|
|
||||||
{
|
|
||||||
x_msk = mod (x_msk - pMask->pDrawable->x, pMask->pDrawable->width);
|
|
||||||
if (w_this > pMask->pDrawable->width - x_msk)
|
|
||||||
w_this = pMask->pDrawable->width - x_msk;
|
|
||||||
x_msk += pMask->pDrawable->x;
|
|
||||||
}
|
|
||||||
if (srcRepeat)
|
|
||||||
{
|
|
||||||
x_src = mod (x_src - pSrc->pDrawable->x, pSrc->pDrawable->width);
|
|
||||||
if (w_this > pSrc->pDrawable->width - x_src)
|
|
||||||
w_this = pSrc->pDrawable->width - x_src;
|
|
||||||
x_src += pSrc->pDrawable->x;
|
|
||||||
}
|
|
||||||
(*compositeRect) (op, pSrc, pMask, pDst,
|
|
||||||
x_src, y_src, x_msk, y_msk, x_dst, y_dst,
|
|
||||||
w_this, h_this);
|
|
||||||
w -= w_this;
|
|
||||||
x_src += w_this;
|
|
||||||
x_msk += w_this;
|
|
||||||
x_dst += w_this;
|
|
||||||
}
|
|
||||||
h -= h_this;
|
|
||||||
y_src += h_this;
|
|
||||||
y_msk += h_this;
|
|
||||||
y_dst += h_this;
|
|
||||||
}
|
|
||||||
pbox++;
|
|
||||||
}
|
|
||||||
RegionUninit(®ion);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
fbComposite (CARD8 op,
|
fbComposite (CARD8 op,
|
||||||
PicturePtr pSrc,
|
PicturePtr pSrc,
|
||||||
|
@ -182,25 +76,6 @@ fbComposite (CARD8 op,
|
||||||
free_pixman_pict (pDst, dest);
|
free_pixman_pict (pDst, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
fbCompositeGeneral (CARD8 op,
|
|
||||||
PicturePtr pSrc,
|
|
||||||
PicturePtr pMask,
|
|
||||||
PicturePtr pDst,
|
|
||||||
INT16 xSrc,
|
|
||||||
INT16 ySrc,
|
|
||||||
INT16 xMask,
|
|
||||||
INT16 yMask,
|
|
||||||
INT16 xDst,
|
|
||||||
INT16 yDst,
|
|
||||||
CARD16 width,
|
|
||||||
CARD16 height)
|
|
||||||
{
|
|
||||||
fbComposite (op, pSrc, pMask, pDst,
|
|
||||||
xSrc, ySrc, xMask, yMask, xDst, yDst,
|
|
||||||
width, height);
|
|
||||||
}
|
|
||||||
|
|
||||||
static pixman_image_t *
|
static pixman_image_t *
|
||||||
create_solid_fill_image (PicturePtr pict)
|
create_solid_fill_image (PicturePtr pict)
|
||||||
{
|
{
|
||||||
|
|
416
fb/fbpict.h
416
fb/fbpict.h
|
@ -28,392 +28,6 @@
|
||||||
#ifndef _FBPICT_H_
|
#ifndef _FBPICT_H_
|
||||||
#define _FBPICT_H_
|
#define _FBPICT_H_
|
||||||
|
|
||||||
#include "renderedge.h"
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(__GNUC__)
|
|
||||||
#define INLINE __inline__
|
|
||||||
#else
|
|
||||||
#define INLINE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define FbIntMult(a,b,t) ( (t) = (a) * (b) + 0x80, ( ( ( (t)>>8 ) + (t) )>>8 ) )
|
|
||||||
#define FbIntDiv(a,b) (((CARD16) (a) * 255) / (b))
|
|
||||||
|
|
||||||
#define FbGet8(v,i) ((CARD16) (CARD8) ((v) >> i))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* There are two ways of handling alpha -- either as a single unified value or
|
|
||||||
* a separate value for each component, hence each macro must have two
|
|
||||||
* versions. The unified alpha version has a 'U' at the end of the name,
|
|
||||||
* the component version has a 'C'. Similarly, functions which deal with
|
|
||||||
* this difference will have two versions using the same convention.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define FbOverU(x,y,i,a,t) ((t) = FbIntMult(FbGet8(y,i),(a),(t)) + FbGet8(x,i),\
|
|
||||||
(CARD32) ((CARD8) ((t) | (0 - ((t) >> 8)))) << (i))
|
|
||||||
|
|
||||||
#define FbOverC(x,y,i,a,t) ((t) = FbIntMult(FbGet8(y,i),FbGet8(a,i),(t)) + FbGet8(x,i),\
|
|
||||||
(CARD32) ((CARD8) ((t) | (0 - ((t) >> 8)))) << (i))
|
|
||||||
|
|
||||||
#define FbInU(x,i,a,t) ((CARD32) FbIntMult(FbGet8(x,i),(a),(t)) << (i))
|
|
||||||
|
|
||||||
#define FbInC(x,i,a,t) ((CARD32) FbIntMult(FbGet8(x,i),FbGet8(a,i),(t)) << (i))
|
|
||||||
|
|
||||||
#define FbGen(x,y,i,ax,ay,t,u,v) ((t) = (FbIntMult(FbGet8(y,i),ay,(u)) + \
|
|
||||||
FbIntMult(FbGet8(x,i),ax,(v))),\
|
|
||||||
(CARD32) ((CARD8) ((t) | \
|
|
||||||
(0 - ((t) >> 8)))) << (i))
|
|
||||||
|
|
||||||
#define FbAdd(x,y,i,t) ((t) = FbGet8(x,i) + FbGet8(y,i), \
|
|
||||||
(CARD32) ((CARD8) ((t) | (0 - ((t) >> 8)))) << (i))
|
|
||||||
|
|
||||||
|
|
||||||
#define Alpha(x) ((x) >> 24)
|
|
||||||
#define Red(x) (((x) >> 16) & 0xff)
|
|
||||||
#define Green(x) (((x) >> 8) & 0xff)
|
|
||||||
#define Blue(x) ((x) & 0xff)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns TRUE if the fbComposeGetSolid can be used to get a single solid
|
|
||||||
* color representing every source sampling location of the picture.
|
|
||||||
*/
|
|
||||||
static INLINE Bool
|
|
||||||
fbCanGetSolid(PicturePtr pict)
|
|
||||||
{
|
|
||||||
if (pict->pDrawable == NULL ||
|
|
||||||
pict->pDrawable->width != 1 ||
|
|
||||||
pict->pDrawable->height != 1)
|
|
||||||
{
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
if (pict->repeat != RepeatNormal)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
switch (pict->format) {
|
|
||||||
case PICT_a8r8g8b8:
|
|
||||||
case PICT_x8r8g8b8:
|
|
||||||
case PICT_a8b8g8r8:
|
|
||||||
case PICT_x8b8g8r8:
|
|
||||||
case PICT_b8g8r8a8:
|
|
||||||
case PICT_b8g8r8x8:
|
|
||||||
case PICT_r8g8b8:
|
|
||||||
case PICT_b8g8r8:
|
|
||||||
case PICT_r5g6b5:
|
|
||||||
case PICT_b5g6r5:
|
|
||||||
return TRUE;
|
|
||||||
default:
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#define fbComposeGetSolid(pict, bits, fmt) { \
|
|
||||||
FbBits *__bits__; \
|
|
||||||
FbStride __stride__; \
|
|
||||||
int __bpp__; \
|
|
||||||
int __xoff__,__yoff__; \
|
|
||||||
\
|
|
||||||
fbGetDrawable((pict)->pDrawable,__bits__,__stride__,__bpp__,__xoff__,__yoff__); \
|
|
||||||
switch (__bpp__) { \
|
|
||||||
case 32: \
|
|
||||||
(bits) = READ((CARD32 *) __bits__); \
|
|
||||||
break; \
|
|
||||||
case 24: \
|
|
||||||
(bits) = Fetch24 ((CARD8 *) __bits__); \
|
|
||||||
break; \
|
|
||||||
case 16: \
|
|
||||||
(bits) = READ((CARD16 *) __bits__); \
|
|
||||||
(bits) = cvt0565to0888(bits); \
|
|
||||||
break; \
|
|
||||||
case 8: \
|
|
||||||
(bits) = READ((CARD8 *) __bits__); \
|
|
||||||
(bits) = (bits) << 24; \
|
|
||||||
break; \
|
|
||||||
case 1: \
|
|
||||||
(bits) = READ((CARD32 *) __bits__); \
|
|
||||||
(bits) = FbLeftStipBits((bits),1) ? 0xff000000 : 0x00000000;\
|
|
||||||
break; \
|
|
||||||
default: \
|
|
||||||
return; \
|
|
||||||
} \
|
|
||||||
/* If necessary, convert RGB <--> BGR. */ \
|
|
||||||
if (PICT_FORMAT_TYPE((pict)->format) != PICT_FORMAT_TYPE(fmt)) \
|
|
||||||
{ \
|
|
||||||
(bits) = (((bits) & 0xff000000) | \
|
|
||||||
(((bits) & 0x00ff0000) >> 16) | \
|
|
||||||
(((bits) & 0x0000ff00) >> 0) | \
|
|
||||||
(((bits) & 0x000000ff) << 16)); \
|
|
||||||
} \
|
|
||||||
/* manage missing src alpha */ \
|
|
||||||
if ((pict)->pFormat->direct.alphaMask == 0) \
|
|
||||||
(bits) |= 0xff000000; \
|
|
||||||
fbFinishAccess ((pict)->pDrawable); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define fbComposeGetStart(pict,x,y,type,stride,line,mul) {\
|
|
||||||
FbBits *__bits__; \
|
|
||||||
FbStride __stride__; \
|
|
||||||
int __bpp__; \
|
|
||||||
int __xoff__,__yoff__; \
|
|
||||||
\
|
|
||||||
fbGetDrawable((pict)->pDrawable,__bits__,__stride__,__bpp__,__xoff__,__yoff__); \
|
|
||||||
(stride) = __stride__ * sizeof (FbBits) / sizeof (type); \
|
|
||||||
(line) = ((type *) __bits__) + (stride) * ((y) + __yoff__) + (mul) * ((x) + __xoff__); \
|
|
||||||
}
|
|
||||||
#define cvt8888to0565(s) ((((s) >> 3) & 0x001f) | \
|
|
||||||
(((s) >> 5) & 0x07e0) | \
|
|
||||||
(((s) >> 8) & 0xf800))
|
|
||||||
#define cvt0565to0888(s) (((((s) << 3) & 0xf8) | (((s) >> 2) & 0x7)) | \
|
|
||||||
((((s) << 5) & 0xfc00) | (((s) >> 1) & 0x300)) | \
|
|
||||||
((((s) << 8) & 0xf80000) | (((s) << 3) & 0x70000)))
|
|
||||||
|
|
||||||
#if IMAGE_BYTE_ORDER == MSBFirst
|
|
||||||
#define Fetch24(a) ((unsigned long) (a) & 1 ? \
|
|
||||||
((READ(a) << 16) | READ((CARD16 *) ((a)+1))) : \
|
|
||||||
((READ((CARD16 *) (a)) << 8) | READ((a)+2)))
|
|
||||||
#define Store24(a,v) ((unsigned long) (a) & 1 ? \
|
|
||||||
(WRITE(a, (CARD8) ((v) >> 16)), \
|
|
||||||
WRITE((CARD16 *) ((a)+1), (CARD16) (v))) : \
|
|
||||||
(WRITE((CARD16 *) (a), (CARD16) ((v) >> 8)), \
|
|
||||||
WRITE((a)+2, (CARD8) (v))))
|
|
||||||
#else
|
|
||||||
#define Fetch24(a) ((unsigned long) (a) & 1 ? \
|
|
||||||
(READ(a) | (READ((CARD16 *) ((a)+1)) << 8)) : \
|
|
||||||
(READ((CARD16 *) (a)) | (READ((a)+2) << 16)))
|
|
||||||
#define Store24(a,v) ((unsigned long) (a) & 1 ? \
|
|
||||||
(WRITE(a, (CARD8) (v)), \
|
|
||||||
WRITE((CARD16 *) ((a)+1), (CARD16) ((v) >> 8))) : \
|
|
||||||
(WRITE((CARD16 *) (a), (CARD16) (v)),\
|
|
||||||
WRITE((a)+2, (CARD8) ((v) >> 16))))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
The methods below use some tricks to be able to do two color
|
|
||||||
components at the same time.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
x_c = (x_c * a) / 255
|
|
||||||
*/
|
|
||||||
#define FbByteMul(x, a) do { \
|
|
||||||
CARD32 t = ((x & 0xff00ff) * a) + 0x800080; \
|
|
||||||
t = (t + ((t >> 8) & 0xff00ff)) >> 8; \
|
|
||||||
t &= 0xff00ff; \
|
|
||||||
\
|
|
||||||
x = (((x >> 8) & 0xff00ff) * a) + 0x800080; \
|
|
||||||
x = (x + ((x >> 8) & 0xff00ff)); \
|
|
||||||
x &= 0xff00ff00; \
|
|
||||||
x += t; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/*
|
|
||||||
x_c = (x_c * a) / 255 + y
|
|
||||||
*/
|
|
||||||
#define FbByteMulAdd(x, a, y) do { \
|
|
||||||
CARD32 t = ((x & 0xff00ff) * a) + 0x800080; \
|
|
||||||
t = (t + ((t >> 8) & 0xff00ff)) >> 8; \
|
|
||||||
t &= 0xff00ff; \
|
|
||||||
t += y & 0xff00ff; \
|
|
||||||
t |= 0x1000100 - ((t >> 8) & 0xff00ff); \
|
|
||||||
t &= 0xff00ff; \
|
|
||||||
\
|
|
||||||
x = (((x >> 8) & 0xff00ff) * a) + 0x800080; \
|
|
||||||
x = (x + ((x >> 8) & 0xff00ff)) >> 8; \
|
|
||||||
x &= 0xff00ff; \
|
|
||||||
x += (y >> 8) & 0xff00ff; \
|
|
||||||
x |= 0x1000100 - ((x >> 8) & 0xff00ff); \
|
|
||||||
x &= 0xff00ff; \
|
|
||||||
x <<= 8; \
|
|
||||||
x += t; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/*
|
|
||||||
x_c = (x_c * a + y_c * b) / 255
|
|
||||||
*/
|
|
||||||
#define FbByteAddMul(x, a, y, b) do { \
|
|
||||||
CARD32 t; \
|
|
||||||
CARD32 r = (x >> 24) * a + (y >> 24) * b + 0x80; \
|
|
||||||
r += (r >> 8); \
|
|
||||||
r >>= 8; \
|
|
||||||
\
|
|
||||||
t = (x & 0xff00) * a + (y & 0xff00) * b; \
|
|
||||||
t += (t >> 8) + 0x8000; \
|
|
||||||
t >>= 16; \
|
|
||||||
\
|
|
||||||
t |= r << 16; \
|
|
||||||
t |= 0x1000100 - ((t >> 8) & 0xff00ff); \
|
|
||||||
t &= 0xff00ff; \
|
|
||||||
t <<= 8; \
|
|
||||||
\
|
|
||||||
r = ((x >> 16) & 0xff) * a + ((y >> 16) & 0xff) * b + 0x80; \
|
|
||||||
r += (r >> 8); \
|
|
||||||
r >>= 8; \
|
|
||||||
\
|
|
||||||
x = (x & 0xff) * a + (y & 0xff) * b + 0x80; \
|
|
||||||
x += (x >> 8); \
|
|
||||||
x >>= 8; \
|
|
||||||
x |= r << 16; \
|
|
||||||
x |= 0x1000100 - ((x >> 8) & 0xff00ff); \
|
|
||||||
x &= 0xff00ff; \
|
|
||||||
x |= t; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/*
|
|
||||||
x_c = (x_c * a + y_c *b) / 256
|
|
||||||
*/
|
|
||||||
#define FbByteAddMul_256(x, a, y, b) do { \
|
|
||||||
CARD32 t = (x & 0xff00ff) * a + (y & 0xff00ff) * b; \
|
|
||||||
t >>= 8; \
|
|
||||||
t &= 0xff00ff; \
|
|
||||||
\
|
|
||||||
x = ((x >> 8) & 0xff00ff) * a + ((y >> 8) & 0xff00ff) * b; \
|
|
||||||
x &= 0xff00ff00; \
|
|
||||||
x += t; \
|
|
||||||
} while (0)
|
|
||||||
/*
|
|
||||||
x_c = (x_c * a_c) / 255
|
|
||||||
*/
|
|
||||||
#define FbByteMulC(x, a) do { \
|
|
||||||
CARD32 t; \
|
|
||||||
CARD32 r = (x & 0xff) * (a & 0xff); \
|
|
||||||
r |= (x & 0xff0000) * ((a >> 16) & 0xff); \
|
|
||||||
r += 0x800080; \
|
|
||||||
r = (r + ((r >> 8) & 0xff00ff)) >> 8; \
|
|
||||||
r &= 0xff00ff; \
|
|
||||||
\
|
|
||||||
x >>= 8; \
|
|
||||||
t = (x & 0xff) * ((a >> 8) & 0xff); \
|
|
||||||
t |= (x & 0xff0000) * (a >> 24); \
|
|
||||||
t += 0x800080; \
|
|
||||||
t = t + ((t >> 8) & 0xff00ff); \
|
|
||||||
x = r | (t & 0xff00ff00); \
|
|
||||||
\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/*
|
|
||||||
x_c = (x_c * a) / 255 + y
|
|
||||||
*/
|
|
||||||
#define FbByteMulAddC(x, a, y) do { \
|
|
||||||
CARD32 t; \
|
|
||||||
CARD32 r = (x & 0xff) * (a & 0xff); \
|
|
||||||
r |= (x & 0xff0000) * ((a >> 16) & 0xff); \
|
|
||||||
r += 0x800080; \
|
|
||||||
r = (r + ((r >> 8) & 0xff00ff)) >> 8; \
|
|
||||||
r &= 0xff00ff; \
|
|
||||||
r += y & 0xff00ff; \
|
|
||||||
r |= 0x1000100 - ((r >> 8) & 0xff00ff); \
|
|
||||||
r &= 0xff00ff; \
|
|
||||||
\
|
|
||||||
x >>= 8; \
|
|
||||||
t = (x & 0xff) * ((a >> 8) & 0xff); \
|
|
||||||
t |= (x & 0xff0000) * (a >> 24); \
|
|
||||||
t += 0x800080; \
|
|
||||||
t = (t + ((t >> 8) & 0xff00ff)) >> 8; \
|
|
||||||
t &= 0xff00ff; \
|
|
||||||
t += (y >> 8) & 0xff00ff; \
|
|
||||||
t |= 0x1000100 - ((t >> 8) & 0xff00ff); \
|
|
||||||
t &= 0xff00ff; \
|
|
||||||
x = r | (t << 8); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/*
|
|
||||||
x_c = (x_c * a_c + y_c * b) / 255
|
|
||||||
*/
|
|
||||||
#define FbByteAddMulC(x, a, y, b) do { \
|
|
||||||
CARD32 t; \
|
|
||||||
CARD32 r = (x >> 24) * (a >> 24) + (y >> 24) * b; \
|
|
||||||
r += (r >> 8) + 0x80; \
|
|
||||||
r >>= 8; \
|
|
||||||
\
|
|
||||||
t = (x & 0xff00) * ((a >> 8) & 0xff) + (y & 0xff00) * b; \
|
|
||||||
t += (t >> 8) + 0x8000; \
|
|
||||||
t >>= 16; \
|
|
||||||
\
|
|
||||||
t |= r << 16; \
|
|
||||||
t |= 0x1000100 - ((t >> 8) & 0xff00ff); \
|
|
||||||
t &= 0xff00ff; \
|
|
||||||
t <<= 8; \
|
|
||||||
\
|
|
||||||
r = ((x >> 16) & 0xff) * ((a >> 16) & 0xff) + ((y >> 16) & 0xff) * b + 0x80; \
|
|
||||||
r += (r >> 8); \
|
|
||||||
r >>= 8; \
|
|
||||||
\
|
|
||||||
x = (x & 0xff) * (a & 0xff) + (y & 0xff) * b + 0x80; \
|
|
||||||
x += (x >> 8); \
|
|
||||||
x >>= 8; \
|
|
||||||
x |= r << 16; \
|
|
||||||
x |= 0x1000100 - ((x >> 8) & 0xff00ff); \
|
|
||||||
x &= 0xff00ff; \
|
|
||||||
x |= t; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/*
|
|
||||||
x_c = min(x_c + y_c, 255)
|
|
||||||
*/
|
|
||||||
#define FbByteAdd(x, y) do { \
|
|
||||||
CARD32 t; \
|
|
||||||
CARD32 r = (x & 0xff00ff) + (y & 0xff00ff); \
|
|
||||||
r |= 0x1000100 - ((r >> 8) & 0xff00ff); \
|
|
||||||
r &= 0xff00ff; \
|
|
||||||
\
|
|
||||||
t = ((x >> 8) & 0xff00ff) + ((y >> 8) & 0xff00ff); \
|
|
||||||
t |= 0x1000100 - ((t >> 8) & 0xff00ff); \
|
|
||||||
r |= (t & 0xff00ff) << 8; \
|
|
||||||
x = r; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define div_255(x) (((x) + 0x80 + (((x) + 0x80) >> 8)) >> 8)
|
|
||||||
|
|
||||||
#if defined(__i386__) && defined(__GNUC__)
|
|
||||||
#define FASTCALL __attribute__((regparm(3)))
|
|
||||||
#else
|
|
||||||
#define FASTCALL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct _FbComposeData {
|
|
||||||
CARD8 op;
|
|
||||||
PicturePtr src;
|
|
||||||
PicturePtr mask;
|
|
||||||
PicturePtr dest;
|
|
||||||
INT16 xSrc;
|
|
||||||
INT16 ySrc;
|
|
||||||
INT16 xMask;
|
|
||||||
INT16 yMask;
|
|
||||||
INT16 xDest;
|
|
||||||
INT16 yDest;
|
|
||||||
CARD16 width;
|
|
||||||
CARD16 height;
|
|
||||||
} FbComposeData;
|
|
||||||
|
|
||||||
extern _X_EXPORT void
|
|
||||||
fbCompositeRect (const FbComposeData *data, CARD32 *scanline_buffer);
|
|
||||||
|
|
||||||
typedef FASTCALL void (*CombineMaskU) (CARD32 *src, const CARD32 *mask, int width);
|
|
||||||
typedef FASTCALL void (*CombineFuncU) (CARD32 *dest, const CARD32 *src, int width);
|
|
||||||
typedef FASTCALL void (*CombineFuncC) (CARD32 *dest, CARD32 *src, CARD32 *mask, int width);
|
|
||||||
|
|
||||||
typedef struct _FbComposeFunctions {
|
|
||||||
CombineFuncU *combineU;
|
|
||||||
CombineFuncC *combineC;
|
|
||||||
CombineMaskU combineMaskU;
|
|
||||||
} FbComposeFunctions;
|
|
||||||
|
|
||||||
/* fbcompose.c */
|
|
||||||
|
|
||||||
extern _X_EXPORT void
|
|
||||||
fbCompositeGeneral (CARD8 op,
|
|
||||||
PicturePtr pSrc,
|
|
||||||
PicturePtr pMask,
|
|
||||||
PicturePtr pDst,
|
|
||||||
INT16 xSrc,
|
|
||||||
INT16 ySrc,
|
|
||||||
INT16 xMask,
|
|
||||||
INT16 yMask,
|
|
||||||
INT16 xDst,
|
|
||||||
INT16 yDst,
|
|
||||||
CARD16 width,
|
|
||||||
CARD16 height);
|
|
||||||
|
|
||||||
/* fbpict.c */
|
/* fbpict.c */
|
||||||
extern _X_EXPORT void
|
extern _X_EXPORT void
|
||||||
fbComposite (CARD8 op,
|
fbComposite (CARD8 op,
|
||||||
|
@ -429,36 +43,6 @@ fbComposite (CARD8 op,
|
||||||
CARD16 width,
|
CARD16 width,
|
||||||
CARD16 height);
|
CARD16 height);
|
||||||
|
|
||||||
typedef void (*CompositeFunc) (CARD8 op,
|
|
||||||
PicturePtr pSrc,
|
|
||||||
PicturePtr pMask,
|
|
||||||
PicturePtr pDst,
|
|
||||||
INT16 xSrc,
|
|
||||||
INT16 ySrc,
|
|
||||||
INT16 xMask,
|
|
||||||
INT16 yMask,
|
|
||||||
INT16 xDst,
|
|
||||||
INT16 yDst,
|
|
||||||
CARD16 width,
|
|
||||||
CARD16 height);
|
|
||||||
|
|
||||||
extern _X_EXPORT void
|
|
||||||
fbWalkCompositeRegion (CARD8 op,
|
|
||||||
PicturePtr pSrc,
|
|
||||||
PicturePtr pMask,
|
|
||||||
PicturePtr pDst,
|
|
||||||
INT16 xSrc,
|
|
||||||
INT16 ySrc,
|
|
||||||
INT16 xMask,
|
|
||||||
INT16 yMask,
|
|
||||||
INT16 xDst,
|
|
||||||
INT16 yDst,
|
|
||||||
CARD16 width,
|
|
||||||
CARD16 height,
|
|
||||||
Bool srcRepeat,
|
|
||||||
Bool maskRepeat,
|
|
||||||
CompositeFunc compositeRect);
|
|
||||||
|
|
||||||
/* fbtrap.c */
|
/* fbtrap.c */
|
||||||
|
|
||||||
extern _X_EXPORT void
|
extern _X_EXPORT void
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
|
|
||||||
#include "picturestr.h"
|
#include "picturestr.h"
|
||||||
#include "mipict.h"
|
#include "mipict.h"
|
||||||
#include "renderedge.h"
|
|
||||||
#include "fbpict.h"
|
#include "fbpict.h"
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -39,20 +39,6 @@
|
||||||
#define fbClearVisualTypes wfbClearVisualTypes
|
#define fbClearVisualTypes wfbClearVisualTypes
|
||||||
#define fbCloseScreen wfbCloseScreen
|
#define fbCloseScreen wfbCloseScreen
|
||||||
#define fbComposite wfbComposite
|
#define fbComposite wfbComposite
|
||||||
#define fbCompositeGeneral wfbCompositeGeneral
|
|
||||||
#define fbCompositeSolidMask_nx1xn wfbCompositeSolidMask_nx1xn
|
|
||||||
#define fbCompositeSolidMask_nx8888x0565C wfbCompositeSolidMask_nx8888x0565C
|
|
||||||
#define fbCompositeSolidMask_nx8888x8888C wfbCompositeSolidMask_nx8888x8888C
|
|
||||||
#define fbCompositeSolidMask_nx8x0565 wfbCompositeSolidMask_nx8x0565
|
|
||||||
#define fbCompositeSolidMask_nx8x0888 wfbCompositeSolidMask_nx8x0888
|
|
||||||
#define fbCompositeSolidMask_nx8x8888 wfbCompositeSolidMask_nx8x8888
|
|
||||||
#define fbCompositeSrc_0565x0565 wfbCompositeSrc_0565x0565
|
|
||||||
#define fbCompositeSrc_8888x0565 wfbCompositeSrc_8888x0565
|
|
||||||
#define fbCompositeSrc_8888x0888 wfbCompositeSrc_8888x0888
|
|
||||||
#define fbCompositeSrc_8888x8888 wfbCompositeSrc_8888x8888
|
|
||||||
#define fbCompositeSrcAdd_1000x1000 wfbCompositeSrcAdd_1000x1000
|
|
||||||
#define fbCompositeSrcAdd_8000x8000 wfbCompositeSrcAdd_8000x8000
|
|
||||||
#define fbCompositeSrcAdd_8888x8888 wfbCompositeSrcAdd_8888x8888
|
|
||||||
#define fbCopy1toN wfbCopy1toN
|
#define fbCopy1toN wfbCopy1toN
|
||||||
#define fbCopyArea wfbCopyArea
|
#define fbCopyArea wfbCopyArea
|
||||||
#define fbCopyNto1 wfbCopyNto1
|
#define fbCopyNto1 wfbCopyNto1
|
||||||
|
@ -149,7 +135,6 @@
|
||||||
#define fbPutXYImage wfbPutXYImage
|
#define fbPutXYImage wfbPutXYImage
|
||||||
#define fbPutZImage wfbPutZImage
|
#define fbPutZImage wfbPutZImage
|
||||||
#define fbQueryBestSize wfbQueryBestSize
|
#define fbQueryBestSize wfbQueryBestSize
|
||||||
#define fbRasterizeEdges wfbRasterizeEdges
|
|
||||||
#define fbRasterizeTrapezoid wfbRasterizeTrapezoid
|
#define fbRasterizeTrapezoid wfbRasterizeTrapezoid
|
||||||
#define fbRealizeFont wfbRealizeFont
|
#define fbRealizeFont wfbRealizeFont
|
||||||
#define fbReduceRasterOp wfbReduceRasterOp
|
#define fbReduceRasterOp wfbReduceRasterOp
|
||||||
|
@ -179,10 +164,8 @@
|
||||||
#define fbUnmapWindow wfbUnmapWindow
|
#define fbUnmapWindow wfbUnmapWindow
|
||||||
#define fbUnrealizeFont wfbUnrealizeFont
|
#define fbUnrealizeFont wfbUnrealizeFont
|
||||||
#define fbValidateGC wfbValidateGC
|
#define fbValidateGC wfbValidateGC
|
||||||
#define fbWalkCompositeRegion wfbWalkCompositeRegion
|
|
||||||
#define fbWinPrivateKeyRec wfbWinPrivateKeyRec
|
#define fbWinPrivateKeyRec wfbWinPrivateKeyRec
|
||||||
#define fbZeroLine wfbZeroLine
|
#define fbZeroLine wfbZeroLine
|
||||||
#define fbZeroSegment wfbZeroSegment
|
#define fbZeroSegment wfbZeroSegment
|
||||||
#define free_pixman_pict wfb_free_pixman_pict
|
#define free_pixman_pict wfb_free_pixman_pict
|
||||||
#define image_from_pict wfb_image_from_pict
|
#define image_from_pict wfb_image_from_pict
|
||||||
#define composeFunctions wfbComposeFunctions
|
|
||||||
|
|
|
@ -19,7 +19,6 @@ cat > sdksyms.c << EOF
|
||||||
#include "mipict.h"
|
#include "mipict.h"
|
||||||
#include "glyphstr.h"
|
#include "glyphstr.h"
|
||||||
#include "picturestr.h"
|
#include "picturestr.h"
|
||||||
#include "renderedge.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* fb/Makefile.am -- module */
|
/* fb/Makefile.am -- module */
|
||||||
|
|
|
@ -13,9 +13,8 @@ librender_la_SOURCES = \
|
||||||
mitrap.c \
|
mitrap.c \
|
||||||
mitri.c \
|
mitri.c \
|
||||||
picture.c \
|
picture.c \
|
||||||
render.c \
|
render.c
|
||||||
renderedge.c
|
|
||||||
|
|
||||||
if XORG
|
if XORG
|
||||||
sdk_HEADERS = picture.h mipict.h glyphstr.h picturestr.h renderedge.h
|
sdk_HEADERS = picture.h mipict.h glyphstr.h picturestr.h
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -1,91 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2004 Keith Packard
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
|
||||||
* documentation for any purpose is hereby granted without fee, provided that
|
|
||||||
* the above copyright notice appear in all copies and that both that
|
|
||||||
* copyright notice and this permission notice appear in supporting
|
|
||||||
* documentation, and that the name of Keith Packard not be used in
|
|
||||||
* advertising or publicity pertaining to distribution of the software without
|
|
||||||
* specific, written prior permission. Keith Packard makes no
|
|
||||||
* representations about the suitability of this software for any purpose. It
|
|
||||||
* is provided "as is" without express or implied warranty.
|
|
||||||
*
|
|
||||||
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|
||||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
|
||||||
* EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
|
||||||
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
|
||||||
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
|
||||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
||||||
* PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_DIX_CONFIG_H
|
|
||||||
#include <dix-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "renderedge.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compute the smallest value no less than y which is on a
|
|
||||||
* grid row
|
|
||||||
*/
|
|
||||||
|
|
||||||
xFixed
|
|
||||||
RenderSampleCeilY (xFixed y, int n)
|
|
||||||
{
|
|
||||||
return pixman_sample_ceil_y (y, n);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define _div(a,b) ((a) >= 0 ? (a) / (b) : -((-(a) + (b) - 1) / (b)))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compute the largest value no greater than y which is on a
|
|
||||||
* grid row
|
|
||||||
*/
|
|
||||||
xFixed
|
|
||||||
RenderSampleFloorY (xFixed y, int n)
|
|
||||||
{
|
|
||||||
return pixman_sample_floor_y (y, n);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Step an edge by any amount (including negative values)
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
RenderEdgeStep (RenderEdge *e, int n)
|
|
||||||
{
|
|
||||||
pixman_edge_step (e, n);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize one edge structure given the line endpoints and a
|
|
||||||
* starting y value
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
RenderEdgeInit (RenderEdge *e,
|
|
||||||
int n,
|
|
||||||
xFixed y_start,
|
|
||||||
xFixed x_top,
|
|
||||||
xFixed y_top,
|
|
||||||
xFixed x_bot,
|
|
||||||
xFixed y_bot)
|
|
||||||
{
|
|
||||||
pixman_edge_init (e, n, y_start, x_top, y_top, x_bot, y_bot);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize one edge structure given a line, starting y value
|
|
||||||
* and a pixel offset for the line
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
RenderLineFixedEdgeInit (RenderEdge *e,
|
|
||||||
int n,
|
|
||||||
xFixed y,
|
|
||||||
xLineFixed *line,
|
|
||||||
int x_off,
|
|
||||||
int y_off)
|
|
||||||
{
|
|
||||||
pixman_line_fixed_edge_init (e, n, y, (pixman_line_fixed_t *)line, x_off, y_off);
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,105 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2004 Keith Packard
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
|
||||||
* documentation for any purpose is hereby granted without fee, provided that
|
|
||||||
* the above copyright notice appear in all copies and that both that
|
|
||||||
* copyright notice and this permission notice appear in supporting
|
|
||||||
* documentation, and that the name of Keith Packard not be used in
|
|
||||||
* advertising or publicity pertaining to distribution of the software without
|
|
||||||
* specific, written prior permission. Keith Packard makes no
|
|
||||||
* representations about the suitability of this software for any purpose. It
|
|
||||||
* is provided "as is" without express or implied warranty.
|
|
||||||
*
|
|
||||||
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|
||||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
|
||||||
* EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
|
||||||
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
|
||||||
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
|
||||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
||||||
* PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _RENDEREDGE_H_
|
|
||||||
#define _RENDEREDGE_H_
|
|
||||||
|
|
||||||
#include "picturestr.h"
|
|
||||||
|
|
||||||
#define MAX_ALPHA(n) ((1 << (n)) - 1)
|
|
||||||
#define N_Y_FRAC(n) ((n) == 1 ? 1 : (1 << ((n)/2)) - 1)
|
|
||||||
#define N_X_FRAC(n) ((1 << ((n)/2)) + 1)
|
|
||||||
|
|
||||||
#define STEP_Y_SMALL(n) (xFixed1 / N_Y_FRAC(n))
|
|
||||||
#define STEP_Y_BIG(n) (xFixed1 - (N_Y_FRAC(n) - 1) * STEP_Y_SMALL(n))
|
|
||||||
|
|
||||||
#define Y_FRAC_FIRST(n) (STEP_Y_SMALL(n) / 2)
|
|
||||||
#define Y_FRAC_LAST(n) (Y_FRAC_FIRST(n) + (N_Y_FRAC(n) - 1) * STEP_Y_SMALL(n))
|
|
||||||
|
|
||||||
#define STEP_X_SMALL(n) (xFixed1 / N_X_FRAC(n))
|
|
||||||
#define STEP_X_BIG(n) (xFixed1 - (N_X_FRAC(n) - 1) * STEP_X_SMALL(n))
|
|
||||||
|
|
||||||
#define X_FRAC_FIRST(n) (STEP_X_SMALL(n) / 2)
|
|
||||||
#define X_FRAC_LAST(n) (X_FRAC_FIRST(n) + (N_X_FRAC(n) - 1) * STEP_X_SMALL(n))
|
|
||||||
|
|
||||||
#define RenderSamplesX(x,n) ((n) == 1 ? 0 : (xFixedFrac (x) + X_FRAC_FIRST(n)) / STEP_X_SMALL(n))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* An edge structure. This represents a single polygon edge
|
|
||||||
* and can be quickly stepped across small or large gaps in the
|
|
||||||
* sample grid
|
|
||||||
*/
|
|
||||||
typedef pixman_edge_t RenderEdge;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Step across a small sample grid gap
|
|
||||||
*/
|
|
||||||
#define RenderEdgeStepSmall(edge) { \
|
|
||||||
edge->x += edge->stepx_small; \
|
|
||||||
edge->e += edge->dx_small; \
|
|
||||||
if (edge->e > 0) \
|
|
||||||
{ \
|
|
||||||
edge->e -= edge->dy; \
|
|
||||||
edge->x += edge->signdx; \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Step across a large sample grid gap
|
|
||||||
*/
|
|
||||||
#define RenderEdgeStepBig(edge) { \
|
|
||||||
edge->x += edge->stepx_big; \
|
|
||||||
edge->e += edge->dx_big; \
|
|
||||||
if (edge->e > 0) \
|
|
||||||
{ \
|
|
||||||
edge->e -= edge->dy; \
|
|
||||||
edge->x += edge->signdx; \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
extern _X_EXPORT xFixed
|
|
||||||
RenderSampleCeilY (xFixed y, int bpp);
|
|
||||||
|
|
||||||
extern _X_EXPORT xFixed
|
|
||||||
RenderSampleFloorY (xFixed y, int bpp);
|
|
||||||
|
|
||||||
extern _X_EXPORT void
|
|
||||||
RenderEdgeStep (RenderEdge *e, int n);
|
|
||||||
|
|
||||||
extern _X_EXPORT void
|
|
||||||
RenderEdgeInit (RenderEdge *e,
|
|
||||||
int bpp,
|
|
||||||
xFixed y_start,
|
|
||||||
xFixed x_top,
|
|
||||||
xFixed y_top,
|
|
||||||
xFixed x_bot,
|
|
||||||
xFixed y_bot);
|
|
||||||
|
|
||||||
extern _X_EXPORT void
|
|
||||||
RenderLineFixedEdgeInit (RenderEdge *e,
|
|
||||||
int bpp,
|
|
||||||
xFixed y,
|
|
||||||
xLineFixed *line,
|
|
||||||
int x_off,
|
|
||||||
int y_off);
|
|
||||||
|
|
||||||
#endif /* _RENDEREDGE_H_ */
|
|
Loading…
Reference in New Issue
Block a user