From de6930e985e9fa558e4b8aec439eef922747af29 Mon Sep 17 00:00:00 2001 From: Mike Gorchak Date: Tue, 13 Oct 2009 06:51:20 +0000 Subject: [PATCH] Fixed SDL_BLENDMODE_MASK for GL and GLES renderers, now blending works like in software renderer. --HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%404074 --- src/video/SDL_renderer_gl.c | 18 +++++++++++++----- src/video/SDL_renderer_gles.c | 18 +++++++++++++----- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/video/SDL_renderer_gl.c b/src/video/SDL_renderer_gl.c index 0a205a567..8d8ae186e 100644 --- a/src/video/SDL_renderer_gl.c +++ b/src/video/SDL_renderer_gl.c @@ -1038,7 +1038,7 @@ GL_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture, int numrects, } static void -GL_SetBlendMode(GL_RenderData * data, int blendMode) +GL_SetBlendMode(GL_RenderData * data, int blendMode, int isprimitive) { if (blendMode != data->blendMode) { switch (blendMode) { @@ -1047,6 +1047,14 @@ GL_SetBlendMode(GL_RenderData * data, int blendMode) data->glDisable(GL_BLEND); break; case SDL_BLENDMODE_MASK: + if (isprimitive) { + data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + data->glDisable(GL_BLEND); + /* The same as SDL_BLENDMODE_NONE */ + blendMode = SDL_BLENDMODE_NONE; + break; + } + /* fall through */ case SDL_BLENDMODE_BLEND: data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); data->glEnable(GL_BLEND); @@ -1072,7 +1080,7 @@ GL_RenderPoint(SDL_Renderer * renderer, int x, int y) { GL_RenderData *data = (GL_RenderData *) renderer->driverdata; - GL_SetBlendMode(data, renderer->blendMode); + GL_SetBlendMode(data, renderer->blendMode, 1); data->glColor4f((GLfloat) renderer->r * inv255f, (GLfloat) renderer->g * inv255f, @@ -1091,7 +1099,7 @@ GL_RenderLine(SDL_Renderer * renderer, int x1, int y1, int x2, int y2) { GL_RenderData *data = (GL_RenderData *) renderer->driverdata; - GL_SetBlendMode(data, renderer->blendMode); + GL_SetBlendMode(data, renderer->blendMode, 1); data->glColor4f((GLfloat) renderer->r * inv255f, (GLfloat) renderer->g * inv255f, @@ -1111,7 +1119,7 @@ GL_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect) { GL_RenderData *data = (GL_RenderData *) renderer->driverdata; - GL_SetBlendMode(data, renderer->blendMode); + GL_SetBlendMode(data, renderer->blendMode, 1); data->glColor4f((GLfloat) renderer->r * inv255f, (GLfloat) renderer->g * inv255f, @@ -1180,7 +1188,7 @@ GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, data->glColor4f(1.0f, 1.0f, 1.0f, 1.0f); } - GL_SetBlendMode(data, texture->blendMode); + GL_SetBlendMode(data, texture->blendMode, 0); if (texture->scaleMode != data->scaleMode) { switch (texture->scaleMode) { diff --git a/src/video/SDL_renderer_gles.c b/src/video/SDL_renderer_gles.c index 804b30315..e59929d22 100644 --- a/src/video/SDL_renderer_gles.c +++ b/src/video/SDL_renderer_gles.c @@ -611,7 +611,7 @@ GLES_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture, } static void -GLES_SetBlendMode(GLES_RenderData * data, int blendMode) +GLES_SetBlendMode(GLES_RenderData * data, int blendMode, int isprimitive) { if (blendMode != data->blendMode) { switch (blendMode) { @@ -620,6 +620,14 @@ GLES_SetBlendMode(GLES_RenderData * data, int blendMode) data->glDisable(GL_BLEND); break; case SDL_BLENDMODE_MASK: + if (isprimitive) { + data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + data->glDisable(GL_BLEND); + /* The same as SDL_BLENDMODE_NONE */ + blendMode = SDL_BLENDMODE_NONE; + break; + } + /* fall through */ case SDL_BLENDMODE_BLEND: data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); data->glEnable(GL_BLEND); @@ -645,7 +653,7 @@ GLES_RenderPoint(SDL_Renderer * renderer, int x, int y) { GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata; - GLES_SetBlendMode(data, renderer->blendMode); + GLES_SetBlendMode(data, renderer->blendMode, 1); data->glColor4f((GLfloat) renderer->r * inv255f, (GLfloat) renderer->g * inv255f, @@ -669,7 +677,7 @@ GLES_RenderLine(SDL_Renderer * renderer, int x1, int y1, int x2, int y2) { GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata; - GLES_SetBlendMode(data, renderer->blendMode); + GLES_SetBlendMode(data, renderer->blendMode, 1); data->glColor4f((GLfloat) renderer->r * inv255f, (GLfloat) renderer->g * inv255f, @@ -695,7 +703,7 @@ GLES_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect) { GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata; - GLES_SetBlendMode(data, renderer->blendMode); + GLES_SetBlendMode(data, renderer->blendMode, 1); data->glColor4f((GLfloat) renderer->r * inv255f, (GLfloat) renderer->g * inv255f, @@ -789,7 +797,7 @@ GLES_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, data->glColor4f(1.0f, 1.0f, 1.0f, 1.0f); } - GLES_SetBlendMode(data, texture->blendMode); + GLES_SetBlendMode(data, texture->blendMode, 0); switch (texture->scaleMode) { case SDL_TEXTURESCALEMODE_NONE: