Fixed bug #189
Clip the overlay destination rectangle to the screen area on X11 --HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%401649
This commit is contained in:
parent
fccd61bcf4
commit
a4f336faee
2 changed files with 47 additions and 4 deletions
|
@ -357,20 +357,59 @@ void X11_UnlockYUVOverlay(_THIS, SDL_Overlay *overlay)
|
||||||
int X11_DisplayYUVOverlay(_THIS, SDL_Overlay *overlay, SDL_Rect *dstrect)
|
int X11_DisplayYUVOverlay(_THIS, SDL_Overlay *overlay, SDL_Rect *dstrect)
|
||||||
{
|
{
|
||||||
struct private_yuvhwdata *hwdata;
|
struct private_yuvhwdata *hwdata;
|
||||||
|
int srcx, srcy, srcw, srch;
|
||||||
|
int dstx, dsty, dstw, dsth;
|
||||||
|
|
||||||
hwdata = overlay->hwdata;
|
hwdata = overlay->hwdata;
|
||||||
|
|
||||||
|
/* Clip the rectangle to the screen area */
|
||||||
|
srcx = 0;
|
||||||
|
srcy = 0;
|
||||||
|
srcw = overlay->w;
|
||||||
|
srch = overlay->h;
|
||||||
|
dstx = dstrect->x;
|
||||||
|
dsty = dstrect->y;
|
||||||
|
dstw = dstrect->w;
|
||||||
|
dsth = dstrect->h;
|
||||||
|
if ( dstx < 0 ) {
|
||||||
|
srcw += (dstx * overlay->w) / dstrect->w;
|
||||||
|
dstw += dstx;
|
||||||
|
srcx -= (dstx * overlay->w) / dstrect->w;
|
||||||
|
dstx = 0;
|
||||||
|
}
|
||||||
|
if ( (dstx+dstw) > this->screen->w ) {
|
||||||
|
int extra = (dstx+dstw - this->screen->w);
|
||||||
|
srcw -= (extra * overlay->w) / dstrect->w;
|
||||||
|
dstw -= extra;
|
||||||
|
}
|
||||||
|
if ( dsty < 0 ) {
|
||||||
|
srch += (dsty * overlay->h) / dstrect->h;
|
||||||
|
dsth += dsty;
|
||||||
|
srcy -= (dsty * overlay->h) / dstrect->h;
|
||||||
|
dsty = 0;
|
||||||
|
}
|
||||||
|
if ( (dsty+dsth) > this->screen->h ) {
|
||||||
|
int extra = (dsty+dsth - this->screen->h);
|
||||||
|
srch -= (extra * overlay->h) / dstrect->h;
|
||||||
|
dsth -= extra;
|
||||||
|
}
|
||||||
|
if ( srcw <= 0 || srch <= 0 ||
|
||||||
|
srch <= 0 || dsth <= 0 ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef NO_SHARED_MEMORY
|
#ifndef NO_SHARED_MEMORY
|
||||||
if ( hwdata->yuv_use_mitshm ) {
|
if ( hwdata->yuv_use_mitshm ) {
|
||||||
SDL_NAME(XvShmPutImage)(GFX_Display, hwdata->port, SDL_Window, SDL_GC,
|
SDL_NAME(XvShmPutImage)(GFX_Display, hwdata->port, SDL_Window, SDL_GC,
|
||||||
hwdata->image, 0, 0, overlay->w, overlay->h,
|
hwdata->image,
|
||||||
dstrect->x, dstrect->y, dstrect->w, dstrect->h, False);
|
srcx, srcy, srcw, srch, dstx, dsty, dstw, dsth, False);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
SDL_NAME(XvPutImage)(GFX_Display, hwdata->port, SDL_Window, SDL_GC,
|
SDL_NAME(XvPutImage)(GFX_Display, hwdata->port, SDL_Window, SDL_GC,
|
||||||
hwdata->image, 0, 0, overlay->w, overlay->h,
|
hwdata->image,
|
||||||
dstrect->x, dstrect->y, dstrect->w, dstrect->h);
|
srcx, srcy, srcw, srch, dstx, dsty, dstw, dsth);
|
||||||
}
|
}
|
||||||
XSync(GFX_Display, False);
|
XSync(GFX_Display, False);
|
||||||
return(0);
|
return(0);
|
||||||
|
|
|
@ -526,6 +526,10 @@ int main(int argc, char **argv)
|
||||||
resized=1;
|
resized=1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case SDL_MOUSEBUTTONDOWN:
|
||||||
|
overlayrect.x = event.button.x - overlayrect.w/2;
|
||||||
|
overlayrect.y = event.button.y - overlayrect.h/2;
|
||||||
|
break;
|
||||||
case SDL_KEYDOWN:
|
case SDL_KEYDOWN:
|
||||||
if (event.key.keysym.sym == SDLK_SPACE)
|
if (event.key.keysym.sym == SDLK_SPACE)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue