static void blend_color_lighten(char *cp, char *cp1, char *cp2, int fac) { /* See if are lighter, if so mix, else dont do anything. if the paint col is darker then the original, then ignore */ if (cp1[0]+cp1[1]+cp1[2] > cp2[0]+cp2[1]+cp2[2]) { cp[0]= cp1[0]; cp[1]= cp1[1]; cp[2]= cp1[2]; } else blend_color_mix(cp, cp1, cp2, fac); }
unsigned int IMB_blend_color(unsigned int src1, unsigned int src2, int fac, IMB_BlendMode mode) { unsigned int dst; int temp; char *cp, *cp1, *cp2; if (fac==0) return src1; cp = (char*)&dst; cp1 = (char*)&src1; cp2 = (char*)&src2; switch (mode) { case IMB_BLEND_MIX: blend_color_mix(cp, cp1, cp2, fac); break; case IMB_BLEND_ADD: blend_color_add(cp, cp1, cp2, fac); break; case IMB_BLEND_SUB: blend_color_sub(cp, cp1, cp2, fac); break; case IMB_BLEND_MUL: blend_color_mul(cp, cp1, cp2, fac); break; case IMB_BLEND_LIGHTEN: blend_color_lighten(cp, cp1, cp2, fac); break; case IMB_BLEND_DARKEN: blend_color_darken(cp, cp1, cp2, fac); break; default: cp[0]= cp1[0]; cp[1]= cp1[1]; cp[2]= cp1[2]; } if (mode == IMB_BLEND_ERASE_ALPHA) { temp= (cp1[3] - fac*cp2[3]/255); cp[3]= (temp < 0)? 0: temp; } else { /* this does ADD_ALPHA also */ temp= (cp1[3] + fac*cp2[3]/255); cp[3]= (temp > 255)? 255: temp; } return dst; }