Delete XineramaScreenRegions cache.
Every screen region consists of a single rectangle, so initializing a stack-allocated region for each screen on-demand does no heap allocation and is fast. This eliminates a MAXSCREENS-sized array. The REGION_UNINIT calls are no-ops since no boxes are actually allocated for a single-rectangle region, but it seemed wiser to include them. Signed-off-by: Jamey Sharp <jamey@minilop.net> Reviewed-by: Tiago Vignatti <tiago.vignatti@nokia.com> Tested-by: Tiago Vignatti <tiago.vignatti@nokia.com> (i686 GNU/Linux)
This commit is contained in:
parent
a0456da339
commit
a7c7ebe4b3
|
@ -119,8 +119,6 @@ typedef struct {
|
||||||
CloseScreenProcPtr CloseScreen;
|
CloseScreenProcPtr CloseScreen;
|
||||||
} PanoramiXScreenRec, *PanoramiXScreenPtr;
|
} PanoramiXScreenRec, *PanoramiXScreenPtr;
|
||||||
|
|
||||||
static RegionRec XineramaScreenRegions[MAXSCREENS];
|
|
||||||
|
|
||||||
static void XineramaValidateGC(GCPtr, unsigned long, DrawablePtr);
|
static void XineramaValidateGC(GCPtr, unsigned long, DrawablePtr);
|
||||||
static void XineramaChangeGC(GCPtr, unsigned long);
|
static void XineramaChangeGC(GCPtr, unsigned long);
|
||||||
static void XineramaCopyGC(GCPtr, unsigned long, GCPtr);
|
static void XineramaCopyGC(GCPtr, unsigned long, GCPtr);
|
||||||
|
@ -153,7 +151,6 @@ XineramaCloseScreen (int i, ScreenPtr pScreen)
|
||||||
pScreen->CloseScreen = pScreenPriv->CloseScreen;
|
pScreen->CloseScreen = pScreenPriv->CloseScreen;
|
||||||
pScreen->CreateGC = pScreenPriv->CreateGC;
|
pScreen->CreateGC = pScreenPriv->CreateGC;
|
||||||
|
|
||||||
REGION_UNINIT(pScreen, &XineramaScreenRegions[pScreen->myNum]);
|
|
||||||
if (pScreen->myNum == 0)
|
if (pScreen->myNum == 0)
|
||||||
REGION_UNINIT(pScreen, &PanoramiXScreenRegion);
|
REGION_UNINIT(pScreen, &PanoramiXScreenRegion);
|
||||||
|
|
||||||
|
@ -392,6 +389,7 @@ static void XineramaInitData(ScreenPtr pScreen)
|
||||||
REGION_NULL(pScreen, &PanoramiXScreenRegion)
|
REGION_NULL(pScreen, &PanoramiXScreenRegion)
|
||||||
for (i = 0; i < PanoramiXNumScreens; i++) {
|
for (i = 0; i < PanoramiXNumScreens; i++) {
|
||||||
BoxRec TheBox;
|
BoxRec TheBox;
|
||||||
|
RegionRec ScreenRegion;
|
||||||
|
|
||||||
pScreen = screenInfo.screens[i];
|
pScreen = screenInfo.screens[i];
|
||||||
|
|
||||||
|
@ -400,9 +398,10 @@ static void XineramaInitData(ScreenPtr pScreen)
|
||||||
TheBox.y1 = pScreen->y;
|
TheBox.y1 = pScreen->y;
|
||||||
TheBox.y2 = TheBox.y1 + pScreen->height;
|
TheBox.y2 = TheBox.y1 + pScreen->height;
|
||||||
|
|
||||||
REGION_INIT(pScreen, &XineramaScreenRegions[i], &TheBox, 1);
|
REGION_INIT(pScreen, &ScreenRegion, &TheBox, 1);
|
||||||
REGION_UNION(pScreen, &PanoramiXScreenRegion, &PanoramiXScreenRegion,
|
REGION_UNION(pScreen, &PanoramiXScreenRegion, &PanoramiXScreenRegion,
|
||||||
&XineramaScreenRegions[i]);
|
&ScreenRegion);
|
||||||
|
REGION_UNINIT(pScreen, &ScreenRegion);
|
||||||
}
|
}
|
||||||
|
|
||||||
PanoramiXPixWidth = screenInfo.screens[0]->x + screenInfo.screens[0]->width;
|
PanoramiXPixWidth = screenInfo.screens[0]->x + screenInfo.screens[0]->width;
|
||||||
|
@ -422,12 +421,7 @@ static void XineramaInitData(ScreenPtr pScreen)
|
||||||
|
|
||||||
void XineramaReinitData(ScreenPtr pScreen)
|
void XineramaReinitData(ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
|
|
||||||
REGION_UNINIT(pScreen, &PanoramiXScreenRegion);
|
REGION_UNINIT(pScreen, &PanoramiXScreenRegion);
|
||||||
for (i = 0; i < PanoramiXNumScreens; i++)
|
|
||||||
REGION_UNINIT(pScreen, &XineramaScreenRegions[i]);
|
|
||||||
|
|
||||||
XineramaInitData(pScreen);
|
XineramaInitData(pScreen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1141,7 +1135,7 @@ XineramaGetImageData(
|
||||||
int pitch,
|
int pitch,
|
||||||
Bool isRoot
|
Bool isRoot
|
||||||
){
|
){
|
||||||
RegionRec SrcRegion, GrabRegion;
|
RegionRec SrcRegion, ScreenRegion, GrabRegion;
|
||||||
BoxRec SrcBox, *pbox;
|
BoxRec SrcBox, *pbox;
|
||||||
int x, y, w, h, i, j, nbox, size, sizeNeeded, ScratchPitch, inOut, depth;
|
int x, y, w, h, i, j, nbox, size, sizeNeeded, ScratchPitch, inOut, depth;
|
||||||
DrawablePtr pDraw = pDrawables[0];
|
DrawablePtr pDraw = pDrawables[0];
|
||||||
|
@ -1165,12 +1159,24 @@ XineramaGetImageData(
|
||||||
depth = (format == XYPixmap) ? 1 : pDraw->depth;
|
depth = (format == XYPixmap) ? 1 : pDraw->depth;
|
||||||
|
|
||||||
for(i = 0; i < PanoramiXNumScreens; i++) {
|
for(i = 0; i < PanoramiXNumScreens; i++) {
|
||||||
|
BoxRec TheBox;
|
||||||
|
ScreenPtr pScreen;
|
||||||
pDraw = pDrawables[i];
|
pDraw = pDrawables[i];
|
||||||
|
pScreen = pDraw->pScreen;
|
||||||
|
|
||||||
inOut = RECT_IN_REGION(pScreen,&XineramaScreenRegions[i],&SrcBox);
|
TheBox.x1 = pScreen->x;
|
||||||
|
TheBox.x2 = TheBox.x1 + pScreen->width;
|
||||||
|
TheBox.y1 = pScreen->y;
|
||||||
|
TheBox.y2 = TheBox.y1 + pScreen->height;
|
||||||
|
|
||||||
|
REGION_INIT(pScreen, &ScreenRegion, &TheBox, 1);
|
||||||
|
inOut = RECT_IN_REGION(pScreen, &ScreenRegion, &SrcBox);
|
||||||
|
if(inOut == rgnPART)
|
||||||
|
REGION_INTERSECT(pScreen, &GrabRegion, &SrcRegion, &ScreenRegion);
|
||||||
|
REGION_UNINIT(pScreen, &ScreenRegion);
|
||||||
|
|
||||||
if(inOut == rgnIN) {
|
if(inOut == rgnIN) {
|
||||||
(*pDraw->pScreen->GetImage)(pDraw,
|
(*pScreen->GetImage)(pDraw,
|
||||||
SrcBox.x1 - pDraw->x - screenInfo.screens[i]->x,
|
SrcBox.x1 - pDraw->x - screenInfo.screens[i]->x,
|
||||||
SrcBox.y1 - pDraw->y - screenInfo.screens[i]->y,
|
SrcBox.y1 - pDraw->y - screenInfo.screens[i]->y,
|
||||||
width, height, format, planemask, data);
|
width, height, format, planemask, data);
|
||||||
|
@ -1178,9 +1184,6 @@ XineramaGetImageData(
|
||||||
} else if (inOut == rgnOUT)
|
} else if (inOut == rgnOUT)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
REGION_INTERSECT(pScreen, &GrabRegion, &SrcRegion,
|
|
||||||
&XineramaScreenRegions[i]);
|
|
||||||
|
|
||||||
nbox = REGION_NUM_RECTS(&GrabRegion);
|
nbox = REGION_NUM_RECTS(&GrabRegion);
|
||||||
|
|
||||||
if(nbox) {
|
if(nbox) {
|
||||||
|
@ -1206,7 +1209,7 @@ XineramaGetImageData(
|
||||||
x = pbox->x1 - pDraw->x - screenInfo.screens[i]->x;
|
x = pbox->x1 - pDraw->x - screenInfo.screens[i]->x;
|
||||||
y = pbox->y1 - pDraw->y - screenInfo.screens[i]->y;
|
y = pbox->y1 - pDraw->y - screenInfo.screens[i]->y;
|
||||||
|
|
||||||
(*pDraw->pScreen->GetImage)(pDraw, x, y, w, h,
|
(*pScreen->GetImage)(pDraw, x, y, w, h,
|
||||||
format, planemask, ScratchMem);
|
format, planemask, ScratchMem);
|
||||||
|
|
||||||
/* copy the memory over */
|
/* copy the memory over */
|
||||||
|
|
|
@ -1507,8 +1507,7 @@ PanoramiX prefix.
|
||||||
Xinerama windows, pixmaps and colormaps.
|
Xinerama windows, pixmaps and colormaps.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>A region (XineramaScreenRegions[i]) is initialized for each
|
<para>A region (PanoramiXScreenRegion) is
|
||||||
physical screen, and single region (PanoramiXScreenRegion) is
|
|
||||||
initialized to be the union of the screen regions.
|
initialized to be the union of the screen regions.
|
||||||
The relative positioning information for the
|
The relative positioning information for the
|
||||||
physical screens is taken from the ScreenRec x and y members, which
|
physical screens is taken from the ScreenRec x and y members, which
|
||||||
|
|
Loading…
Reference in New Issue