diff src/SDL_compat.c @ 1675:d33dcfc3fde7 SDL-1.3

Overlay functions are being replaced by YUV textures. If the driver doesn't support YUV textures, they can be emulated by backing the texture with an RGB texture and using the software conversion routines. Note that it doesn't make sense to lock a portion of a YV12 texture, since you'd need to return three pixel pointers and pitch values instead of the one that's available through the API. I'm guessing that's one of the reasons DirectX 9 doesn't support this format at all.
author Sam Lantinga <slouken@libsdl.org>
date Sun, 11 Jun 2006 07:30:16 +0000
parents eef792d31de8
children 90bf530ced8e
line wrap: on
line diff
--- a/src/SDL_compat.c	Sun Jun 11 05:27:10 2006 +0000
+++ b/src/SDL_compat.c	Sun Jun 11 07:30:16 2006 +0000
@@ -1235,4 +1235,119 @@
     }
 }
 
+SDL_Overlay *
+SDL_CreateYUVOverlay(int w, int h, Uint32 format, SDL_Surface * display)
+{
+    SDL_VideoDevice *_this = SDL_GetVideoDevice();
+    SDL_Window *window;
+    const char *yuv_hwaccel;
+    SDL_Overlay *overlay;
+
+    window = SDL_GetWindowFromSurface(display);
+    if (window && (window->flags & SDL_WINDOW_OPENGL)) {
+        SDL_SetError("YUV overlays are not supported in OpenGL mode");
+        return NULL;
+    }
+
+    /* Display directly on video surface, if possible */
+    if (SDL_getenv("SDL_VIDEO_YUV_DIRECT")) {
+        if (window &&
+            ((window->surface->format->BytesPerPixel == 2) ||
+             (window->surface->format->BytesPerPixel == 4))) {
+            display = window->surface;
+        }
+    }
+    overlay = NULL;
+    yuv_hwaccel = SDL_getenv("SDL_VIDEO_YUV_HWACCEL");
+    if (((display->flags & SDL_SCREEN_SURFACE) && _this->CreateYUVOverlay) &&
+        (!yuv_hwaccel || (SDL_atoi(yuv_hwaccel) > 0))) {
+        overlay = _this->CreateYUVOverlay(_this, w, h, format, display);
+    }
+    /* If hardware YUV overlay failed ... */
+    if (overlay == NULL) {
+        overlay = SDL_CreateYUV_SW(_this, w, h, format, display);
+    }
+    return overlay;
+}
+
+int
+SDL_LockYUVOverlay(SDL_Overlay * overlay)
+{
+    SDL_VideoDevice *_this = SDL_GetVideoDevice();
+    return overlay->hwfuncs->Lock(_this, overlay);
+}
+
+void
+SDL_UnlockYUVOverlay(SDL_Overlay * overlay)
+{
+    SDL_VideoDevice *_this = SDL_GetVideoDevice();
+    overlay->hwfuncs->Unlock(_this, overlay);
+}
+
+int
+SDL_DisplayYUVOverlay(SDL_Overlay * overlay, SDL_Rect * dstrect)
+{
+    SDL_VideoDevice *_this = SDL_GetVideoDevice();
+    SDL_Rect src, dst;
+    int srcx, srcy, srcw, srch;
+    int dstx, dsty, dstw, dsth;
+
+    /* 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) > SDL_VideoSurface->w) {
+        int extra = (dstx + dstw - SDL_VideoSurface->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) > SDL_VideoSurface->h) {
+        int extra = (dsty + dsth - SDL_VideoSurface->h);
+        srch -= (extra * overlay->h) / dstrect->h;
+        dsth -= extra;
+    }
+    if (srcw <= 0 || srch <= 0 || srch <= 0 || dsth <= 0) {
+        return 0;
+    }
+    /* Ugh, I can't wait for SDL_Rect to be int values */
+    src.x = srcx;
+    src.y = srcy;
+    src.w = srcw;
+    src.h = srch;
+    dst.x = dstx;
+    dst.y = dsty;
+    dst.w = dstw;
+    dst.h = dsth;
+    return overlay->hwfuncs->Display(_this, overlay, &src, &dst);
+}
+
+void
+SDL_FreeYUVOverlay(SDL_Overlay * overlay)
+{
+    SDL_VideoDevice *_this = SDL_GetVideoDevice();
+    if (overlay) {
+        if (overlay->hwfuncs) {
+            overlay->hwfuncs->FreeHW(_this, overlay);
+        }
+        SDL_free(overlay);
+    }
+}
+
 /* vi: set ts=4 sw=4 expandtab: */