From 4eeab6a30510d806b366609792a143de3ee9dd7e Mon Sep 17 00:00:00 2001 From: Ben Morris Date: Wed, 18 Feb 2015 09:29:25 -0800 Subject: [PATCH] Adding TILE_BLEND_SUBTRACT flag for subtract blend mode using drawTiles. --- legacy/project/include/Graphics.h | 1 + legacy/project/src/common/ExternalInterface.cpp | 4 ++++ legacy/project/src/common/GraphicsData.cpp | 3 +++ legacy/project/src/common/Hardware.cpp | 2 ++ legacy/project/src/opengl/OpenGLContext.cpp | 8 ++++++++ 5 files changed, 18 insertions(+) diff --git a/legacy/project/include/Graphics.h b/legacy/project/include/Graphics.h index b0e7571c3..4020d6a9a 100644 --- a/legacy/project/include/Graphics.h +++ b/legacy/project/include/Graphics.h @@ -263,6 +263,7 @@ enum PathCommand pcBlendModeAdd = 0x20, pcBlendModeMultiply = 0x21, pcBlendModeScreen = 0x22, + pcBlendModeSubtract = 0x23, }; enum WindingRule { wrOddEven, wrNonZero }; diff --git a/legacy/project/src/common/ExternalInterface.cpp b/legacy/project/src/common/ExternalInterface.cpp index 6acc72ab2..79f445ba5 100644 --- a/legacy/project/src/common/ExternalInterface.cpp +++ b/legacy/project/src/common/ExternalInterface.cpp @@ -2792,6 +2792,7 @@ value nme_gfx_draw_tiles(value inGfx,value inSheet, value inXYIDs,value inFlags, TILE_BLEND_ADD = 0x10000, TILE_BLEND_MULTIPLY = 0x20000, TILE_BLEND_SCREEN = 0x40000, + TILE_BLEND_SUBTRACT = 0x80000, TILE_BLEND_MASK = 0xf0000, }; @@ -2808,6 +2809,9 @@ value nme_gfx_draw_tiles(value inGfx,value inSheet, value inXYIDs,value inFlags, case TILE_BLEND_SCREEN: blend = bmScreen; break; + case TILE_BLEND_SUBTRACT: + blend = bmSubtract; + break; } bool smooth = flags & TILE_SMOOTH; diff --git a/legacy/project/src/common/GraphicsData.cpp b/legacy/project/src/common/GraphicsData.cpp index 3352b3882..bb4d088bd 100644 --- a/legacy/project/src/common/GraphicsData.cpp +++ b/legacy/project/src/common/GraphicsData.cpp @@ -51,6 +51,9 @@ void GraphicsPath::elementBlendMode(int inMode) case bmScreen: commands.push_back(pcBlendModeScreen); break; + case bmSubtract: + commands.push_back(pcBlendModeSubtract); + break; } } diff --git a/legacy/project/src/common/Hardware.cpp b/legacy/project/src/common/Hardware.cpp index 85d01f74f..f075bd68d 100644 --- a/legacy/project/src/common/Hardware.cpp +++ b/legacy/project/src/common/Hardware.cpp @@ -216,6 +216,8 @@ public: mElement.mBlendMode = bmMultiply; else if (cmd[i] == pcBlendModeScreen) mElement.mBlendMode = bmScreen; + else if (cmd[i] == pcBlendModeSubtract) + mElement.mBlendMode = bmSubtract; } if (has_colour) diff --git a/legacy/project/src/opengl/OpenGLContext.cpp b/legacy/project/src/opengl/OpenGLContext.cpp index b01274a62..65d15d92b 100644 --- a/legacy/project/src/opengl/OpenGLContext.cpp +++ b/legacy/project/src/opengl/OpenGLContext.cpp @@ -481,15 +481,23 @@ public: { case bmAdd: glBlendFunc( GL_SRC_ALPHA, GL_ONE ); + glBlendEquation( GL_FUNC_ADD); break; case bmMultiply: glBlendFunc( GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA); + glBlendEquation( GL_FUNC_ADD); break; case bmScreen: glBlendFunc( GL_ONE, GL_ONE_MINUS_SRC_COLOR); + glBlendEquation( GL_FUNC_ADD); + break; + case bmSubtract: + glBlendFunc( GL_SRC_ALPHA, GL_ONE); + glBlendEquation( GL_FUNC_REVERSE_SUBTRACT); break; default: glBlendFunc(premAlpha ? GL_ONE : GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + glBlendEquation( GL_FUNC_ADD); }