Page MenuHome

texturepaintblendmodes.patch

texturepaintblendmodes.patch

Index: source/blender/imbuf/IMB_imbuf.h
===================================================================
--- source/blender/imbuf/IMB_imbuf.h (revision 51772)
+++ source/blender/imbuf/IMB_imbuf.h (working copy)
@@ -163,6 +163,22 @@
IMB_BLEND_DARKEN = 5,
IMB_BLEND_ERASE_ALPHA = 6,
IMB_BLEND_ADD_ALPHA = 7,
+ IMB_BLEND_OVERLAY = 8,
+ IMB_BLEND_HARDLIGHT = 9,
+ IMB_BLEND_COLORBURN = 10,
+ IMB_BLEND_LINEARBURN= 11,
+ IMB_BLEND_COLORDODGE= 12,
+ IMB_BLEND_SCREEN = 13,
+ IMB_BLEND_SOFTLIGHT = 14,
+ IMB_BLEND_PINLIGHT = 15,
+ IMB_BLEND_VIVIDLIGHT = 16,
+ IMB_BLEND_LINEARLIGHT = 17,
+ IMB_BLEND_DIFFERENCE = 18,
+ IMB_BLEND_EXCLUSION = 19,
+ IMB_BLEND_HUE = 20,
+ IMB_BLEND_SATURATION = 21,
+ IMB_BLEND_LUMINOSITY = 22,
+ IMB_BLEND_COLOR = 23,
IMB_BLEND_COPY = 1000,
IMB_BLEND_COPY_RGB = 1001,
Index: source/blender/imbuf/intern/rectop.c
===================================================================
--- source/blender/imbuf/intern/rectop.c (revision 51772)
+++ source/blender/imbuf/intern/rectop.c (working copy)
@@ -121,6 +121,553 @@
}
}
+static void blend_color_overlay(char *cp, char *cp1, char *cp2, int fac)
+{
+ int temp;
+ int mfac=255-fac;
+ if(cp1[0] > 127)
+ temp=255-((255-2*(cp1[0]-127))*(255-cp2[0])/255);
+ else
+ temp=(2*cp1[0]*cp2[0])>>8;
+ temp=(temp*fac+cp1[0]*mfac)/255;
+ if(temp<255)
+ cp[0]=temp;
+ else
+ cp[0]=255;
+ if(cp1[1] > 127)
+ temp=255-((255-2*(cp1[1]-127))*(255-cp2[1])/255);
+ else
+ temp=(2*cp1[1]*cp2[1])/255;
+
+ temp=(temp*fac+cp1[1]*mfac)/255;
+ if(temp<255)
+ cp[1]=temp;
+ else
+ cp[1]=255;
+
+ if(cp1[2] > 127)
+ temp=255-((255-2*(cp1[2]-127))*(255-cp2[2])/255);
+ else
+ temp=(2*cp1[2]*cp2[2])/255;
+
+ temp=(temp*fac+cp1[2]*mfac)/255;
+ if(temp<255)
+ cp[2]=temp;
+ else
+ cp[2]=255;
+}
+static void blend_color_hardlight(char *cp, char *cp1, char *cp2, int fac)
+{
+ int temp;
+ int mfac=255-fac;
+ if(cp2[0] > 127)
+ temp=255-((255-2*(cp2[0]-127))*(255-cp1[0])/255);
+ else
+ temp=(2*cp2[0]*cp1[0])>>8;
+ temp=(temp*fac+cp1[0]*mfac)/255;
+ if(temp<255)cp[0]=temp; else cp[0]=255;
+
+
+ if(cp2[1] > 127)
+ temp=255-((255-2*(cp2[1]-127))*(255-cp1[1])/255);
+ else
+ temp=(2*cp2[1]*cp1[1])/255;
+ temp=(temp*fac+cp1[1]*mfac)/255;
+ if(temp<255) cp[1]=temp; else cp[1]=255;
+
+
+ if(cp2[2] > 127)
+ temp=255-((255-2*(cp2[2]-127))*(255-cp1[2])/255);
+ else
+ temp=(2*cp2[2]*cp1[2])/255;
+
+ temp=(temp*fac+cp1[2]*mfac)/255;
+ if(temp<255) cp[2]=temp; else cp[2]=255;
+}
+static void blend_color_burn(char *cp, char *cp1, char *cp2, int fac)
+{
+ int temp;
+ int mfac=255-fac;
+
+
+ if(cp2[0]==0)
+ temp=0;
+ else
+ temp=255-((255-cp1[0])*255)/cp2[0];
+ if(temp<0)
+ temp=0;
+ cp[0]=(temp*fac+cp1[0]*mfac)/255;
+
+
+ if(cp2[1]==0)
+ temp=0;
+ else
+ temp=255-((255-cp1[1])*255)/cp2[1];
+ if(temp<0)
+ temp=0;
+ cp[1]=(temp*fac+cp1[1]*mfac)/255;
+
+
+ if(cp2[2]==0)
+ temp=0;
+ else
+ temp=255-((255-cp1[2])*255)/cp2[2];
+ if(temp<0)
+ temp=0;
+ cp[2]=(temp*fac+cp1[2]*mfac)/255;
+}
+static void blend_color_linearburn(char *cp, char *cp1, char *cp2, int fac)
+{
+ int temp;
+ int mfac=255-fac;
+
+ temp=cp1[0]+cp2[0]-255;
+ if(temp<0)temp=0;
+ cp[0]=(temp*fac+cp1[0]*mfac)/255;
+
+ temp=cp1[1]+cp2[1]-255;
+ if(temp<0)temp=0;
+ cp[1]=(temp*fac+cp1[1]*mfac)/255;
+
+ temp=cp1[2]+cp2[2]-255;
+ if(temp<0)temp=0;
+ cp[2]=(temp*fac+cp1[2]*mfac)/255;
+}
+
+static void blend_color_dodge(char *cp, char *cp1, char *cp2, int fac)
+{
+ int temp;
+ int mfac=255-fac;
+
+ if(cp2[0]==255)temp=255;
+ else temp=(cp1[0]*255)/(255-cp2[0]);
+ if(temp>255)temp=255;
+ cp[0]=(temp*fac+cp1[0]*mfac)/255;
+
+ if(cp2[1]==255)temp=255;
+ else temp=(cp1[1]*255)/(255-cp2[1]);
+ if(temp>255)temp=255;
+ cp[1]=(temp*fac+cp1[1]*mfac)/255;
+
+ if(cp2[2]==255)temp=255;
+ else temp=(cp1[2]*255)/(255-cp2[2]);
+ if(temp>255)temp=255;
+ cp[2]=(temp*fac+cp1[2]*mfac)/255;
+
+}
+static void blend_color_screen(char *cp, char *cp1, char *cp2, int fac)
+{
+ int temp;
+ int mfac=255-fac;
+
+ temp=255-(((255-cp1[0])*(255-cp2[0]))/255);
+ if(temp<0)temp=0;
+ cp[0]=(temp*fac+cp1[0]*mfac)/255;
+
+ temp=255-(((255-cp1[1])*(255-cp2[1]))/255);
+ if(temp<0)temp=0;
+ cp[1]=(temp*fac+cp1[1]*mfac)/255;
+
+ temp=255-(((255-cp1[2])*(255-cp2[2]))/255);
+ if(temp<0)temp=0;
+ cp[2]=(temp*fac+cp1[2]*mfac)/255;
+}
+static void blend_color_softlight(char *cp, char *cp1, char *cp2, int fac)
+{
+ int temp;
+ int mfac=255-fac;
+
+ temp=((unsigned char)((cp1[0] < 127) ? ((2*((cp2[0]/2)+64)) * (cp1[0]))/255:(255 - (2*(255-((cp2[0] /2 ) + 64))*(255-cp1[0])/255))));
+ cp[0]=(temp*fac+cp1[0]*mfac)/255;
+
+ temp=((unsigned char)((cp1[1] < 127) ? ((2*((cp2[1]/2)+64)) * (cp1[1]))/255:(255 - (2*(255-((cp2[1] /2 ) + 64))*(255-cp1[1])/255))));
+ cp[1]=(temp*fac+cp1[1]*mfac)/255;
+
+ temp=((unsigned char)((cp1[2] < 127) ? ((2*((cp2[2]/2)+64)) * (cp1[2]))/255:(255 - (2*(255-((cp2[2] /2 ) + 64))*(255-cp1[2])/255))));
+ cp[2]=(temp*fac+cp1[2]*mfac)/255;
+}
+
+static void blend_color_pinlight(char *cp, char *cp1, char *cp2, int fac)
+{
+ int temp;
+ int mfac=255-fac;
+
+ if(cp2[0] > 127) {
+ temp=2*(cp2[0]-127);
+ if(cp1[0]>temp)
+ temp=cp1[0];
+ }
+ else
+ {
+ temp=2*cp2[0];
+ if(cp1[0]<temp)
+ temp=cp1[0];
+ }
+
+ cp[0]=(temp*fac+cp1[0]*mfac)/255;
+
+
+ if(cp2[1] > 127) {
+ temp=2*(cp2[1]-127);
+ if(cp1[1]>temp) temp=cp1[1];
+ }
+ else {
+ temp=2*cp2[1];
+ if(cp1[1]<temp) temp=cp1[1];
+ }
+
+ cp[1]=(temp*fac+cp1[1]*mfac)/255;
+
+
+ if(cp2[2] > 127){
+ temp=2*(cp2[2]-127);
+ if(cp1[2]>temp) temp=cp1[2];
+ }
+ else {
+ temp=2*cp2[2];
+ if(cp1[2]<temp) temp=cp1[2];
+ }
+ cp[2]=(temp*fac+cp1[2]*mfac)/255;
+}
+
+
+static void blend_color_linearlight(char *cp, char *cp1, char *cp2, int fac)
+{
+ int temp;
+ int mfac=255-fac;
+
+ if(cp2[0] > 127) {
+ temp=cp1[0]+2*(cp2[0]-127);
+ if(temp>255)
+ temp=255;
+ }
+ else {
+ temp=cp1[0]+2*cp2[0]-255;
+ if(temp<0)temp=0;
+ }
+ cp[0]=(temp*fac+cp1[0]*mfac)/255;
+
+ if(cp2[1] > 127) {
+ temp=cp1[1]+2*(cp2[1]-127);
+ if(temp>255)
+ temp=255;
+ }
+ else {
+ temp=cp1[1]+2*cp2[1]-255;
+ if(temp<0)temp=0;
+ }
+ cp[1]=(temp*fac+cp1[1]*mfac)/255;
+
+ if(cp2[2] > 127) {
+ temp=cp1[2]+2*(cp2[2]-127);
+ if(temp>255)
+ temp=255;
+ }
+ else {
+ temp=cp1[2]+2*cp2[2]-255;
+ if(temp<0)temp=0;
+ }
+ cp[2]=(temp*fac+cp1[2]*mfac)/255;
+}
+
+static void blend_color_vividlight(char *cp, char *cp1, char *cp2, int fac)
+{
+ int temp;
+ int mfac=255-fac;
+
+ if(cp2[0]==255)
+ temp=255;
+ else if(cp2[0]==0)
+ temp=0;
+ else if(cp2[0] > 127) {
+ temp=((cp1[0])*255)/(2*(255-cp2[0]));
+ if(temp>255)temp=255;
+ }
+ else{
+ temp=255-((255-cp1[0])*255/(2*cp2[0]));
+ if(temp<0)temp=0;
+ }
+
+ cp[0]=(temp*fac+cp1[0]*mfac)/255;
+
+ if(cp2[1]==255)
+ temp=255;
+ else if(cp2[1]==0)
+ temp=0;
+ else if(cp2[1] > 127) {
+ temp=((cp1[1])*255)/(2*(255-cp2[1]));
+ if(temp>255)temp=255;
+ }
+ else{
+ temp=255-((255-cp1[1])*255/(2*cp2[1]));
+ if(temp<0)temp=0;
+ }
+
+ cp[1]=(temp*fac+cp1[1]*mfac)/255;
+
+ if(cp2[2]==255)
+ temp=255;
+ else if(cp2[2]==0)
+ temp=0;
+ else if(cp2[2] > 127) {
+ temp=((cp1[2])*255)/(2*(255-cp2[2]));
+ if(temp>255)temp=255;
+ }
+ else{
+ temp=255-((255-cp1[2])*255/(2*cp2[2]));
+ if(temp<0)temp=0;
+ }
+
+ cp[2]=(temp*fac+cp1[2]*mfac)/255;
+
+}
+static void blend_color_difference(char *cp, char *cp1, char *cp2, int fac)
+{
+ int temp;
+ int mfac=255-fac;
+ temp=cp1[0]-cp2[0];
+ if(temp<0)temp=-temp;
+ cp[0]=(temp*fac+cp1[0]*mfac)/255;
+
+ temp=cp1[1]-cp2[1];
+ if(temp<0)temp=-temp;
+ cp[1]=(temp*fac+cp1[1]*mfac)/255;
+
+ temp=cp1[2]-cp2[2];
+ if(temp<0)temp=-temp;
+ cp[2]=(temp*fac+cp1[2]*mfac)/255;
+
+
+}
+static void blend_color_exclusion(char *cp, char *cp1, char *cp2, int fac)
+{
+ int temp;
+ int mfac=255-fac;
+ temp=127-((2*(cp1[0]-127)*(cp2[0]-127))/255);
+ cp[0]=(temp*fac+cp1[0]*mfac)/255;
+
+ temp=127-((2*(cp1[1]-127)*(cp2[1]-127))/255);
+ cp[1]=(temp*fac+cp1[1]*mfac)/255;
+
+ temp=127-((2*(cp1[2]-127)*(cp2[2]-127))/255);
+ cp[2]=(temp*fac+cp1[2]*mfac)/255;
+
+
+}
+
+
+struct FLOAT3Struct
+{
+ float x,y,z;
+};
+
+struct FLOAT3Struct rgb_to_hsv_struct(float r, float g, float b) // added cause the regular rgb_to_hsv crashes when running with threads
+{
+ struct FLOAT3Struct out;
+ float h, s, v;
+ float cmax, cmin, cdelta;
+ float rc, gc, bc;
+
+ cmax = r;
+ cmin = r;
+ cmax = (g>cmax ? g:cmax);
+ cmin = (g<cmin ? g:cmin);
+ cmax = (b>cmax ? b:cmax);
+ cmin = (b<cmin ? b:cmin);
+
+ v = cmax; /* value */
+ if (cmax != 0.0f)
+ s = (cmax - cmin)/cmax;
+ else {
+ s = 0.0f;
+ h = 0.0f;
+ }
+ if (s == 0.0f)
+ h = -1.0f;
+ else {
+ cdelta = cmax-cmin;
+ rc = (cmax-r)/cdelta;
+ gc = (cmax-g)/cdelta;
+ bc = (cmax-b)/cdelta;
+ if (r==cmax)
+ h = bc-gc;
+ else
+ if (g==cmax)
+ h = 2.0f+rc-bc;
+ else
+ h = 4.0f+gc-rc;
+ h = h*60.0f;
+ if (h < 0.0f)
+ h += 360.0f;
+ }
+
+ out.y = s;
+ out.x = h / 360.0f;
+ if(out.y < 0.0f) out.y= 0.0f;
+ out.z = v;
+ return out;
+}
+
+struct FLOAT3Struct hsv_to_rgb_struct(float h, float s, float v) // added cause the regular rgb_to_hsv crashes when running with threads
+{
+ struct FLOAT3Struct out;
+ int i;
+ float f, p, q, t;
+
+ h *= 360.0f;
+
+ if(s==0.0f) {
+ out.x = v;
+ out.y = v;
+ out.z = v;
+ }
+ else {
+ if(h== 360.0f) h = 0.0f;
+
+ h /= 60.0f;
+ i = (int)floor(h);
+ f = h - i;
+ p = v*(1.0f-s);
+ q = v*(1.0f-(s*f));
+ t = v*(1.0f-(s*(1.0f-f)));
+
+ switch (i) {
+ case 0 :
+ out.x = v;
+ out.y = t;
+ out.z = p;
+ break;
+ case 1 :
+ out.x = q;
+ out.y = v;
+ out.z = p;
+ break;
+ case 2 :
+ out.x = p;
+ out.y = v;
+ out.z = t;
+ break;
+ case 3 :
+ out.x = p;
+ out.y = q;
+ out.z = v;
+ break;
+ case 4 :
+ out.x = t;
+ out.y = p;
+ out.z = v;
+ break;
+ case 5 :
+ out.x = v;
+ out.y = p;
+ out.z = q;
+ break;
+ }
+ }
+ return out;
+}
+
+static void blend_color_color(char *cp, char *cp1, char *cp2, int fac)
+{
+ int temp;
+ int mfac=255-fac;
+ struct FLOAT3Struct hsvvalue1;
+ struct FLOAT3Struct hsvvalue2;
+ struct FLOAT3Struct rgbout;
+
+
+ hsvvalue1=rgb_to_hsv_struct(cp1[0]/255.0f, cp1[1]/255.0f, cp1[2]/255.0f);
+ hsvvalue2=rgb_to_hsv_struct(cp2[0]/255.0f, cp2[1]/255.0f, cp2[2]/255.0f);
+
+ hsvvalue1.x=hsvvalue2.x;
+ hsvvalue1.y=hsvvalue2.y;
+ rgbout=hsv_to_rgb_struct(hsvvalue1.x,hsvvalue1.y,hsvvalue1.z);
+ temp=(int)(rgbout.x*255.0f);
+ cp[0]=(temp*fac+cp1[0]*mfac)/255;
+ temp=(int)(rgbout.y*255.0f);
+ cp[1]=(temp*fac+cp1[1]*mfac)/255;
+ temp=(int)(rgbout.z*255.0f);
+ cp[2]=(temp*fac+cp1[2]*mfac)/255;
+
+
+
+}
+
+static void blend_color_hue(char *cp, char *cp1, char *cp2, int fac)
+{
+ int temp;
+ int mfac=255-fac;
+ struct FLOAT3Struct hsvvalue1;
+ struct FLOAT3Struct hsvvalue2;
+ struct FLOAT3Struct rgbout;
+
+
+ hsvvalue1=rgb_to_hsv_struct(cp1[0]/255.0f, cp1[1]/255.0f, cp1[2]/255.0f);
+ hsvvalue2=rgb_to_hsv_struct(cp2[0]/255.0f, cp2[1]/255.0f, cp2[2]/255.0f);
+
+ hsvvalue1.x=hsvvalue2.x;
+ rgbout=hsv_to_rgb_struct(hsvvalue1.x,hsvvalue1.y,hsvvalue1.z);
+ temp=(int)(rgbout.x*255.0f);
+ cp[0]=(temp*fac+cp1[0]*mfac)/255;
+ temp=(int)(rgbout.y*255.0f);
+ cp[1]=(temp*fac+cp1[1]*mfac)/255;
+ temp=(int)(rgbout.z*255.0f);
+ cp[2]=(temp*fac+cp1[2]*mfac)/255;
+
+
+
+}
+
+static void blend_color_saturation(char *cp, char *cp1, char *cp2, int fac)
+{
+ int temp;
+ int mfac=255-fac;
+ struct FLOAT3Struct hsvvalue1;
+ struct FLOAT3Struct hsvvalue2;
+ struct FLOAT3Struct rgbout;
+
+
+ hsvvalue1=rgb_to_hsv_struct(cp1[0]/255.0f, cp1[1]/255.0f, cp1[2]/255.0f);
+ hsvvalue2=rgb_to_hsv_struct(cp2[0]/255.0f, cp2[1]/255.0f, cp2[2]/255.0f);
+ if(hsvvalue1.y>0.005) // don't add any saturation to a completly black and white image
+ hsvvalue1.y=hsvvalue2.y;
+ rgbout=hsv_to_rgb_struct(hsvvalue1.x,hsvvalue1.y,hsvvalue1.z);
+ temp=(int)(rgbout.x*255.0f);
+ cp[0]=(temp*fac+cp1[0]*mfac)/255;
+ temp=(int)(rgbout.y*255.0f);
+ cp[1]=(temp*fac+cp1[1]*mfac)/255;
+ temp=(int)(rgbout.z*255.0f);
+ cp[2]=(temp*fac+cp1[2]*mfac)/255;
+
+
+
+}
+
+
+static void blend_color_luminosity(char *cp, char *cp1, char *cp2, int fac)
+{
+ int temp;
+ int mfac=255-fac;
+ struct FLOAT3Struct hsvvalue1;
+ struct FLOAT3Struct hsvvalue2;
+ struct FLOAT3Struct rgbout;
+
+
+ hsvvalue1=rgb_to_hsv_struct(cp1[0]/255.0f, cp1[1]/255.0f, cp1[2]/255.0f);
+ hsvvalue2=rgb_to_hsv_struct(cp2[0]/255.0f, cp2[1]/255.0f, cp2[2]/255.0f);
+
+ hsvvalue1.z=hsvvalue2.z;
+ rgbout=hsv_to_rgb_struct(hsvvalue1.x,hsvvalue1.y,hsvvalue1.z);
+ temp=(int)(rgbout.x*255.0f);
+ cp[0]=(temp*fac+cp1[0]*mfac)/255;
+ temp=(int)(rgbout.y*255.0f);
+ cp[1]=(temp*fac+cp1[1]*mfac)/255;
+ temp=(int)(rgbout.z*255.0f);
+ cp[2]=(temp*fac+cp1[2]*mfac)/255;
+
+
+
+}
unsigned int IMB_blend_color(unsigned int src1, unsigned int src2, int fac, IMB_BlendMode mode)
{
unsigned int dst;
@@ -147,6 +694,38 @@
blend_color_lighten(cp, cp1, cp2, fac); break;
case IMB_BLEND_DARKEN:
blend_color_darken(cp, cp1, cp2, fac); break;
+ case IMB_BLEND_OVERLAY:
+ blend_color_overlay(cp, cp1, cp2, fac); break;
+ case IMB_BLEND_HARDLIGHT:
+ blend_color_hardlight(cp, cp1, cp2, fac); break;
+ case IMB_BLEND_COLORBURN:
+ blend_color_burn(cp, cp1, cp2, fac); break;
+ case IMB_BLEND_LINEARBURN:
+ blend_color_linearburn(cp, cp1, cp2, fac); break;
+ case IMB_BLEND_COLORDODGE:
+ blend_color_dodge(cp, cp1, cp2, fac); break;
+ case IMB_BLEND_SCREEN:
+ blend_color_screen(cp, cp1, cp2, fac); break;
+ case IMB_BLEND_SOFTLIGHT:
+ blend_color_softlight(cp, cp1, cp2, fac); break;
+ case IMB_BLEND_PINLIGHT:
+ blend_color_pinlight(cp, cp1, cp2, fac); break;
+ case IMB_BLEND_LINEARLIGHT:
+ blend_color_linearlight(cp, cp1, cp2, fac); break;
+ case IMB_BLEND_VIVIDLIGHT:
+ blend_color_vividlight(cp, cp1, cp2, fac); break;
+ case IMB_BLEND_DIFFERENCE:
+ blend_color_difference(cp, cp1, cp2, fac); break;
+ case IMB_BLEND_EXCLUSION:
+ blend_color_exclusion(cp, cp1, cp2, fac); break;
+ case IMB_BLEND_COLOR:
+ blend_color_color(cp, cp1, cp2, fac); break;
+ case IMB_BLEND_HUE:
+ blend_color_hue(cp, cp1, cp2, fac); break;
+ case IMB_BLEND_SATURATION:
+ blend_color_saturation(cp, cp1, cp2, fac); break;
+ case IMB_BLEND_LUMINOSITY:
+ blend_color_luminosity(cp, cp1, cp2, fac); break;
default:
cp[0] = cp1[0];
cp[1] = cp1[1];
Index: source/blender/makesrna/intern/rna_brush.c
===================================================================
--- source/blender/makesrna/intern/rna_brush.c (revision 51772)
+++ source/blender/makesrna/intern/rna_brush.c (working copy)
@@ -501,6 +501,22 @@
{IMB_BLEND_DARKEN, "DARKEN", 0, "Darken", "Use darken blending mode while painting"},
{IMB_BLEND_ERASE_ALPHA, "ERASE_ALPHA", 0, "Erase Alpha", "Erase alpha while painting"},
{IMB_BLEND_ADD_ALPHA, "ADD_ALPHA", 0, "Add Alpha", "Add alpha while painting"},
+ {IMB_BLEND_OVERLAY, "OVERLAY", 0, "Overlay", "Use overlay blending mode while painting"},
+ {IMB_BLEND_HARDLIGHT, "HARDLIGHT", 0, "Hard light", "Use hard light blending mode while painting"},
+ {IMB_BLEND_COLORBURN, "COLORBURN", 0, "Color burn", "Use color burn blending mode while painting"},
+ {IMB_BLEND_LINEARBURN, "LINEARBURN", 0, "Linear burn", "Use linear burn blending mode while painting"},
+ {IMB_BLEND_COLORDODGE, "COLORDODGE", 0, "Color dodge", "Use color dodge blending mode while painting"},
+ {IMB_BLEND_SCREEN, "SCREEN", 0, "Screen", "Use screen blending mode while painting"},
+ {IMB_BLEND_SOFTLIGHT, "SOFTLIGHT", 0, "Soft light", "Use softlight blending mode while painting"},
+ {IMB_BLEND_PINLIGHT, "PINLIGHT", 0, "Pin light", "Use pinlight blending mode while painting"},
+ {IMB_BLEND_VIVIDLIGHT, "VIVIDLIGHT", 0, "Vivid light", "Use vividlight blending mode while painting"},
+ {IMB_BLEND_LINEARLIGHT, "LINEARLIGHT", 0, "Linear light", "Use linearlight blending mode while painting"},
+ {IMB_BLEND_DIFFERENCE, "DIFFERENCE", 0, "Difference", "Use difference blending mode while painting"},
+ {IMB_BLEND_EXCLUSION, "EXCLUSION", 0, "Exclusion", "Use exclusion blending mode while painting"},
+ {IMB_BLEND_HUE, "HUE", 0, "Hue", "Use hue blending mode while painting"},
+ {IMB_BLEND_SATURATION, "SATURATION", 0, "Saturation", "Use saturation blending mode while painting"},
+ {IMB_BLEND_LUMINOSITY, "LUMINOSITY", 0, "Luminosity", "Use luminosity blending mode while painting"},
+ {IMB_BLEND_COLOR, "COLOR", 0, "Color", "Use color blending mode while painting"},
{0, NULL, 0, NULL, NULL}
};

File Metadata

Mime Type
text/x-diff
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
ff/ab/91f525d809fa4de490fe9fc72cb0

Event Timeline