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