--- a/src/SDL_compat.c Mon Nov 24 21:43:02 2008 +0000
+++ b/src/SDL_compat.c Mon Nov 24 23:25:36 2008 +0000
@@ -28,6 +28,7 @@
#include "video/SDL_sysvideo.h"
#include "video/SDL_pixels_c.h"
+#include "video/SDL_yuv_sw_c.h"
static SDL_WindowID SDL_VideoWindow = 0;
static SDL_RendererInfo SDL_VideoRendererInfo;
@@ -1349,6 +1350,8 @@
Uint16 pitches[3];
Uint8 *planes[3];
+ SDL_SW_YUVTexture *sw;
+
SDL_TextureID textureID;
};
@@ -1431,7 +1434,20 @@
overlay->hwdata->textureID =
SDL_CreateTexture(texture_format, SDL_TEXTUREACCESS_STREAMING, w, h);
- if (!overlay->hwdata->textureID) {
+ if (overlay->hwdata->textureID) {
+ overlay->hwdata->sw = NULL;
+ } else {
+ overlay->hwdata->sw = SDL_SW_CreateYUVTexture(texture_format, w, h);
+ if (!overlay->hwdata->sw) {
+ SDL_FreeYUVOverlay(overlay);
+ return NULL;
+ }
+
+ /* Create a supported RGB format texture for display */
+ overlay->hwdata->textureID =
+ SDL_CreateTexture(SDL_PIXELFORMAT_RGB888, SDL_TEXTUREACCESS_STREAMING, w, h);
+ }
+ if (!overlay->hwdata->textureID) {
SDL_FreeYUVOverlay(overlay);
return NULL;
}
@@ -1449,10 +1465,16 @@
SDL_SetError("Passed a NULL overlay");
return -1;
}
- if (SDL_LockTexture(overlay->hwdata->textureID, NULL, 1, &pixels, &pitch)
- < 0) {
- return -1;
- }
+ if (overlay->hwdata->sw) {
+ if (SDL_SW_QueryYUVTexturePixels(overlay->hwdata->sw, &pixels, &pitch) < 0) {
+ return -1;
+ }
+ } else {
+ if (SDL_LockTexture(overlay->hwdata->textureID, NULL, 1, &pixels, &pitch)
+ < 0) {
+ return -1;
+ }
+ }
overlay->pixels[0] = (Uint8 *) pixels;
overlay->pitches[0] = pitch;
switch (overlay->format) {
@@ -1479,7 +1501,22 @@
if (!overlay) {
return;
}
- SDL_UnlockTexture(overlay->hwdata->textureID);
+ if (overlay->hwdata->sw) {
+ void *pixels;
+ int pitch;
+ if (SDL_LockTexture(overlay->hwdata->textureID, NULL, 1, &pixels, &pitch) == 0) {
+ SDL_Rect srcrect;
+
+ srcrect.x = 0;
+ srcrect.y = 0;
+ srcrect.w = overlay->w;
+ srcrect.h = overlay->h;
+ SDL_SW_CopyYUVToRGB(overlay->hwdata->sw, &srcrect, SDL_PIXELFORMAT_RGB888, overlay->w, overlay->h, pixels, pitch);
+ SDL_UnlockTexture(overlay->hwdata->textureID);
+ }
+ } else {
+ SDL_UnlockTexture(overlay->hwdata->textureID);
+ }
}
int