xv: Move xf86 XV color key helper to core.

Color key overlay implementations want to reuse this code, and XF86's
had bugs (to be fixed in the next commit).

Signed-off-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
Eric Anholt 2014-04-05 09:07:18 +01:00
parent b01cfe5f23
commit ea3f3b0786
3 changed files with 34 additions and 24 deletions

View File

@ -233,6 +233,8 @@ extern _X_EXPORT int XvScreenInit(ScreenPtr);
extern _X_EXPORT DevPrivateKey XvGetScreenKey(void);
extern _X_EXPORT unsigned long XvGetRTPort(void);
extern _X_EXPORT void XvFreeAdaptor(XvAdaptorPtr pAdaptor);
extern void _X_EXPORT XvFillColorKey(DrawablePtr pDraw, CARD32 key,
RegionPtr region);
extern _X_EXPORT int XvdiSendPortNotify(XvPortPtr, Atom, INT32);
extern _X_EXPORT int XvdiPutVideo(ClientPtr, DrawablePtr, XvPortPtr, GCPtr,

View File

@ -1082,3 +1082,34 @@ XvFreeAdaptor(XvAdaptorPtr pAdaptor)
free(pAdaptor->devPriv.ptr);
pAdaptor->devPriv.ptr = NULL;
}
void
XvFillColorKey(DrawablePtr pDraw, CARD32 key, RegionPtr region)
{
ScreenPtr pScreen = pDraw->pScreen;
ChangeGCVal pval[2];
BoxPtr pbox = RegionRects(region);
int i, nbox = RegionNumRects(region);
xRectangle *rects;
GCPtr gc;
gc = GetScratchGC(pDraw->depth, pScreen);
pval[0].val = key;
pval[1].val = IncludeInferiors;
(void) ChangeGC(NullClient, gc, GCForeground | GCSubwindowMode, pval);
ValidateGC(pDraw, gc);
rects = malloc(nbox * sizeof(xRectangle));
for (i = 0; i < nbox; i++, pbox++) {
rects[i].x = pbox->x1 - pDraw->x;
rects[i].y = pbox->y1 - pDraw->y;
rects[i].width = pbox->x2 - pbox->x1;
rects[i].height = pbox->y2 - pbox->y1;
}
(*gc->ops->PolyFillRect) (pDraw, gc, nbox, rects);
free(rects);
FreeScratchGC(gc);
}

View File

@ -1736,34 +1736,11 @@ void
xf86XVFillKeyHelperDrawable(DrawablePtr pDraw, CARD32 key, RegionPtr fillboxes)
{
ScreenPtr pScreen = pDraw->pScreen;
ChangeGCVal pval[2];
BoxPtr pbox = RegionRects(fillboxes);
int i, nbox = RegionNumRects(fillboxes);
xRectangle *rects;
GCPtr gc;
if (!xf86ScreenToScrn(pScreen)->vtSema)
return;
gc = GetScratchGC(pDraw->depth, pScreen);
pval[0].val = key;
pval[1].val = IncludeInferiors;
(void) ChangeGC(NullClient, gc, GCForeground | GCSubwindowMode, pval);
ValidateGC(pDraw, gc);
rects = malloc(nbox * sizeof(xRectangle));
for (i = 0; i < nbox; i++, pbox++) {
rects[i].x = pbox->x1 - pDraw->x;
rects[i].y = pbox->y1 - pDraw->y;
rects[i].width = pbox->x2 - pbox->x1;
rects[i].height = pbox->y2 - pbox->y1;
}
(*gc->ops->PolyFillRect) (pDraw, gc, nbox, rects);
free(rects);
FreeScratchGC(gc);
XvFillColorKey(pDraw, key, fillboxes);
}
void