Skip to content

Instantly share code, notes, and snippets.

@Alhadis
Created February 24, 2019 03:48
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Alhadis/455346f35286745d8562d24a8764dfa1 to your computer and use it in GitHub Desktop.
Save Alhadis/455346f35286745d8562d24a8764dfa1 to your computer and use it in GitHub Desktop.
blend-modes.c
/* From: http://web.archive.org/web/20090222030436/http://www.nathanm.com/photoshop-blending-math/ */
#define ChannelBlend_Normal(B,L) ((uint8)(B))
#define ChannelBlend_Lighten(B,L) ((uint8)((L > B) ? L:B))
#define ChannelBlend_Darken(B,L) ((uint8)((L > B) ? B:L))
#define ChannelBlend_Multiply(B,L) ((uint8)((B * L) / 255))
#define ChannelBlend_Average(B,L) ((uint8)((B + L) / 2))
#define ChannelBlend_Add(B,L) ((uint8)(min(255, (B + L))))
#define ChannelBlend_Subtract(B,L) ((uint8)((B + L < 255) ? 0:(B + L - 255)))
#define ChannelBlend_Difference(B,L) ((uint8)(abs(B - L)))
#define ChannelBlend_Negation(B,L) ((uint8)(255 - abs(255 - B - L)))
#define ChannelBlend_Screen(B,L) ((uint8)(255 - (((255 - B) * (255 - L)) >> 8)))
#define ChannelBlend_Exclusion(B,L) ((uint8)(B + L - 2 * B * L / 255))
#define ChannelBlend_Overlay(B,L) ((uint8)((L < 128) ? (2 * B * L / 255):(255 - 2 * (255 - B) * (255 - L) / 255)))
#define ChannelBlend_SoftLight(B,L) ((uint8)((L < 128) ? (2 * ((B >> 1) + 64)) * (L / 255): \
(255 - (2 * (255 - ((B >> 1) + 64)) * (255 - L) / 255))))
#define ChannelBlend_HardLight(B,L) (ChannelBlend_Overlay(L,B))
#define ChannelBlend_ColorDodge(B,L) ((uint8)((B == 255) ? B:min(255, ((L << 8 ) / (255 - B)))))
#define ChannelBlend_ColorBurn(B,L) ((uint8)((B == 0) ? B:max(0, (255 - ((255 - L) << 8 ) / B))))
#define ChannelBlend_LinearDodge(B,L) (ChannelBlend_Add(B,L))
#define ChannelBlend_LinearBurn(B,L) (ChannelBlend_Subtract(B,L))
#define ChannelBlend_LinearLight(B,L) ((uint8)(B < 128)? ChannelBlend_LinearBurn((2*B),L):ChannelBlend_LinearDodge((2*(B - 128)),L))
#define ChannelBlend_VividLight(B,L) ((uint8)(B < 128)? ChannelBlend_ColorBurn((2*B),L):ChannelBlend_ColorDodge((2*(B - 128)),L))
#define ChannelBlend_PinLight(B,L) ((uint8)(B < 128)? ChannelBlend_Darken((2 * B),L):ChannelBlend_Lighten((2 *(B - 128)),L))
#define ChannelBlend_HardMix(B,L) ((uint8)((ChannelBlend_VividLight(B,L) < 128) ? 0:255))
#define ChannelBlend_Reflect(B,L) ((uint8)((L == 255) ? L:min(255, (B * B / (255 - L)))))
#define ChannelBlend_Glow(B,L) (ChannelBlend_Reflect(L,B))
#define ChannelBlend_Phoenix(B,L) ((uint8)(min(B,L) - max(B,L) + 255))
#define ChannelBlend_Alpha(B,L,O) ((uint8)(O * B + (1 - O) * L))
#define ChannelBlend_AlphaF(B,L,F,O) (ChannelBlend_Alpha(F(B,L),B,O))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment