src/video/SDL_yuv.c
author Sam Lantinga <slouken@libsdl.org>
Tue, 07 Feb 2006 09:29:18 +0000
changeset 1338 604d73db6802
parent 1336 3692456e7b0f
child 1341 d02b552e5304
permissions -rw-r--r--
Removed uses of stdlib.h and string.h
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@1338
    25
#include "SDL_stdlib.h"
slouken@0
    26
#include "SDL_video.h"
slouken@660
    27
#include "SDL_error.h"
slouken@0
    28
#include "SDL_sysvideo.h"
slouken@0
    29
#include "SDL_yuvfuncs.h"
slouken@0
    30
#include "SDL_yuv_sw_c.h"
slouken@0
    31
slouken@0
    32
slouken@0
    33
SDL_Overlay *SDL_CreateYUVOverlay(int w, int h, Uint32 format,
slouken@0
    34
                                  SDL_Surface *display)
slouken@0
    35
{
slouken@0
    36
	SDL_VideoDevice *video = current_video;
slouken@0
    37
	SDL_VideoDevice *this  = current_video;
slouken@0
    38
	const char *yuv_hwaccel;
slouken@0
    39
	SDL_Overlay *overlay;
slouken@0
    40
slouken@760
    41
	if ( (display->flags & SDL_OPENGL) == SDL_OPENGL ) {
slouken@660
    42
		SDL_SetError("YUV overlays are not supported in OpenGL mode");
slouken@660
    43
		return NULL;
slouken@660
    44
	}
slouken@0
    45
slouken@0
    46
	/* Display directly on video surface, if possible */
slouken@1336
    47
	if ( SDL_getenv("SDL_VIDEO_YUV_DIRECT") ) {
slouken@81
    48
		if ( (display == SDL_PublicSurface) &&
slouken@81
    49
		     ((SDL_VideoSurface->format->BytesPerPixel == 2) ||
slouken@81
    50
		      (SDL_VideoSurface->format->BytesPerPixel == 4)) ) {
slouken@81
    51
			display = SDL_VideoSurface;
slouken@81
    52
		}
slouken@0
    53
	}
slouken@660
    54
	overlay = NULL;
slouken@1336
    55
        yuv_hwaccel = SDL_getenv("SDL_VIDEO_YUV_HWACCEL");
slouken@0
    56
	if ( ((display == SDL_VideoSurface) && video->CreateYUVOverlay) &&
slouken@1330
    57
	     (!yuv_hwaccel || (*yuv_hwaccel != '0')) ) {
slouken@0
    58
		overlay = video->CreateYUVOverlay(this, w, h, format, display);
slouken@0
    59
	}
slouken@0
    60
	/* If hardware YUV overlay failed ... */
slouken@0
    61
	if ( overlay == NULL ) {
slouken@0
    62
		overlay = SDL_CreateYUV_SW(this, w, h, format, display);
slouken@0
    63
	}
slouken@0
    64
	return overlay;
slouken@0
    65
}
slouken@0
    66
slouken@0
    67
int SDL_LockYUVOverlay(SDL_Overlay *overlay)
slouken@0
    68
{
slouken@0
    69
	return overlay->hwfuncs->Lock(current_video, overlay);
slouken@0
    70
}
slouken@0
    71
slouken@0
    72
void SDL_UnlockYUVOverlay(SDL_Overlay *overlay)
slouken@0
    73
{
slouken@0
    74
	overlay->hwfuncs->Unlock(current_video, overlay);
slouken@0
    75
}
slouken@0
    76
slouken@0
    77
int SDL_DisplayYUVOverlay(SDL_Overlay *overlay, SDL_Rect *dstrect)
slouken@0
    78
{
slouken@0
    79
	return overlay->hwfuncs->Display(current_video, overlay, dstrect);
slouken@0
    80
}
slouken@0
    81
slouken@0
    82
void SDL_FreeYUVOverlay(SDL_Overlay *overlay)
slouken@0
    83
{
slouken@0
    84
	if ( overlay ) {
slouken@0
    85
		if ( overlay->hwfuncs ) {
slouken@0
    86
			overlay->hwfuncs->FreeHW(current_video, overlay);
slouken@0
    87
		}
slouken@1336
    88
		SDL_free(overlay);
slouken@0
    89
	}
slouken@0
    90
}