Page Menu
Home
Search
Configure Global Search
Log In
Files
F21701
texturepaintblendmodes_withfloat_v2.patch
Public
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Authored By
Fredrik Hansson (fredrikh)
Nov 13 2013, 4:38 PM
Size
23 KB
Subscribers
None
texturepaintblendmodes_withfloat_v2.patch
View Options
Index: source/blender/imbuf/IMB_imbuf.h
===================================================================
--- source/blender/imbuf/IMB_imbuf.h (revision 51813)
+++ 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 51813)
+++ source/blender/imbuf/intern/rectop.c (working copy)
@@ -121,6 +121,833 @@
}
}
+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_overlay_float(float cp[3], const float cp1[3], const float cp2[3], const float fac)
+{
+ float temp;
+ float mfac=1.0f-fac;
+
+ if(cp1[0] > 0.5f)
+ temp=1-(1-2*(cp1[0]-0.5f))*(1-cp2[0]);
+ else
+ temp=2*cp1[0]*cp2[0];
+ temp=temp*fac+cp1[0]*mfac;
+ if(temp<1.0f)
+ cp[0]=temp;
+ else
+ cp[0]=1.0f;
+
+
+ if(cp1[1] > 0.5f)
+ temp=1.0f-(1.0f-2.0f*(cp1[1]-0.5f))*(1.0f-cp2[1]);
+ else
+ temp=2.0f*cp1[1]*cp2[1];
+ temp=temp*fac+cp1[1]*mfac;
+ if(temp<1.0f)
+ cp[1]=temp;
+ else
+ cp[1]=1.0f;
+
+ if(cp1[2] > 0.5f)
+ temp=1-(1.0f-2.0f*(cp1[2]-0.5f))*(1.0f-cp2[2]);
+ else
+ temp=2.0f*cp1[2]*cp2[2];
+ temp=temp*fac+cp1[2]*mfac;
+ if(temp<1.0f)
+ cp[2]=temp;
+ else
+ cp[2]=1.0f;
+}
+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_hardlight_float(float cp[3], const float cp1[3], const float cp2[3], const float fac)
+{
+ float temp;
+ float mfac=1.0f-fac;
+ if(cp2[0] > 0.5f)
+ temp=1-((1.0f-2.0f*(cp2[0]-0.5f))*(1.0f-cp1[0]));
+ else
+ temp=2.0f*cp2[0]*cp1[0];
+ temp=(temp*fac+cp1[0]*mfac)/1.0f;
+ if(temp<1.0f)cp[0]=temp; else cp[0]=1.0f;
+
+ if(cp2[1] > 0.5f)
+ temp=1-((1.0f-2.0f*(cp2[1]-0.5f))*(1.0f-cp1[1]));
+ else
+ temp=2.0f*cp2[1]*cp1[1];
+ temp=(temp*fac+cp1[1]*mfac)/1.0f;
+ if(temp<1.0f)cp[1]=temp; else cp[1]=1.0f;
+
+ if(cp2[2] > 0.5f)
+ temp=1-((1.0f-2.0f*(cp2[2]-0.5f))*(1.0f-cp1[2]));
+ else
+ temp=2.0f*cp2[2]*cp1[2];
+ temp=(temp*fac+cp1[2]*mfac)/1.0f;
+ if(temp<1.0f)cp[2]=temp; else cp[2]=1.0f;
+
+
+}
+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_burn_float(float cp[3], const float cp1[3], const float cp2[3], const float fac)
+{
+ float temp;
+ float mfac=1.0f-fac;
+
+ if(cp2[0]==0.0f)
+ temp=0.0f;
+ else
+ temp=1.0f-((1.0f-cp1[0])/cp2[0]);
+ if(temp<0.0f)
+ temp=0.0f;
+ cp[0]=(temp*fac+cp1[0]*mfac);
+
+ if(cp2[1]==0.0f)
+ temp=0.0f;
+ else
+ temp=1.0f-((1.0f-cp1[1])/cp2[1]);
+ if(temp<0.0f)
+ temp=0.0f;
+ cp[1]=(temp*fac+cp1[1]*mfac);
+
+ if(cp2[2]==0.0f)
+ temp=0.0f;
+ else
+ temp=1.0f-((1.0f-cp1[2])/cp2[2]);
+ if(temp<0.0f)
+ temp=0.0f;
+ cp[2]=(temp*fac+cp1[2]*mfac);
+
+
+}
+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_linearburn_float(float cp[3], const float cp1[3], const float cp2[3], const float fac)
+{
+ float temp;
+ float mfac=1.0f-fac;
+
+ temp=cp1[0]+cp2[0]-1.0f;
+ if(temp<0)temp=0;
+ cp[0]=(temp*fac+cp1[0]*mfac);
+
+ temp=cp1[1]+cp2[1]-1.0f;
+ if(temp<0)temp=0;
+ cp[1]=(temp*fac+cp1[1]*mfac);
+
+ temp=cp1[2]+cp2[2]-1.0f;
+ if(temp<0)temp=0;
+ cp[2]=(temp*fac+cp1[2]*mfac);
+}
+
+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_dodge_float(float cp[3], const float cp1[3], const float cp2[3], const float fac)
+{
+ float temp;
+ float mfac=1.0f-fac;
+
+ if(cp2[0]>=1.0f)temp=1.0f;
+ else temp=(cp1[0])/(1.0f-cp2[0]);
+ if(temp>1.0f)temp=1.0f;
+ cp[0]=(temp*fac+cp1[0]*mfac);
+
+ if(cp2[1]>=1.0f)temp=1.0f;
+ else temp=(cp1[1])/(1.0f-cp2[1]);
+ if(temp>1.0f)temp=1.0f;
+ cp[1]=(temp*fac+cp1[1]*mfac);
+
+ if(cp2[2]>=1.0f)temp=1.0f;
+ else temp=(cp1[2])/(1.0f-cp2[2]);
+ if(temp>1.0f)temp=1.0f;
+ cp[2]=(temp*fac+cp1[2]*mfac);
+
+}
+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_screen_float(float cp[3], const float cp1[3], const float cp2[3], const float fac)
+{
+ float temp;
+ float mfac=1.0f-fac;
+
+ temp=1.0f-((1.0f-cp1[0])*(1.0f-cp2[0]));
+ if(temp<0)temp=0;
+ cp[0]=(temp*fac+cp1[0]*mfac);
+
+ temp=1.0f-((1.0f-cp1[1])*(1.0f-cp2[1]));
+ if(temp<0)temp=0;
+ cp[1]=(temp*fac+cp1[1]*mfac);
+
+ temp=1.0f-((1.0f-cp1[2])*(1.0f-cp2[2]));
+ if(temp<0)temp=0;
+ cp[2]=(temp*fac+cp1[2]*mfac);
+}
+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_softlight_float(float cp[3], const float cp1[3], const float cp2[3], const float fac)
+{
+ float temp;
+ float mfac=1.0f-fac;
+
+ temp=(((cp1[0] < 0.5f) ? ((cp2[0]+0.5f) * (cp1[0])):(1.0f - ((1.0f-((cp2[0] ) + 0.5f))*(1.0f-cp1[0])))));
+ cp[0]=(temp*fac+cp1[0]*mfac);
+
+ temp=(((cp1[1] < 0.5f) ? ((cp2[1]+0.5f) * (cp1[1])):(1.0f - ((1.0f-((cp2[1] ) + 0.5f))*(1.0f-cp1[1])))));
+ cp[1]=(temp*fac+cp1[1]*mfac);
+
+ temp=(((cp1[2] < 0.5f) ? ((cp2[2]+0.5f) * (cp1[2])):(1.0f - ((1.0f-((cp2[2] ) + 0.5f))*(1.0f-cp1[2])))));
+ cp[2]=(temp*fac+cp1[2]*mfac);
+}
+
+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_pinlight_float(float cp[3], const float cp1[3], const float cp2[3], const float fac)
+{
+ float temp;
+ float mfac=1.0f-fac;
+
+ if(cp2[0] > 0.5f) {
+ temp=2*(cp2[0]-0.5f);
+ 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);
+
+
+ if(cp2[1] > 0.5f) {
+ temp=2*(cp2[1]-0.5f);
+ 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);
+
+
+ if(cp2[2] > 0.5f){
+ temp=2*(cp2[2]-0.5f);
+ 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);
+}
+
+
+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_linearlight_float(float cp[3], const float cp1[3], const float cp2[3], const float fac)
+{
+ float temp;
+ float mfac=1.0f-fac;
+
+ if(cp2[0] > 0.5f) {
+ temp=cp1[0]+2*(cp2[0]-0.5f);
+ if(temp>1.0f)
+ temp=1.0f;
+ }
+ else {
+ temp=cp1[0]+2*cp2[0]-1.0f;
+ if(temp<0)temp=0;
+ }
+ cp[0]=(temp*fac+cp1[0]*mfac);
+
+ if(cp2[1] > 0.5f) {
+ temp=cp1[1]+2*(cp2[1]-0.5f);
+ if(temp>1.0f)
+ temp=1.0f;
+ }
+ else {
+ temp=cp1[1]+2*cp2[1]-1.0f;
+ if(temp<0)temp=0;
+ }
+ cp[1]=(temp*fac+cp1[1]*mfac);
+
+ if(cp2[2] > 0.5f) {
+ temp=cp1[2]+2*(cp2[2]-0.5f);
+ if(temp>1.0f)
+ temp=1.0f;
+ }
+ else {
+ temp=cp1[2]+2*cp2[2]-1.0f;
+ if(temp<0)temp=0;
+ }
+ cp[2]=(temp*fac+cp1[2]*mfac);
+}
+
+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_vividlight_float(float cp[3], const float cp1[3], const float cp2[3], const float fac)
+{
+ float temp;
+ float mfac=1.0f-fac;
+
+ if(cp2[0]==1.0f)
+ temp=1.0f;
+ else if(cp2[0]==0)
+ temp=0;
+ else if(cp2[0] > 0.5f) {
+ temp=((cp1[0])*1.0f)/(2*(1.0f-cp2[0]));
+ if(temp>1.0f)temp=1.0f;
+ }
+ else{
+ temp=1.0f-((1.0f-cp1[0])*1.0f/(2*cp2[0]));
+ if(temp<0)temp=0;
+ }
+
+ cp[0]=(temp*fac+cp1[0]*mfac);
+
+ if(cp2[1]==1.0f)
+ temp=1.0f;
+ else if(cp2[1]==0)
+ temp=0;
+ else if(cp2[1] > 0.5f) {
+ temp=((cp1[1])*1.0f)/(2*(1.0f-cp2[1]));
+ if(temp>1.0f)temp=1.0f;
+ }
+ else{
+ temp=1.0f-((1.0f-cp1[1])*1.0f/(2*cp2[1]));
+ if(temp<0)temp=0;
+ }
+
+ cp[1]=(temp*fac+cp1[1]*mfac);
+
+ if(cp2[2]==1.0f)
+ temp=1.0f;
+ else if(cp2[2]==0)
+ temp=0;
+ else if(cp2[2] > 0.5f) {
+ temp=((cp1[2])*1.0f)/(2*(1.0f-cp2[2]));
+ if(temp>1.0f)temp=1.0f;
+ }
+ else{
+ temp=1.0f-((1.0f-cp1[2])*1.0f/(2*cp2[2]));
+ if(temp<0)temp=0;
+ }
+
+ cp[2]=(temp*fac+cp1[2]*mfac);
+
+}
+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_difference_float(float cp[3], const float cp1[3], const float cp2[3], const float fac)
+{
+ float temp;
+ float mfac=1.0f-fac;
+ temp=cp1[0]-cp2[0];
+ if(temp<0)temp=-temp;
+ cp[0]=(temp*fac+cp1[0]*mfac);
+
+ temp=cp1[1]-cp2[1];
+ if(temp<0)temp=-temp;
+ cp[1]=(temp*fac+cp1[1]*mfac);
+
+ temp=cp1[2]-cp2[2];
+ if(temp<0)temp=-temp;
+ cp[2]=(temp*fac+cp1[2]*mfac);
+
+
+}
+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;
+
+
+}static void blend_color_exclusion_float(float cp[3], const float cp1[3], const float cp2[3], const float fac)
+{
+ float temp;
+ float mfac=1.0f-fac;
+ temp=0.5f-((2*(cp1[0]-0.5f)*(cp2[0]-0.5f)));
+ cp[0]=(temp*fac+cp1[0]*mfac);
+
+ temp=0.5f-((2*(cp1[1]-0.5f)*(cp2[1]-0.5f)));
+ cp[1]=(temp*fac+cp1[1]*mfac);
+
+ temp=0.5f-((2*(cp1[2]-0.5f)*(cp2[2]-0.5f)));
+ cp[2]=(temp*fac+cp1[2]*mfac);
+
+
+}
+
+
+
+static void blend_color_color(char *cp, char *cp1, char *cp2, int fac)
+{
+ int mfac=255-fac;
+ float h1,s1,v1;
+ float h2,s2,v2;
+ float r,g,b;
+ rgb_to_hsv(cp1[0]/255.0f,cp1[1]/255.0f,cp1[2]/255.0f,&h1,&s1,&v1);
+ rgb_to_hsv(cp2[0]/255.0f,cp2[1]/255.0f,cp2[2]/255.0f,&h2,&s2,&v2);
+
+
+ h1=h2;
+ s1=s2;
+
+ hsv_to_rgb(h1,s1,v1,&r,&g,&b);
+
+ cp[0]=((int)(r*255.0f)*fac+cp1[0]*mfac)/255;
+ cp[1]=((int)(g*255.0f)*fac+cp1[1]*mfac)/255;
+ cp[2]=((int)(b*255.0f)*fac+cp1[2]*mfac)/255;
+}
+
+static void blend_color_color_float(float cp[3], const float cp1[3], const float cp2[3], const float fac)
+{
+ float mfac=1.0f-fac;
+ float h1,s1,v1;
+ float h2,s2,v2;
+ float r,g,b;
+ rgb_to_hsv(cp1[0],cp1[1],cp1[2],&h1,&s1,&v1);
+ rgb_to_hsv(cp2[0],cp2[1],cp2[2],&h2,&s2,&v2);
+
+
+ h1=h2;
+ s1=s2;
+
+ hsv_to_rgb(h1,s1,v1,&r,&g,&b);
+
+ cp[0]=(r*fac+cp1[0]*mfac);
+ cp[1]=(g*fac+cp1[1]*mfac);
+ cp[2]=(b*fac+cp1[2]*mfac);
+}
+
+static void blend_color_hue(char *cp, char *cp1, char *cp2, int fac)
+{
+ int mfac=255-fac;
+ float h1,s1,v1;
+ float h2,s2,v2;
+ float r,g,b;
+ rgb_to_hsv(cp1[0]/255.0f,cp1[1]/255.0f,cp1[2]/255.0f,&h1,&s1,&v1);
+ rgb_to_hsv(cp2[0]/255.0f,cp2[1]/255.0f,cp2[2]/255.0f,&h2,&s2,&v2);
+
+
+ h1=h2;
+
+ hsv_to_rgb(h1,s1,v1,&r,&g,&b);
+
+ cp[0]=((int)(r*255.0f)*fac+cp1[0]*mfac)/255;
+ cp[1]=((int)(g*255.0f)*fac+cp1[1]*mfac)/255;
+ cp[2]=((int)(b*255.0f)*fac+cp1[2]*mfac)/255;
+
+
+}
+
+static void blend_color_hue_float(float cp[3], const float cp1[3], const float cp2[3], const float fac)
+{
+ float mfac=1.0f-fac;
+ float h1,s1,v1;
+ float h2,s2,v2;
+ float r,g,b;
+ rgb_to_hsv(cp1[0],cp1[1],cp1[2],&h1,&s1,&v1);
+ rgb_to_hsv(cp2[0],cp2[1],cp2[2],&h2,&s2,&v2);
+
+
+ h1=h2;
+
+ hsv_to_rgb(h1,s1,v1,&r,&g,&b);
+
+ cp[0]=(r*fac+cp1[0]*mfac);
+ cp[1]=(g*fac+cp1[1]*mfac);
+ cp[2]=(b*fac+cp1[2]*mfac);
+
+}
+
+static void blend_color_saturation(char *cp, char *cp1, char *cp2, int fac)
+{
+ int mfac=255-fac;
+ float h1,s1,v1;
+ float h2,s2,v2;
+ float r,g,b;
+ rgb_to_hsv(cp1[0]/255.0f,cp1[1]/255.0f,cp1[2]/255.0f,&h1,&s1,&v1);
+ rgb_to_hsv(cp2[0]/255.0f,cp2[1]/255.0f,cp2[2]/255.0f,&h2,&s2,&v2);
+
+ if(s1>0.0005) // don't add any saturation to a completly black and white image
+ s1=s2;
+
+ hsv_to_rgb(h1,s1,v1,&r,&g,&b);
+
+ cp[0]=((int)(r*255.0f)*fac+cp1[0]*mfac)/255;
+ cp[1]=((int)(g*255.0f)*fac+cp1[1]*mfac)/255;
+ cp[2]=((int)(b*255.0f)*fac+cp1[2]*mfac)/255;
+
+}
+
+static void blend_color_saturation_float(float cp[3], const float cp1[3], const float cp2[3], const float fac)
+{
+ float mfac=1.0f-fac;
+ float h1,s1,v1;
+ float h2,s2,v2;
+ float r,g,b;
+ rgb_to_hsv(cp1[0],cp1[1],cp1[2],&h1,&s1,&v1);
+ rgb_to_hsv(cp2[0],cp2[1],cp2[2],&h2,&s2,&v2);
+
+ if(s1>0.0005) // don't add any saturation to a completly black and white image
+ s1=s2;
+ hsv_to_rgb(h1,s1,v1,&r,&g,&b);
+
+ cp[0]=(r*fac+cp1[0]*mfac);
+ cp[1]=(g*fac+cp1[1]*mfac);
+ cp[2]=(b*fac+cp1[2]*mfac);
+
+}
+
+static void blend_color_luminosity(char *cp, char *cp1, char *cp2, int fac)
+{
+ int mfac=255-fac;
+ float h1,s1,v1;
+ float h2,s2,v2;
+ float r,g,b;
+ rgb_to_hsv(cp1[0]/255.0f,cp1[1]/255.0f,cp1[2]/255.0f,&h1,&s1,&v1);
+ rgb_to_hsv(cp2[0]/255.0f,cp2[1]/255.0f,cp2[2]/255.0f,&h2,&s2,&v2);
+
+
+ v1=v2;
+
+ hsv_to_rgb(h1,s1,v1,&r,&g,&b);
+
+ cp[0]=((int)(r*255.0f)*fac+cp1[0]*mfac)/255;
+ cp[1]=((int)(g*255.0f)*fac+cp1[1]*mfac)/255;
+ cp[2]=((int)(b*255.0f)*fac+cp1[2]*mfac)/255;
+
+
+
+}
+static void blend_color_luminosity_float(float cp[3], const float cp1[3], const float cp2[3], const float fac)
+{
+ float mfac=1.0f-fac;
+ float h1,s1,v1;
+ float h2,s2,v2;
+ float r,g,b;
+ rgb_to_hsv(cp1[0],cp1[1],cp1[2],&h1,&s1,&v1);
+ rgb_to_hsv(cp2[0],cp2[1],cp2[2],&h2,&s2,&v2);
+
+
+ v1=v2;
+ hsv_to_rgb(h1,s1,v1,&r,&g,&b);
+
+ cp[0]=(r*fac+cp1[0]*mfac);
+ cp[1]=(g*fac+cp1[1]*mfac);
+ cp[2]=(b*fac+cp1[2]*mfac);
+
+}
unsigned int IMB_blend_color(unsigned int src1, unsigned int src2, int fac, IMB_BlendMode mode)
{
unsigned int dst;
@@ -147,6 +974,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];
@@ -253,6 +1112,38 @@
blend_color_lighten_float(dst, src1, src2, fac); break;
case IMB_BLEND_DARKEN:
blend_color_darken_float(dst, src1, src2, fac); break;
+ case IMB_BLEND_OVERLAY:
+ blend_color_overlay_float(dst, src1, src2, fac); break;
+ case IMB_BLEND_HARDLIGHT:
+ blend_color_hardlight_float(dst, src1, src2, fac); break;
+ case IMB_BLEND_COLORBURN:
+ blend_color_burn_float(dst, src1, src2, fac); break;
+ case IMB_BLEND_LINEARBURN:
+ blend_color_linearburn_float(dst, src1, src2, fac); break;
+ case IMB_BLEND_COLORDODGE:
+ blend_color_dodge_float(dst, src1, src2, fac); break;
+ case IMB_BLEND_SCREEN:
+ blend_color_screen_float(dst, src1, src2, fac); break;
+ case IMB_BLEND_SOFTLIGHT:
+ blend_color_softlight_float(dst, src1, src2, fac); break;
+ case IMB_BLEND_PINLIGHT:
+ blend_color_pinlight_float(dst, src1, src2, fac); break;
+ case IMB_BLEND_LINEARLIGHT:
+ blend_color_linearlight_float(dst, src1, src2, fac); break;
+ case IMB_BLEND_VIVIDLIGHT:
+ blend_color_vividlight_float(dst, src1, src2, fac); break;
+ case IMB_BLEND_DIFFERENCE:
+ blend_color_difference_float(dst, src1, src2, fac); break;
+ case IMB_BLEND_EXCLUSION:
+ blend_color_exclusion_float(dst, src1, src2, fac); break;
+ case IMB_BLEND_COLOR:
+ blend_color_color_float(dst, src1, src2, fac); break;
+ case IMB_BLEND_HUE:
+ blend_color_hue_float(dst, src1, src2, fac); break;
+ case IMB_BLEND_SATURATION:
+ blend_color_saturation_float(dst, src1, src2, fac); break;
+ case IMB_BLEND_LUMINOSITY:
+ blend_color_luminosity_float(dst, src1, src2, fac); break;
default:
dst[0] = src1[0];
dst[1] = src1[1];
Index: source/blender/makesrna/intern/rna_brush.c
===================================================================
--- source/blender/makesrna/intern/rna_brush.c (revision 51813)
+++ 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
Details
Mime Type
text/x-diff
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
c8/7e/0148e93b99e5501d57655286b5e1
Event Timeline
Log In to Comment