Created
February 24, 2019 03:48
-
-
Save Alhadis/455346f35286745d8562d24a8764dfa1 to your computer and use it in GitHub Desktop.
blend-modes.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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