Fixed all known static analysis bugs, with checker-279 on macOS.
--HG-- extra : rebase_source : 340383a2099de0ed7e61343fb21f59685d11a87e
This commit is contained in:
parent
5825b773fd
commit
893f89bb1c
8 changed files with 159 additions and 88 deletions
|
@ -734,8 +734,8 @@ SDL_UpdateTextureYUV(SDL_Texture * texture, const SDL_Rect * rect,
|
|||
|
||||
if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
|
||||
/* We can lock the texture and copy to it */
|
||||
void *native_pixels;
|
||||
int native_pitch;
|
||||
void *native_pixels = NULL;
|
||||
int native_pitch = 0;
|
||||
|
||||
if (SDL_LockTexture(native, rect, &native_pixels, &native_pitch) < 0) {
|
||||
return -1;
|
||||
|
@ -745,18 +745,18 @@ SDL_UpdateTextureYUV(SDL_Texture * texture, const SDL_Rect * rect,
|
|||
SDL_UnlockTexture(native);
|
||||
} else {
|
||||
/* Use a temporary buffer for updating */
|
||||
void *temp_pixels;
|
||||
int temp_pitch;
|
||||
|
||||
temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3);
|
||||
temp_pixels = SDL_malloc(rect->h * temp_pitch);
|
||||
if (!temp_pixels) {
|
||||
return SDL_OutOfMemory();
|
||||
const int temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3);
|
||||
const size_t alloclen = rect->h * temp_pitch;
|
||||
if (alloclen > 0) {
|
||||
void *temp_pixels = SDL_malloc(alloclen);
|
||||
if (!temp_pixels) {
|
||||
return SDL_OutOfMemory();
|
||||
}
|
||||
SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,
|
||||
rect->w, rect->h, temp_pixels, temp_pitch);
|
||||
SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch);
|
||||
SDL_free(temp_pixels);
|
||||
}
|
||||
SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,
|
||||
rect->w, rect->h, temp_pixels, temp_pitch);
|
||||
SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch);
|
||||
SDL_free(temp_pixels);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -767,10 +767,14 @@ SDL_UpdateTextureNative(SDL_Texture * texture, const SDL_Rect * rect,
|
|||
{
|
||||
SDL_Texture *native = texture->native;
|
||||
|
||||
if (!rect->w || !rect->h) {
|
||||
return 0; /* nothing to do. */
|
||||
}
|
||||
|
||||
if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
|
||||
/* We can lock the texture and copy to it */
|
||||
void *native_pixels;
|
||||
int native_pitch;
|
||||
void *native_pixels = NULL;
|
||||
int native_pitch = 0;
|
||||
|
||||
if (SDL_LockTexture(native, rect, &native_pixels, &native_pitch) < 0) {
|
||||
return -1;
|
||||
|
@ -781,19 +785,19 @@ SDL_UpdateTextureNative(SDL_Texture * texture, const SDL_Rect * rect,
|
|||
SDL_UnlockTexture(native);
|
||||
} else {
|
||||
/* Use a temporary buffer for updating */
|
||||
void *temp_pixels;
|
||||
int temp_pitch;
|
||||
|
||||
temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3);
|
||||
temp_pixels = SDL_malloc(rect->h * temp_pitch);
|
||||
if (!temp_pixels) {
|
||||
return SDL_OutOfMemory();
|
||||
const int temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3);
|
||||
const size_t alloclen = rect->h * temp_pitch;
|
||||
if (alloclen > 0) {
|
||||
void *temp_pixels = SDL_malloc(alloclen);
|
||||
if (!temp_pixels) {
|
||||
return SDL_OutOfMemory();
|
||||
}
|
||||
SDL_ConvertPixels(rect->w, rect->h,
|
||||
texture->format, pixels, pitch,
|
||||
native->format, temp_pixels, temp_pitch);
|
||||
SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch);
|
||||
SDL_free(temp_pixels);
|
||||
}
|
||||
SDL_ConvertPixels(rect->w, rect->h,
|
||||
texture->format, pixels, pitch,
|
||||
native->format, temp_pixels, temp_pitch);
|
||||
SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch);
|
||||
SDL_free(temp_pixels);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -853,10 +857,14 @@ SDL_UpdateTextureYUVPlanar(SDL_Texture * texture, const SDL_Rect * rect,
|
|||
full_rect.h = texture->h;
|
||||
rect = &full_rect;
|
||||
|
||||
if (!rect->w || !rect->h) {
|
||||
return 0; /* nothing to do. */
|
||||
}
|
||||
|
||||
if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
|
||||
/* We can lock the texture and copy to it */
|
||||
void *native_pixels;
|
||||
int native_pitch;
|
||||
void *native_pixels = NULL;
|
||||
int native_pitch = 0;
|
||||
|
||||
if (SDL_LockTexture(native, rect, &native_pixels, &native_pitch) < 0) {
|
||||
return -1;
|
||||
|
@ -866,18 +874,18 @@ SDL_UpdateTextureYUVPlanar(SDL_Texture * texture, const SDL_Rect * rect,
|
|||
SDL_UnlockTexture(native);
|
||||
} else {
|
||||
/* Use a temporary buffer for updating */
|
||||
void *temp_pixels;
|
||||
int temp_pitch;
|
||||
|
||||
temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3);
|
||||
temp_pixels = SDL_malloc(rect->h * temp_pitch);
|
||||
if (!temp_pixels) {
|
||||
return SDL_OutOfMemory();
|
||||
const int temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3);
|
||||
const size_t alloclen = rect->h * temp_pitch;
|
||||
if (alloclen > 0) {
|
||||
void *temp_pixels = SDL_malloc(alloclen);
|
||||
if (!temp_pixels) {
|
||||
return SDL_OutOfMemory();
|
||||
}
|
||||
SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,
|
||||
rect->w, rect->h, temp_pixels, temp_pitch);
|
||||
SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch);
|
||||
SDL_free(temp_pixels);
|
||||
}
|
||||
SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,
|
||||
rect->w, rect->h, temp_pixels, temp_pitch);
|
||||
SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch);
|
||||
SDL_free(temp_pixels);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -924,6 +932,10 @@ int SDL_UpdateYUVTexture(SDL_Texture * texture, const SDL_Rect * rect,
|
|||
rect = &full_rect;
|
||||
}
|
||||
|
||||
if (!rect->w || !rect->h) {
|
||||
return 0; /* nothing to do. */
|
||||
}
|
||||
|
||||
if (texture->yuv) {
|
||||
return SDL_UpdateTextureYUVPlanar(texture, rect, Yplane, Ypitch, Uplane, Upitch, Vplane, Vpitch);
|
||||
} else {
|
||||
|
@ -1882,29 +1894,12 @@ SDL_RenderPresent(SDL_Renderer * renderer)
|
|||
renderer->RenderPresent(renderer);
|
||||
}
|
||||
|
||||
void
|
||||
SDL_DestroyTexture(SDL_Texture * texture)
|
||||
/* this isn't responsible for removing the deleted texture from the list!
|
||||
(this is to keep static analysis happy in SDL_DestroyRenderer().) */
|
||||
static void
|
||||
SDL_DestroyTextureInternal(SDL_Texture * texture)
|
||||
{
|
||||
SDL_Renderer *renderer;
|
||||
|
||||
CHECK_TEXTURE_MAGIC(texture, );
|
||||
|
||||
renderer = texture->renderer;
|
||||
if (texture == renderer->target) {
|
||||
SDL_SetRenderTarget(renderer, NULL);
|
||||
}
|
||||
|
||||
texture->magic = NULL;
|
||||
|
||||
if (texture->next) {
|
||||
texture->next->prev = texture->prev;
|
||||
}
|
||||
if (texture->prev) {
|
||||
texture->prev->next = texture->next;
|
||||
} else {
|
||||
renderer->textures = texture->next;
|
||||
}
|
||||
|
||||
SDL_Renderer *renderer = texture->renderer;
|
||||
if (texture->native) {
|
||||
SDL_DestroyTexture(texture->native);
|
||||
}
|
||||
|
@ -1917,17 +1912,50 @@ SDL_DestroyTexture(SDL_Texture * texture)
|
|||
SDL_free(texture);
|
||||
}
|
||||
|
||||
void
|
||||
SDL_DestroyTexture(SDL_Texture * texture)
|
||||
{
|
||||
SDL_Renderer *renderer;
|
||||
|
||||
CHECK_TEXTURE_MAGIC(texture, );
|
||||
|
||||
renderer = texture->renderer;
|
||||
if (texture == renderer->target) {
|
||||
SDL_SetRenderTarget(renderer, NULL);
|
||||
}
|
||||
|
||||
texture->magic = NULL; /* just in case, but we're about to free this... */
|
||||
|
||||
if (texture->next) {
|
||||
texture->next->prev = texture->prev;
|
||||
}
|
||||
if (texture->prev) {
|
||||
texture->prev->next = texture->next;
|
||||
} else {
|
||||
renderer->textures = texture->next;
|
||||
}
|
||||
|
||||
SDL_DestroyTextureInternal(texture);
|
||||
}
|
||||
|
||||
void
|
||||
SDL_DestroyRenderer(SDL_Renderer * renderer)
|
||||
{
|
||||
SDL_Texture *texture = NULL;
|
||||
SDL_Texture *nexttexture = NULL;
|
||||
|
||||
CHECK_RENDERER_MAGIC(renderer, );
|
||||
|
||||
SDL_DelEventWatch(SDL_RendererEventWatch, renderer);
|
||||
|
||||
/* Free existing textures for this renderer */
|
||||
while (renderer->textures) {
|
||||
SDL_DestroyTexture(renderer->textures);
|
||||
SDL_SetRenderTarget(renderer, NULL);
|
||||
|
||||
for (texture = renderer->textures; texture; texture = nexttexture) {
|
||||
nexttexture = texture->next;
|
||||
SDL_DestroyTexture(texture);
|
||||
}
|
||||
renderer->textures = NULL;
|
||||
|
||||
if (renderer->window) {
|
||||
SDL_SetWindowData(renderer->window, SDL_WINDOWRENDERDATA, NULL);
|
||||
|
|
|
@ -875,14 +875,16 @@ number_of_bits_set(Uint32 a)
|
|||
* Low performance, do not call often.
|
||||
*/
|
||||
static int
|
||||
free_bits_at_bottom_nonzero(Uint32 a)
|
||||
{
|
||||
SDL_assert(a != 0);
|
||||
return (((Sint32) a) & 1l) ? 0 : 1 + free_bits_at_bottom_nonzero(a >> 1);
|
||||
}
|
||||
|
||||
static SDL_INLINE int
|
||||
free_bits_at_bottom(Uint32 a)
|
||||
{
|
||||
/* assume char is 8 bits */
|
||||
if (!a)
|
||||
return sizeof(Uint32) * 8;
|
||||
if (((Sint32) a) & 1l)
|
||||
return 0;
|
||||
return 1 + free_bits_at_bottom(a >> 1);
|
||||
return a ? free_bits_at_bottom_nonzero(a) : 32;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -894,6 +896,7 @@ SDL_SW_SetupYUVDisplay(SDL_SW_YUVTexture * swdata, Uint32 target_format)
|
|||
int i;
|
||||
int bpp;
|
||||
Uint32 Rmask, Gmask, Bmask, Amask;
|
||||
int freebits;
|
||||
|
||||
if (!SDL_PixelFormatEnumToMasks
|
||||
(target_format, &bpp, &Rmask, &Gmask, &Bmask, &Amask) || bpp < 15) {
|
||||
|
@ -910,13 +913,24 @@ SDL_SW_SetupYUVDisplay(SDL_SW_YUVTexture * swdata, Uint32 target_format)
|
|||
*/
|
||||
for (i = 0; i < 256; ++i) {
|
||||
r_2_pix_alloc[i + 256] = i >> (8 - number_of_bits_set(Rmask));
|
||||
r_2_pix_alloc[i + 256] <<= free_bits_at_bottom(Rmask);
|
||||
freebits = free_bits_at_bottom(Rmask);
|
||||
if (freebits < 32) {
|
||||
r_2_pix_alloc[i + 256] <<= freebits;
|
||||
}
|
||||
r_2_pix_alloc[i + 256] |= Amask;
|
||||
|
||||
g_2_pix_alloc[i + 256] = i >> (8 - number_of_bits_set(Gmask));
|
||||
g_2_pix_alloc[i + 256] <<= free_bits_at_bottom(Gmask);
|
||||
freebits = free_bits_at_bottom(Gmask);
|
||||
if (freebits < 32) {
|
||||
g_2_pix_alloc[i + 256] <<= freebits;
|
||||
}
|
||||
g_2_pix_alloc[i + 256] |= Amask;
|
||||
|
||||
b_2_pix_alloc[i + 256] = i >> (8 - number_of_bits_set(Bmask));
|
||||
b_2_pix_alloc[i + 256] <<= free_bits_at_bottom(Bmask);
|
||||
freebits = free_bits_at_bottom(Bmask);
|
||||
if (freebits < 32) {
|
||||
b_2_pix_alloc[i + 256] <<= freebits;
|
||||
}
|
||||
b_2_pix_alloc[i + 256] |= Amask;
|
||||
}
|
||||
|
||||
|
|
|
@ -1430,18 +1430,21 @@ GL_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,
|
|||
|
||||
GL_ActivateRenderer(renderer);
|
||||
|
||||
if (!convert_format(data, temp_format, &internalFormat, &format, &type)) {
|
||||
return SDL_SetError("Texture format %s not supported by OpenGL",
|
||||
SDL_GetPixelFormatName(temp_format));
|
||||
}
|
||||
|
||||
if (!rect->w || !rect->h) {
|
||||
return 0; /* nothing to do. */
|
||||
}
|
||||
|
||||
temp_pitch = rect->w * SDL_BYTESPERPIXEL(temp_format);
|
||||
temp_pixels = SDL_malloc(rect->h * temp_pitch);
|
||||
if (!temp_pixels) {
|
||||
return SDL_OutOfMemory();
|
||||
}
|
||||
|
||||
if (!convert_format(data, temp_format, &internalFormat, &format, &type)) {
|
||||
SDL_free(temp_pixels);
|
||||
return SDL_SetError("Texture format %s not supported by OpenGL",
|
||||
SDL_GetPixelFormatName(temp_format));
|
||||
}
|
||||
|
||||
SDL_GetRendererOutputSize(renderer, &w, &h);
|
||||
|
||||
data->glPixelStorei(GL_PACK_ALIGNMENT, 1);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue