Added the ability to update a subrect of a YV12/IYUV texture.
This commit is contained in:
parent
98615b55aa
commit
5e38454931
1 changed files with 41 additions and 8 deletions
|
@ -1119,15 +1119,48 @@ SDL_SW_UpdateYUVTexture(SDL_SW_YUVTexture * swdata, const SDL_Rect * rect,
|
||||||
switch (swdata->format) {
|
switch (swdata->format) {
|
||||||
case SDL_PIXELFORMAT_YV12:
|
case SDL_PIXELFORMAT_YV12:
|
||||||
case SDL_PIXELFORMAT_IYUV:
|
case SDL_PIXELFORMAT_IYUV:
|
||||||
if (rect
|
if (rect->x == 0 && rect->y == 0 &&
|
||||||
&& (rect->x != 0 || rect->y != 0 || rect->w != swdata->w
|
rect->w == swdata->w && rect->h == swdata->h) {
|
||||||
|| rect->h != swdata->h)) {
|
SDL_memcpy(swdata->pixels, pixels,
|
||||||
SDL_SetError
|
(swdata->h * swdata->w) + (swdata->h * swdata->w) / 2);
|
||||||
("YV12 and IYUV textures only support full surface updates");
|
} else {
|
||||||
return -1;
|
Uint8 *src, *dst;
|
||||||
|
int row;
|
||||||
|
size_t length;
|
||||||
|
|
||||||
|
/* Copy the Y plane */
|
||||||
|
src = (Uint8 *) pixels;
|
||||||
|
dst = swdata->pixels + rect->y * swdata->w + rect->x;
|
||||||
|
length = rect->w;
|
||||||
|
for (row = 0; row < rect->h; ++row) {
|
||||||
|
SDL_memcpy(dst, src, length);
|
||||||
|
src += pitch;
|
||||||
|
dst += swdata->w;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy the next plane */
|
||||||
|
src = (Uint8 *) pixels + rect->h * pitch;
|
||||||
|
dst = swdata->pixels + swdata->h * swdata->w;
|
||||||
|
dst += rect->y/2 * swdata->w/2 + rect->x/2;
|
||||||
|
length = rect->w / 2;
|
||||||
|
for (row = 0; row < rect->h/2; ++row) {
|
||||||
|
SDL_memcpy(dst, src, length);
|
||||||
|
src += pitch/2;
|
||||||
|
dst += swdata->w/2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy the next plane */
|
||||||
|
src = (Uint8 *) pixels + rect->h * pitch + (rect->h * pitch) / 4;
|
||||||
|
dst = swdata->pixels + swdata->h * swdata->w +
|
||||||
|
(swdata->h * swdata->w) / 4;
|
||||||
|
dst += rect->y/2 * swdata->w/2 + rect->x/2;
|
||||||
|
length = rect->w / 2;
|
||||||
|
for (row = 0; row < rect->h/2; ++row) {
|
||||||
|
SDL_memcpy(dst, src, length);
|
||||||
|
src += pitch/2;
|
||||||
|
dst += swdata->w/2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
SDL_memcpy(swdata->pixels, pixels,
|
|
||||||
(swdata->h * swdata->w) + (swdata->h * swdata->w) / 2);
|
|
||||||
break;
|
break;
|
||||||
case SDL_PIXELFORMAT_YUY2:
|
case SDL_PIXELFORMAT_YUY2:
|
||||||
case SDL_PIXELFORMAT_UYVY:
|
case SDL_PIXELFORMAT_UYVY:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue