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:
		
							parent
							
								
									b01cfe5f23
								
							
						
					
					
						commit
						ea3f3b0786
					
				|  | @ -233,6 +233,8 @@ extern _X_EXPORT int XvScreenInit(ScreenPtr); | ||||||
| extern _X_EXPORT DevPrivateKey XvGetScreenKey(void); | extern _X_EXPORT DevPrivateKey XvGetScreenKey(void); | ||||||
| extern _X_EXPORT unsigned long XvGetRTPort(void); | extern _X_EXPORT unsigned long XvGetRTPort(void); | ||||||
| extern _X_EXPORT void XvFreeAdaptor(XvAdaptorPtr pAdaptor); | 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 XvdiSendPortNotify(XvPortPtr, Atom, INT32); | ||||||
| 
 | 
 | ||||||
| extern _X_EXPORT int XvdiPutVideo(ClientPtr, DrawablePtr, XvPortPtr, GCPtr, | extern _X_EXPORT int XvdiPutVideo(ClientPtr, DrawablePtr, XvPortPtr, GCPtr, | ||||||
|  |  | ||||||
|  | @ -1082,3 +1082,34 @@ XvFreeAdaptor(XvAdaptorPtr pAdaptor) | ||||||
|     free(pAdaptor->devPriv.ptr); |     free(pAdaptor->devPriv.ptr); | ||||||
|     pAdaptor->devPriv.ptr = NULL; |     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); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -1736,34 +1736,11 @@ void | ||||||
| xf86XVFillKeyHelperDrawable(DrawablePtr pDraw, CARD32 key, RegionPtr fillboxes) | xf86XVFillKeyHelperDrawable(DrawablePtr pDraw, CARD32 key, RegionPtr fillboxes) | ||||||
| { | { | ||||||
|     ScreenPtr pScreen = pDraw->pScreen; |     ScreenPtr pScreen = pDraw->pScreen; | ||||||
|     ChangeGCVal pval[2]; |  | ||||||
|     BoxPtr pbox = RegionRects(fillboxes); |  | ||||||
|     int i, nbox = RegionNumRects(fillboxes); |  | ||||||
|     xRectangle *rects; |  | ||||||
|     GCPtr gc; |  | ||||||
| 
 | 
 | ||||||
|     if (!xf86ScreenToScrn(pScreen)->vtSema) |     if (!xf86ScreenToScrn(pScreen)->vtSema) | ||||||
|         return; |         return; | ||||||
| 
 | 
 | ||||||
|     gc = GetScratchGC(pDraw->depth, pScreen); |     XvFillColorKey(pDraw, key, fillboxes); | ||||||
|     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); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue