src/video/SDL_yuv.c
author Sam Lantinga <slouken@libsdl.org>
Fri, 10 Feb 2006 06:48:43 +0000
changeset 1358 c71e05b4dc2e
parent 1341 d02b552e5304
child 1402 d910939febfa
permissions -rw-r--r--
More header massaging... works great on Windows. ;-)
slouken@0
     1
/*
slouken@0
     2
    SDL - Simple DirectMedia Layer
slouken@1312
     3
    Copyright (C) 1997-2006 Sam Lantinga
slouken@0
     4
slouken@0
     5
    This library is free software; you can redistribute it and/or
slouken@1312
     6
    modify it under the terms of the GNU Lesser General Public
slouken@0
     7
    License as published by the Free Software Foundation; either
slouken@1312
     8
    version 2.1 of the License, or (at your option) any later version.
slouken@0
     9
slouken@0
    10
    This library is distributed in the hope that it will be useful,
slouken@0
    11
    but WITHOUT ANY WARRANTY; without even the implied warranty of
slouken@0
    12
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
slouken@1312
    13
    Lesser General Public License for more details.
slouken@0
    14
slouken@1312
    15
    You should have received a copy of the GNU Lesser General Public
slouken@1312
    16
    License along with this library; if not, write to the Free Software
slouken@1312
    17
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
slouken@0
    18
slouken@0
    19
    Sam Lantinga
slouken@252
    20
    slouken@libsdl.org
slouken@0
    21
*/
slouken@0
    22
slouken@0
    23
/* This is the implementation of the YUV video surface support */
slouken@0
    24
slouken@0
    25
#include "SDL_video.h"
slouken@0
    26
#include "SDL_sysvideo.h"
slouken@0
    27
#include "SDL_yuvfuncs.h"
slouken@0
    28
#include "SDL_yuv_sw_c.h"
slouken@0
    29
slouken@0
    30
slouken@0
    31
SDL_Overlay *SDL_CreateYUVOverlay(int w, int h, Uint32 format,
slouken@0
    32
                                  SDL_Surface *display)
slouken@0
    33
{
slouken@0
    34
	SDL_VideoDevice *video = current_video;
slouken@0
    35
	SDL_VideoDevice *this  = current_video;
slouken@0
    36
	const char *yuv_hwaccel;
slouken@0
    37
	SDL_Overlay *overlay;
slouken@0
    38
slouken@760
    39
	if ( (display->flags & SDL_OPENGL) == SDL_OPENGL ) {
slouken@660
    40
		SDL_SetError("YUV overlays are not supported in OpenGL mode");
slouken@660
    41
		return NULL;
slouken@660
    42
	}
slouken@0
    43
slouken@0
    44
	/* Display directly on video surface, if possible */
slouken@1336
    45
	if ( SDL_getenv("SDL_VIDEO_YUV_DIRECT") ) {
slouken@81
    46
		if ( (display == SDL_PublicSurface) &&
slouken@81
    47
		     ((SDL_VideoSurface->format->BytesPerPixel == 2) ||
slouken@81
    48
		      (SDL_VideoSurface->format->BytesPerPixel == 4)) ) {
slouken@81
    49
			display = SDL_VideoSurface;
slouken@81
    50
		}
slouken@0
    51
	}
slouken@660
    52
	overlay = NULL;
slouken@1336
    53
        yuv_hwaccel = SDL_getenv("SDL_VIDEO_YUV_HWACCEL");
slouken@0
    54
	if ( ((display == SDL_VideoSurface) && video->CreateYUVOverlay) &&
slouken@1341
    55
	     (!yuv_hwaccel || (SDL_atoi(yuv_hwaccel) > 0)) ) {
slouken@0
    56
		overlay = video->CreateYUVOverlay(this, w, h, format, display);
slouken@0
    57
	}
slouken@0
    58
	/* If hardware YUV overlay failed ... */
slouken@0
    59
	if ( overlay == NULL ) {
slouken@0
    60
		overlay = SDL_CreateYUV_SW(this, w, h, format, display);
slouken@0
    61
	}
slouken@0
    62
	return overlay;
slouken@0
    63
}
slouken@0
    64
slouken@0
    65
int SDL_LockYUVOverlay(SDL_Overlay *overlay)
slouken@0
    66
{
slouken@0
    67
	return overlay->hwfuncs->Lock(current_video, overlay);
slouken@0
    68
}
slouken@0
    69
slouken@0
    70
void SDL_UnlockYUVOverlay(SDL_Overlay *overlay)
slouken@0
    71
{
slouken@0
    72
	overlay->hwfuncs->Unlock(current_video, overlay);
slouken@0
    73
}
slouken@0
    74
slouken@0
    75
int SDL_DisplayYUVOverlay(SDL_Overlay *overlay, SDL_Rect *dstrect)
slouken@0
    76
{
slouken@0
    77
	return overlay->hwfuncs->Display(current_video, overlay, dstrect);
slouken@0
    78
}
slouken@0
    79
slouken@0
    80
void SDL_FreeYUVOverlay(SDL_Overlay *overlay)
slouken@0
    81
{
slouken@0
    82
	if ( overlay ) {
slouken@0
    83
		if ( overlay->hwfuncs ) {
slouken@0
    84
			overlay->hwfuncs->FreeHW(current_video, overlay);
slouken@0
    85
		}
slouken@1336
    86
		SDL_free(overlay);
slouken@0
    87
	}
slouken@0
    88
}