src/video/SDL_yuv.c
author Ozkan Sezer <sezeroz@gmail.com>
Sun, 14 Oct 2018 15:25:04 +0300
branchSDL-1.2
changeset 12325 c4f2eeda176f
parent 6137 4720145f848b
permissions -rw-r--r--
remove symlink for libSDL-1.0.so.0 from the rpm spec file.

also fix a changelog date.
slouken@0
     1
/*
slouken@0
     2
    SDL - Simple DirectMedia Layer
slouken@6137
     3
    Copyright (C) 1997-2012 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@1402
    22
#include "SDL_config.h"
slouken@0
    23
slouken@0
    24
/* This is the implementation of the YUV video surface support */
slouken@0
    25
slouken@0
    26
#include "SDL_video.h"
slouken@0
    27
#include "SDL_sysvideo.h"
slouken@0
    28
#include "SDL_yuvfuncs.h"
slouken@0
    29
#include "SDL_yuv_sw_c.h"
slouken@0
    30
slouken@0
    31
slouken@0
    32
SDL_Overlay *SDL_CreateYUVOverlay(int w, int h, Uint32 format,
slouken@0
    33
                                  SDL_Surface *display)
slouken@0
    34
{
slouken@0
    35
	SDL_VideoDevice *video = current_video;
slouken@0
    36
	SDL_VideoDevice *this  = current_video;
slouken@0
    37
	const char *yuv_hwaccel;
slouken@0
    38
	SDL_Overlay *overlay;
slouken@0
    39
slouken@760
    40
	if ( (display->flags & SDL_OPENGL) == SDL_OPENGL ) {
slouken@660
    41
		SDL_SetError("YUV overlays are not supported in OpenGL mode");
slouken@660
    42
		return NULL;
slouken@660
    43
	}
slouken@0
    44
slouken@0
    45
	/* Display directly on video surface, if possible */
slouken@1336
    46
	if ( SDL_getenv("SDL_VIDEO_YUV_DIRECT") ) {
slouken@81
    47
		if ( (display == SDL_PublicSurface) &&
slouken@81
    48
		     ((SDL_VideoSurface->format->BytesPerPixel == 2) ||
slouken@81
    49
		      (SDL_VideoSurface->format->BytesPerPixel == 4)) ) {
slouken@81
    50
			display = SDL_VideoSurface;
slouken@81
    51
		}
slouken@0
    52
	}
slouken@660
    53
	overlay = NULL;
slouken@1336
    54
        yuv_hwaccel = SDL_getenv("SDL_VIDEO_YUV_HWACCEL");
slouken@0
    55
	if ( ((display == SDL_VideoSurface) && video->CreateYUVOverlay) &&
slouken@1341
    56
	     (!yuv_hwaccel || (SDL_atoi(yuv_hwaccel) > 0)) ) {
slouken@0
    57
		overlay = video->CreateYUVOverlay(this, w, h, format, display);
slouken@0
    58
	}
slouken@0
    59
	/* If hardware YUV overlay failed ... */
slouken@0
    60
	if ( overlay == NULL ) {
slouken@0
    61
		overlay = SDL_CreateYUV_SW(this, w, h, format, display);
slouken@0
    62
	}
slouken@0
    63
	return overlay;
slouken@0
    64
}
slouken@0
    65
slouken@0
    66
int SDL_LockYUVOverlay(SDL_Overlay *overlay)
slouken@0
    67
{
slouken@4076
    68
	if ( overlay == NULL ) {
slouken@4076
    69
		SDL_SetError("Passed NULL overlay");
slouken@4076
    70
		return -1;
slouken@4076
    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@4076
    77
	if ( overlay == NULL ) {
slouken@4076
    78
		return;
slouken@4076
    79
	}
slouken@0
    80
	overlay->hwfuncs->Unlock(current_video, overlay);
slouken@0
    81
}
slouken@0
    82
slouken@0
    83
int SDL_DisplayYUVOverlay(SDL_Overlay *overlay, SDL_Rect *dstrect)
slouken@0
    84
{
slouken@1643
    85
	SDL_Rect src, dst;
slouken@1643
    86
	int srcx, srcy, srcw, srch;
slouken@1643
    87
	int dstx, dsty, dstw, dsth;
slouken@1643
    88
slouken@4076
    89
	if ( overlay == NULL || dstrect == NULL ) {
slouken@4076
    90
		SDL_SetError("Passed NULL overlay or dstrect");
slouken@4076
    91
		return -1;
slouken@4076
    92
	}
slouken@4076
    93
slouken@1643
    94
	/* Clip the rectangle to the screen area */
slouken@1643
    95
	srcx = 0;
slouken@1643
    96
	srcy = 0;
slouken@1643
    97
	srcw = overlay->w;
slouken@1643
    98
	srch = overlay->h;
slouken@1643
    99
	dstx = dstrect->x;
slouken@1643
   100
	dsty = dstrect->y;
slouken@1643
   101
	dstw = dstrect->w;
slouken@1643
   102
	dsth = dstrect->h;
slouken@1643
   103
	if ( dstx < 0 ) {
slouken@1643
   104
		srcw += (dstx * overlay->w) / dstrect->w;
slouken@1643
   105
		dstw += dstx;
slouken@1643
   106
		srcx -= (dstx * overlay->w) / dstrect->w;
slouken@1643
   107
		dstx = 0;
slouken@1643
   108
	}
slouken@1643
   109
	if ( (dstx+dstw) > current_video->screen->w ) {
slouken@1643
   110
		int extra = (dstx+dstw - current_video->screen->w);
slouken@1643
   111
		srcw -= (extra * overlay->w) / dstrect->w;
slouken@1643
   112
		dstw -= extra;
slouken@1643
   113
	}
slouken@1643
   114
	if ( dsty < 0 ) {
slouken@1643
   115
		srch += (dsty * overlay->h) / dstrect->h;
slouken@1643
   116
		dsth += dsty;
slouken@1643
   117
		srcy -= (dsty * overlay->h) / dstrect->h;
slouken@1643
   118
		dsty = 0;
slouken@1643
   119
	}
slouken@1643
   120
	if ( (dsty+dsth) > current_video->screen->h ) {
slouken@1643
   121
		int extra = (dsty+dsth - current_video->screen->h);
slouken@1643
   122
		srch -= (extra * overlay->h) / dstrect->h;
slouken@1643
   123
		dsth -= extra;
slouken@1643
   124
	}
slouken@1643
   125
	if ( srcw <= 0 || srch <= 0 ||
slouken@1643
   126
	     srch <= 0 || dsth <= 0 ) {
slouken@1643
   127
		return 0;
slouken@1643
   128
	}
slouken@1643
   129
	/* Ugh, I can't wait for SDL_Rect to be int values */
slouken@1643
   130
	src.x = srcx;
slouken@1643
   131
	src.y = srcy;
slouken@1643
   132
	src.w = srcw;
slouken@1643
   133
	src.h = srch;
slouken@1643
   134
	dst.x = dstx;
slouken@1643
   135
	dst.y = dsty;
slouken@1643
   136
	dst.w = dstw;
slouken@1643
   137
	dst.h = dsth;
slouken@1643
   138
	return overlay->hwfuncs->Display(current_video, overlay, &src, &dst);
slouken@0
   139
}
slouken@0
   140
slouken@0
   141
void SDL_FreeYUVOverlay(SDL_Overlay *overlay)
slouken@0
   142
{
slouken@4076
   143
	if ( overlay == NULL ) {
slouken@4076
   144
		return;
slouken@0
   145
	}
slouken@4076
   146
	if ( overlay->hwfuncs ) {
slouken@4076
   147
		overlay->hwfuncs->FreeHW(current_video, overlay);
slouken@4076
   148
	}
slouken@4076
   149
	SDL_free(overlay);
slouken@0
   150
}