Mercurial > sdl-ios-xcode
diff src/video/windx5/SDL_dx5yuv.c @ 1895:c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 10 Jul 2006 21:04:37 +0000 |
parents | 51038e80ae59 |
children |
line wrap: on
line diff
--- a/src/video/windx5/SDL_dx5yuv.c Thu Jul 06 18:01:37 2006 +0000 +++ b/src/video/windx5/SDL_dx5yuv.c Mon Jul 10 21:04:37 2006 +0000 @@ -31,265 +31,279 @@ /* The functions used to manipulate software video overlays */ static struct private_yuvhwfuncs dx5_yuvfuncs = { - DX5_LockYUVOverlay, - DX5_UnlockYUVOverlay, - DX5_DisplayYUVOverlay, - DX5_FreeYUVOverlay + DX5_LockYUVOverlay, + DX5_UnlockYUVOverlay, + DX5_DisplayYUVOverlay, + DX5_FreeYUVOverlay }; -struct private_yuvhwdata { - LPDIRECTDRAWSURFACE3 surface; +struct private_yuvhwdata +{ + LPDIRECTDRAWSURFACE3 surface; - /* These are just so we don't have to allocate them separately */ - Uint16 pitches[3]; - Uint8 *planes[3]; + /* These are just so we don't have to allocate them separately */ + Uint16 pitches[3]; + Uint8 *planes[3]; }; -static LPDIRECTDRAWSURFACE3 CreateYUVSurface(_THIS, - int width, int height, Uint32 format) +static LPDIRECTDRAWSURFACE3 +CreateYUVSurface(_THIS, int width, int height, Uint32 format) { - HRESULT result; - LPDIRECTDRAWSURFACE dd_surface1; - LPDIRECTDRAWSURFACE3 dd_surface3; - DDSURFACEDESC ddsd; + HRESULT result; + LPDIRECTDRAWSURFACE dd_surface1; + LPDIRECTDRAWSURFACE3 dd_surface3; + DDSURFACEDESC ddsd; - /* Set up the surface description */ - SDL_memset(&ddsd, 0, sizeof(ddsd)); - ddsd.dwSize = sizeof(ddsd); - ddsd.dwFlags = (DDSD_WIDTH|DDSD_HEIGHT|DDSD_CAPS|DDSD_PIXELFORMAT); - ddsd.dwWidth = width; - ddsd.dwHeight= height; + /* Set up the surface description */ + SDL_memset(&ddsd, 0, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + ddsd.dwFlags = (DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | DDSD_PIXELFORMAT); + ddsd.dwWidth = width; + ddsd.dwHeight = height; #ifdef USE_DIRECTX_OVERLAY - ddsd.ddsCaps.dwCaps = (DDSCAPS_OVERLAY|DDSCAPS_VIDEOMEMORY); + ddsd.ddsCaps.dwCaps = (DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY); #else - ddsd.ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_VIDEOMEMORY); + ddsd.ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY); #endif - ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat); - ddsd.ddpfPixelFormat.dwFlags = DDPF_FOURCC; - ddsd.ddpfPixelFormat.dwFourCC = format; + ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat); + ddsd.ddpfPixelFormat.dwFlags = DDPF_FOURCC; + ddsd.ddpfPixelFormat.dwFourCC = format; - /* Create the DirectDraw video surface */ - result = IDirectDraw2_CreateSurface(ddraw2, &ddsd, &dd_surface1, NULL); - if ( result != DD_OK ) { - SetDDerror("DirectDraw2::CreateSurface", result); - return(NULL); - } - result = IDirectDrawSurface_QueryInterface(dd_surface1, - &IID_IDirectDrawSurface3, (LPVOID *)&dd_surface3); - IDirectDrawSurface_Release(dd_surface1); - if ( result != DD_OK ) { - SetDDerror("DirectDrawSurface::QueryInterface", result); - return(NULL); - } + /* Create the DirectDraw video surface */ + result = IDirectDraw2_CreateSurface(ddraw2, &ddsd, &dd_surface1, NULL); + if (result != DD_OK) { + SetDDerror("DirectDraw2::CreateSurface", result); + return (NULL); + } + result = IDirectDrawSurface_QueryInterface(dd_surface1, + &IID_IDirectDrawSurface3, + (LPVOID *) & dd_surface3); + IDirectDrawSurface_Release(dd_surface1); + if (result != DD_OK) { + SetDDerror("DirectDrawSurface::QueryInterface", result); + return (NULL); + } - /* Make sure the surface format was set properly */ - SDL_memset(&ddsd, 0, sizeof(ddsd)); - ddsd.dwSize = sizeof(ddsd); - result = IDirectDrawSurface3_Lock(dd_surface3, NULL, - &ddsd, DDLOCK_NOSYSLOCK, NULL); - if ( result != DD_OK ) { - SetDDerror("DirectDrawSurface3::Lock", result); - IDirectDrawSurface_Release(dd_surface3); - return(NULL); - } - IDirectDrawSurface3_Unlock(dd_surface3, NULL); + /* Make sure the surface format was set properly */ + SDL_memset(&ddsd, 0, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + result = IDirectDrawSurface3_Lock(dd_surface3, NULL, + &ddsd, DDLOCK_NOSYSLOCK, NULL); + if (result != DD_OK) { + SetDDerror("DirectDrawSurface3::Lock", result); + IDirectDrawSurface_Release(dd_surface3); + return (NULL); + } + IDirectDrawSurface3_Unlock(dd_surface3, NULL); - if ( !(ddsd.ddpfPixelFormat.dwFlags & DDPF_FOURCC) || - (ddsd.ddpfPixelFormat.dwFourCC != format) ) { - SDL_SetError("DDraw didn't use requested FourCC format"); - IDirectDrawSurface_Release(dd_surface3); - return(NULL); - } + if (!(ddsd.ddpfPixelFormat.dwFlags & DDPF_FOURCC) || + (ddsd.ddpfPixelFormat.dwFourCC != format)) { + SDL_SetError("DDraw didn't use requested FourCC format"); + IDirectDrawSurface_Release(dd_surface3); + return (NULL); + } - /* We're ready to go! */ - return(dd_surface3); + /* We're ready to go! */ + return (dd_surface3); } #ifdef DEBUG_YUV -static char *PrintFOURCC(Uint32 code) +static char * +PrintFOURCC(Uint32 code) { - static char buf[5]; + static char buf[5]; - buf[3] = code >> 24; - buf[2] = (code >> 16) & 0xFF; - buf[1] = (code >> 8) & 0xFF; - buf[0] = (code & 0xFF); - return(buf); + buf[3] = code >> 24; + buf[2] = (code >> 16) & 0xFF; + buf[1] = (code >> 8) & 0xFF; + buf[0] = (code & 0xFF); + return (buf); } #endif -SDL_Overlay *DX5_CreateYUVOverlay(_THIS, int width, int height, Uint32 format, SDL_Surface *display) +SDL_Overlay * +DX5_CreateYUVOverlay(_THIS, int width, int height, Uint32 format, + SDL_Surface * display) { - SDL_Overlay *overlay; - struct private_yuvhwdata *hwdata; + SDL_Overlay *overlay; + struct private_yuvhwdata *hwdata; #ifdef DEBUG_YUV - DWORD numcodes; - DWORD *codes; + DWORD numcodes; + DWORD *codes; - printf("FOURCC format requested: 0x%x\n", PrintFOURCC(format)); - IDirectDraw2_GetFourCCCodes(ddraw2, &numcodes, NULL); - if ( numcodes ) { - DWORD i; - codes = SDL_malloc(numcodes*sizeof(*codes)); - if ( codes ) { - IDirectDraw2_GetFourCCCodes(ddraw2, &numcodes, codes); - for ( i=0; i<numcodes; ++i ) { - fprintf(stderr, "Code %d: 0x%x\n", i, PrintFOURCC(codes[i])); - } - SDL_free(codes); - } - } else { - fprintf(stderr, "No FOURCC codes supported\n"); - } + printf("FOURCC format requested: 0x%x\n", PrintFOURCC(format)); + IDirectDraw2_GetFourCCCodes(ddraw2, &numcodes, NULL); + if (numcodes) { + DWORD i; + codes = SDL_malloc(numcodes * sizeof(*codes)); + if (codes) { + IDirectDraw2_GetFourCCCodes(ddraw2, &numcodes, codes); + for (i = 0; i < numcodes; ++i) { + fprintf(stderr, "Code %d: 0x%x\n", i, PrintFOURCC(codes[i])); + } + SDL_free(codes); + } + } else { + fprintf(stderr, "No FOURCC codes supported\n"); + } #endif - /* Create the overlay structure */ - overlay = (SDL_Overlay *)SDL_malloc(sizeof *overlay); - if ( overlay == NULL ) { - SDL_OutOfMemory(); - return(NULL); - } - SDL_memset(overlay, 0, (sizeof *overlay)); + /* Create the overlay structure */ + overlay = (SDL_Overlay *) SDL_malloc(sizeof *overlay); + if (overlay == NULL) { + SDL_OutOfMemory(); + return (NULL); + } + SDL_memset(overlay, 0, (sizeof *overlay)); - /* Fill in the basic members */ - overlay->format = format; - overlay->w = width; - overlay->h = height; + /* Fill in the basic members */ + overlay->format = format; + overlay->w = width; + overlay->h = height; - /* Set up the YUV surface function structure */ - overlay->hwfuncs = &dx5_yuvfuncs; + /* Set up the YUV surface function structure */ + overlay->hwfuncs = &dx5_yuvfuncs; - /* Create the pixel data and lookup tables */ - hwdata = (struct private_yuvhwdata *)SDL_malloc(sizeof *hwdata); - overlay->hwdata = hwdata; - if ( hwdata == NULL ) { - SDL_OutOfMemory(); - SDL_FreeYUVOverlay(overlay); - return(NULL); - } - hwdata->surface = CreateYUVSurface(this, width, height, format); - if ( hwdata->surface == NULL ) { - SDL_FreeYUVOverlay(overlay); - return(NULL); - } - overlay->hw_overlay = 1; + /* Create the pixel data and lookup tables */ + hwdata = (struct private_yuvhwdata *) SDL_malloc(sizeof *hwdata); + overlay->hwdata = hwdata; + if (hwdata == NULL) { + SDL_OutOfMemory(); + SDL_FreeYUVOverlay(overlay); + return (NULL); + } + hwdata->surface = CreateYUVSurface(this, width, height, format); + if (hwdata->surface == NULL) { + SDL_FreeYUVOverlay(overlay); + return (NULL); + } + overlay->hw_overlay = 1; - /* Set up the plane pointers */ - overlay->pitches = hwdata->pitches; - overlay->pixels = hwdata->planes; - switch (format) { - case SDL_YV12_OVERLAY: - case SDL_IYUV_OVERLAY: - overlay->planes = 3; - break; - default: - overlay->planes = 1; - break; - } + /* Set up the plane pointers */ + overlay->pitches = hwdata->pitches; + overlay->pixels = hwdata->planes; + switch (format) { + case SDL_YV12_OVERLAY: + case SDL_IYUV_OVERLAY: + overlay->planes = 3; + break; + default: + overlay->planes = 1; + break; + } - /* We're all done.. */ - return(overlay); + /* We're all done.. */ + return (overlay); } -int DX5_LockYUVOverlay(_THIS, SDL_Overlay *overlay) +int +DX5_LockYUVOverlay(_THIS, SDL_Overlay * overlay) { - HRESULT result; - LPDIRECTDRAWSURFACE3 surface; - DDSURFACEDESC ddsd; + HRESULT result; + LPDIRECTDRAWSURFACE3 surface; + DDSURFACEDESC ddsd; - surface = overlay->hwdata->surface; - SDL_memset(&ddsd, 0, sizeof(ddsd)); - ddsd.dwSize = sizeof(ddsd); - result = IDirectDrawSurface3_Lock(surface, NULL, - &ddsd, DDLOCK_NOSYSLOCK, NULL); - if ( result == DDERR_SURFACELOST ) { - result = IDirectDrawSurface3_Restore(surface); - result = IDirectDrawSurface3_Lock(surface, NULL, &ddsd, - (DDLOCK_NOSYSLOCK|DDLOCK_WAIT), NULL); - } - if ( result != DD_OK ) { - SetDDerror("DirectDrawSurface3::Lock", result); - return(-1); - } + surface = overlay->hwdata->surface; + SDL_memset(&ddsd, 0, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + result = IDirectDrawSurface3_Lock(surface, NULL, + &ddsd, DDLOCK_NOSYSLOCK, NULL); + if (result == DDERR_SURFACELOST) { + result = IDirectDrawSurface3_Restore(surface); + result = IDirectDrawSurface3_Lock(surface, NULL, &ddsd, + (DDLOCK_NOSYSLOCK | DDLOCK_WAIT), + NULL); + } + if (result != DD_OK) { + SetDDerror("DirectDrawSurface3::Lock", result); + return (-1); + } - /* Find the pitch and offset values for the overlay */ + /* Find the pitch and offset values for the overlay */ #if defined(NONAMELESSUNION) - overlay->pitches[0] = (Uint16)ddsd.u1.lPitch; + overlay->pitches[0] = (Uint16) ddsd.u1.lPitch; #else - overlay->pitches[0] = (Uint16)ddsd.lPitch; + overlay->pitches[0] = (Uint16) ddsd.lPitch; #endif - overlay->pixels[0] = (Uint8 *)ddsd.lpSurface; - switch (overlay->format) { - case SDL_YV12_OVERLAY: - case SDL_IYUV_OVERLAY: - /* Add the two extra planes */ - overlay->pitches[1] = overlay->pitches[0] / 2; - overlay->pitches[2] = overlay->pitches[0] / 2; - overlay->pixels[1] = overlay->pixels[0] + - overlay->pitches[0] * overlay->h; - overlay->pixels[2] = overlay->pixels[1] + - overlay->pitches[1] * overlay->h / 2; - break; - default: - /* Only one plane, no worries */ - break; - } - return(0); + overlay->pixels[0] = (Uint8 *) ddsd.lpSurface; + switch (overlay->format) { + case SDL_YV12_OVERLAY: + case SDL_IYUV_OVERLAY: + /* Add the two extra planes */ + overlay->pitches[1] = overlay->pitches[0] / 2; + overlay->pitches[2] = overlay->pitches[0] / 2; + overlay->pixels[1] = overlay->pixels[0] + + overlay->pitches[0] * overlay->h; + overlay->pixels[2] = overlay->pixels[1] + + overlay->pitches[1] * overlay->h / 2; + break; + default: + /* Only one plane, no worries */ + break; + } + return (0); } -void DX5_UnlockYUVOverlay(_THIS, SDL_Overlay *overlay) +void +DX5_UnlockYUVOverlay(_THIS, SDL_Overlay * overlay) { - LPDIRECTDRAWSURFACE3 surface; + LPDIRECTDRAWSURFACE3 surface; - surface = overlay->hwdata->surface; - IDirectDrawSurface3_Unlock(surface, NULL); + surface = overlay->hwdata->surface; + IDirectDrawSurface3_Unlock(surface, NULL); } -int DX5_DisplayYUVOverlay(_THIS, SDL_Overlay *overlay, SDL_Rect *src, SDL_Rect *dst) +int +DX5_DisplayYUVOverlay(_THIS, SDL_Overlay * overlay, SDL_Rect * src, + SDL_Rect * dst) { - HRESULT result; - LPDIRECTDRAWSURFACE3 surface; - RECT srcrect, dstrect; + HRESULT result; + LPDIRECTDRAWSURFACE3 surface; + RECT srcrect, dstrect; - surface = overlay->hwdata->surface; - srcrect.top = src->y; - srcrect.bottom = srcrect.top+src->h; - srcrect.left = src->x; - srcrect.right = srcrect.left+src->w; - dstrect.top = SDL_bounds.top+dst->y; - dstrect.left = SDL_bounds.left+dst->x; - dstrect.bottom = dstrect.top+dst->h; - dstrect.right = dstrect.left+dst->w; + surface = overlay->hwdata->surface; + srcrect.top = src->y; + srcrect.bottom = srcrect.top + src->h; + srcrect.left = src->x; + srcrect.right = srcrect.left + src->w; + dstrect.top = SDL_bounds.top + dst->y; + dstrect.left = SDL_bounds.left + dst->x; + dstrect.bottom = dstrect.top + dst->h; + dstrect.right = dstrect.left + dst->w; #ifdef USE_DIRECTX_OVERLAY - result = IDirectDrawSurface3_UpdateOverlay(surface, &srcrect, - SDL_primary, &dstrect, DDOVER_SHOW, NULL); - if ( result != DD_OK ) { - SetDDerror("DirectDrawSurface3::UpdateOverlay", result); - return(-1); - } + result = IDirectDrawSurface3_UpdateOverlay(surface, &srcrect, + SDL_primary, &dstrect, + DDOVER_SHOW, NULL); + if (result != DD_OK) { + SetDDerror("DirectDrawSurface3::UpdateOverlay", result); + return (-1); + } #else - result = IDirectDrawSurface3_Blt(SDL_primary, &dstrect, surface, &srcrect, - DDBLT_WAIT, NULL); - if ( result != DD_OK ) { - SetDDerror("DirectDrawSurface3::Blt", result); - return(-1); - } + result = + IDirectDrawSurface3_Blt(SDL_primary, &dstrect, surface, &srcrect, + DDBLT_WAIT, NULL); + if (result != DD_OK) { + SetDDerror("DirectDrawSurface3::Blt", result); + return (-1); + } #endif - return(0); + return (0); } -void DX5_FreeYUVOverlay(_THIS, SDL_Overlay *overlay) +void +DX5_FreeYUVOverlay(_THIS, SDL_Overlay * overlay) { - struct private_yuvhwdata *hwdata; + struct private_yuvhwdata *hwdata; - hwdata = overlay->hwdata; - if ( hwdata ) { - if ( hwdata->surface ) { - IDirectDrawSurface_Release(hwdata->surface); - } - SDL_free(hwdata); - } + hwdata = overlay->hwdata; + if (hwdata) { + if (hwdata->surface) { + IDirectDrawSurface_Release(hwdata->surface); + } + SDL_free(hwdata); + } } +/* vi: set ts=4 sw=4 expandtab: */