181 lines
4.0 KiB
C
181 lines
4.0 KiB
C
|
|
||
|
#ifdef HAVE_XORG_CONFIG_H
|
||
|
#include <xorg-config.h>
|
||
|
#endif
|
||
|
|
||
|
#include <X11/X.h>
|
||
|
|
||
|
#include "windowstr.h"
|
||
|
#include "regionstr.h"
|
||
|
#include "pixmapstr.h"
|
||
|
#include "scrnintstr.h"
|
||
|
|
||
|
#define PSZ 8
|
||
|
#include "cfb.h"
|
||
|
#undef PSZ
|
||
|
#include "cfb32.h"
|
||
|
#include "cfb8_32.h"
|
||
|
#include "mi.h"
|
||
|
|
||
|
#ifdef PANORAMIX
|
||
|
#include "panoramiX.h"
|
||
|
#include "panoramiXsrv.h"
|
||
|
#endif
|
||
|
|
||
|
void
|
||
|
cfb8_32PaintWindow(
|
||
|
WindowPtr pWin,
|
||
|
RegionPtr pRegion,
|
||
|
int what
|
||
|
){
|
||
|
WindowPtr pBgWin;
|
||
|
int xorg, yorg;
|
||
|
|
||
|
switch (what) {
|
||
|
case PW_BACKGROUND:
|
||
|
switch (pWin->backgroundState) {
|
||
|
case None:
|
||
|
break;
|
||
|
case ParentRelative:
|
||
|
do {
|
||
|
pWin = pWin->parent;
|
||
|
} while (pWin->backgroundState == ParentRelative);
|
||
|
(*pWin->drawable.pScreen->PaintWindowBackground)(
|
||
|
pWin, pRegion, what);
|
||
|
break;
|
||
|
case BackgroundPixmap:
|
||
|
xorg = pWin->drawable.x;
|
||
|
yorg = pWin->drawable.y;
|
||
|
#ifdef PANORAMIX
|
||
|
if(!noPanoramiXExtension) {
|
||
|
int index = pWin->drawable.pScreen->myNum;
|
||
|
if(WindowTable[index] == pWin) {
|
||
|
xorg -= panoramiXdataPtr[index].x;
|
||
|
yorg -= panoramiXdataPtr[index].y;
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
cfb32FillBoxTileOddGeneral ((DrawablePtr)pWin,
|
||
|
(int)REGION_NUM_RECTS(pRegion), REGION_RECTS(pRegion),
|
||
|
pWin->background.pixmap, xorg, yorg, GXcopy,
|
||
|
(pWin->drawable.depth == 24) ? 0x00ffffff : 0xff000000);
|
||
|
break;
|
||
|
case BackgroundPixel:
|
||
|
if(pWin->drawable.depth == 24)
|
||
|
cfb8_32FillBoxSolid32 ((DrawablePtr)pWin,
|
||
|
(int)REGION_NUM_RECTS(pRegion),
|
||
|
REGION_RECTS(pRegion),
|
||
|
pWin->background.pixel);
|
||
|
else
|
||
|
cfb8_32FillBoxSolid8 ((DrawablePtr)pWin,
|
||
|
(int)REGION_NUM_RECTS(pRegion),
|
||
|
REGION_RECTS(pRegion),
|
||
|
pWin->background.pixel);
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case PW_BORDER:
|
||
|
if (pWin->borderIsPixel) {
|
||
|
if(pWin->drawable.depth == 24) {
|
||
|
cfb8_32FillBoxSolid32 ((DrawablePtr)pWin,
|
||
|
(int)REGION_NUM_RECTS(pRegion),
|
||
|
REGION_RECTS(pRegion),
|
||
|
pWin->border.pixel);
|
||
|
} else
|
||
|
cfb8_32FillBoxSolid8 ((DrawablePtr)pWin,
|
||
|
(int)REGION_NUM_RECTS(pRegion),
|
||
|
REGION_RECTS(pRegion),
|
||
|
pWin->border.pixel);
|
||
|
} else {
|
||
|
for (pBgWin = pWin;
|
||
|
pBgWin->backgroundState == ParentRelative;
|
||
|
pBgWin = pBgWin->parent);
|
||
|
|
||
|
xorg = pBgWin->drawable.x;
|
||
|
yorg = pBgWin->drawable.y;
|
||
|
|
||
|
#ifdef PANORAMIX
|
||
|
if(!noPanoramiXExtension) {
|
||
|
int index = pWin->drawable.pScreen->myNum;
|
||
|
if(WindowTable[index] == pBgWin) {
|
||
|
xorg -= panoramiXdataPtr[index].x;
|
||
|
yorg -= panoramiXdataPtr[index].y;
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
cfb32FillBoxTileOddGeneral ((DrawablePtr)pWin,
|
||
|
(int)REGION_NUM_RECTS(pRegion), REGION_RECTS(pRegion),
|
||
|
pWin->border.pixmap, xorg, yorg, GXcopy,
|
||
|
(pWin->drawable.depth == 24) ? 0x00ffffff : 0xff000000);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
void
|
||
|
cfb8_32FillBoxSolid8(
|
||
|
DrawablePtr pDraw,
|
||
|
int nbox,
|
||
|
BoxPtr pbox,
|
||
|
unsigned long color
|
||
|
){
|
||
|
CARD8 *ptr, *data;
|
||
|
int pitch, height, width, i;
|
||
|
CARD8 c = (CARD8)color;
|
||
|
|
||
|
cfbGetByteWidthAndPointer(pDraw, pitch, ptr);
|
||
|
ptr += 3; /* point to the top byte */
|
||
|
|
||
|
while(nbox--) {
|
||
|
data = ptr + (pbox->y1 * pitch) + (pbox->x1 << 2);
|
||
|
width = (pbox->x2 - pbox->x1) << 2;
|
||
|
height = pbox->y2 - pbox->y1;
|
||
|
|
||
|
while(height--) {
|
||
|
for(i = 0; i < width; i+=4)
|
||
|
data[i] = c;
|
||
|
data += pitch;
|
||
|
}
|
||
|
pbox++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void
|
||
|
cfb8_32FillBoxSolid32(
|
||
|
DrawablePtr pDraw,
|
||
|
int nbox,
|
||
|
BoxPtr pbox,
|
||
|
unsigned long color
|
||
|
){
|
||
|
CARD8 *ptr, *data;
|
||
|
CARD16 *ptr2, *data2;
|
||
|
int pitch, pitch2;
|
||
|
int height, width, i;
|
||
|
CARD8 c = (CARD8)(color >> 16);
|
||
|
CARD16 c2 = (CARD16)color;
|
||
|
|
||
|
cfbGetByteWidthAndPointer(pDraw, pitch, ptr);
|
||
|
cfbGetTypedWidthAndPointer(pDraw, pitch2, ptr2, CARD16, CARD16);
|
||
|
ptr += 2; /* point to the third byte */
|
||
|
|
||
|
while(nbox--) {
|
||
|
data = ptr + (pbox->y1 * pitch) + (pbox->x1 << 2);
|
||
|
data2 = ptr2 + (pbox->y1 * pitch2) + (pbox->x1 << 1);
|
||
|
width = (pbox->x2 - pbox->x1) << 1;
|
||
|
height = pbox->y2 - pbox->y1;
|
||
|
|
||
|
while(height--) {
|
||
|
for(i = 0; i < width; i+=2) {
|
||
|
data[i << 1] = c;
|
||
|
data2[i] = c2;
|
||
|
}
|
||
|
data += pitch;
|
||
|
data2 += pitch2;
|
||
|
}
|
||
|
pbox++;
|
||
|
}
|
||
|
}
|
||
|
|