From aaf9ea3eb0963231ce5861451b38fe712baacfc1 Mon Sep 17 00:00:00 2001 From: pelya Date: Wed, 21 Jul 2010 14:32:15 +0300 Subject: [PATCH] Fixed bug in GLES_UpdateTexture() --- .../sdl/sdl-1.3/src/video/SDL_renderer_gles.c | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/alienblaster/project/sdl/sdl-1.3/src/video/SDL_renderer_gles.c b/alienblaster/project/sdl/sdl-1.3/src/video/SDL_renderer_gles.c index 4db3d35c8..3b0d9d2e0 100644 --- a/alienblaster/project/sdl/sdl-1.3/src/video/SDL_renderer_gles.c +++ b/alienblaster/project/sdl/sdl-1.3/src/video/SDL_renderer_gles.c @@ -590,13 +590,36 @@ GLES_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, GLES_RenderData *renderdata = (GLES_RenderData *) renderer->driverdata; GLES_TextureData *data = (GLES_TextureData *) texture->driverdata; GLenum result; + int bpp = SDL_BYTESPERPIXEL(texture->format); + void * temp_buffer; + void * temp_ptr; + int i; renderdata->glGetError(); renderdata->glEnable(data->type); SetupTextureUpdate(renderdata, texture, pitch); + + if( rect->w * bpp == pitch ) { + temp_buffer = (void *)pixels; /* No need to reformat */ + } else { + /* Reformatting of mem area required */ + temp_buffer = SDL_malloc(rect->w * rect->h * bpp); + temp_ptr = temp_buffer; + for (i = 0; i < rect->h; i++) { + SDL_memcpy(temp_ptr, pixels, rect->w * bpp); + temp_ptr += rect->w * bpp; + pixels += pitch; + } + } + renderdata->glTexSubImage2D(data->type, 0, rect->x, rect->y, rect->w, rect->h, data->format, data->formattype, - pixels); + temp_buffer); + + if( temp_buffer != pixels ) { + SDL_free(temp_buffer); + } + renderdata->glDisable(data->type); result = renderdata->glGetError(); if (result != GL_NO_ERROR) {