Commit a4f336fa authored by Sam Lantinga's avatar Sam Lantinga

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
parent fccd61bc
...@@ -357,20 +357,59 @@ void X11_UnlockYUVOverlay(_THIS, SDL_Overlay *overlay) ...@@ -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) ...@@ -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)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment