src/video/SDL_yuv.c
author Sam Lantinga <slouken@libsdl.org>
Fri, 14 Dec 2001 12:38:15 +0000
changeset 252 e8157fcb3114
parent 81 1a2723474f12
child 297 f6ffac90895c
permissions -rw-r--r--
Updated the source with the correct e-mail address
slouken@0
     1
/*
slouken@0
     2
    SDL - Simple DirectMedia Layer
slouken@0
     3
    Copyright (C) 1997, 1998, 1999, 2000, 2001  Sam Lantinga
slouken@0
     4
slouken@0
     5
    This library is free software; you can redistribute it and/or
slouken@0
     6
    modify it under the terms of the GNU Library General Public
slouken@0
     7
    License as published by the Free Software Foundation; either
slouken@0
     8
    version 2 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@0
    13
    Library General Public License for more details.
slouken@0
    14
slouken@0
    15
    You should have received a copy of the GNU Library General Public
slouken@0
    16
    License along with this library; if not, write to the Free
slouken@0
    17
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
slouken@0
    18
slouken@0
    19
    Sam Lantinga
slouken@252
    20
    slouken@libsdl.org
slouken@0
    21
*/
slouken@0
    22
slouken@0
    23
#ifdef SAVE_RCSID
slouken@0
    24
static char rcsid =
slouken@0
    25
 "@(#) $Id$";
slouken@0
    26
#endif
slouken@0
    27
slouken@0
    28
/* This is the implementation of the YUV video surface support */
slouken@0
    29
slouken@0
    30
#include <stdlib.h>
slouken@0
    31
#include <string.h>
slouken@0
    32
slouken@0
    33
#include "SDL_getenv.h"
slouken@0
    34
#include "SDL_video.h"
slouken@0
    35
#include "SDL_sysvideo.h"
slouken@0
    36
#include "SDL_yuvfuncs.h"
slouken@0
    37
#include "SDL_yuv_sw_c.h"
slouken@0
    38
slouken@0
    39
slouken@0
    40
SDL_Overlay *SDL_CreateYUVOverlay(int w, int h, Uint32 format,
slouken@0
    41
                                  SDL_Surface *display)
slouken@0
    42
{
slouken@0
    43
	SDL_VideoDevice *video = current_video;
slouken@0
    44
	SDL_VideoDevice *this  = current_video;
slouken@0
    45
	const char *yuv_hwaccel;
slouken@0
    46
	SDL_Overlay *overlay;
slouken@0
    47
slouken@0
    48
	overlay = NULL;
slouken@0
    49
slouken@0
    50
	/* Display directly on video surface, if possible */
slouken@81
    51
	if ( getenv("SDL_VIDEO_YUV_DIRECT") ) {
slouken@81
    52
		if ( (display == SDL_PublicSurface) &&
slouken@81
    53
		     ((SDL_VideoSurface->format->BytesPerPixel == 2) ||
slouken@81
    54
		      (SDL_VideoSurface->format->BytesPerPixel == 4)) ) {
slouken@81
    55
			display = SDL_VideoSurface;
slouken@81
    56
		}
slouken@0
    57
	}
slouken@0
    58
        yuv_hwaccel = getenv("SDL_VIDEO_YUV_HWACCEL");
slouken@0
    59
	if ( ((display == SDL_VideoSurface) && video->CreateYUVOverlay) &&
slouken@0
    60
	     (!yuv_hwaccel || (atoi(yuv_hwaccel) > 0)) ) {
slouken@0
    61
		overlay = video->CreateYUVOverlay(this, w, h, format, display);
slouken@0
    62
	}
slouken@0
    63
	/* If hardware YUV overlay failed ... */
slouken@0
    64
	if ( overlay == NULL ) {
slouken@0
    65
		overlay = SDL_CreateYUV_SW(this, w, h, format, display);
slouken@0
    66
	}
slouken@0
    67
	return overlay;
slouken@0
    68
}
slouken@0
    69
slouken@0
    70
int SDL_LockYUVOverlay(SDL_Overlay *overlay)
slouken@0
    71
{
slouken@0
    72
	return overlay->hwfuncs->Lock(current_video, overlay);
slouken@0
    73
}
slouken@0
    74
slouken@0
    75
void SDL_UnlockYUVOverlay(SDL_Overlay *overlay)
slouken@0
    76
{
slouken@0
    77
	overlay->hwfuncs->Unlock(current_video, overlay);
slouken@0
    78
}
slouken@0
    79
slouken@0
    80
int SDL_DisplayYUVOverlay(SDL_Overlay *overlay, SDL_Rect *dstrect)
slouken@0
    81
{
slouken@0
    82
	return overlay->hwfuncs->Display(current_video, overlay, dstrect);
slouken@0
    83
}
slouken@0
    84
slouken@0
    85
void SDL_FreeYUVOverlay(SDL_Overlay *overlay)
slouken@0
    86
{
slouken@0
    87
	if ( overlay ) {
slouken@0
    88
		if ( overlay->hwfuncs ) {
slouken@0
    89
			overlay->hwfuncs->FreeHW(current_video, overlay);
slouken@0
    90
		}
slouken@0
    91
		free(overlay);
slouken@0
    92
	}
slouken@0
    93
}