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); }