Exemplo n.º 1
0
void IMB_blend_color_float(float dst[4], float src1[4], float src2[4], IMB_BlendMode mode)
{
	switch (mode) {
		case IMB_BLEND_MIX:
			blend_color_mix_float(dst, src1, src2); break;
		case IMB_BLEND_ADD:
			blend_color_add_float(dst, src1, src2); break;
		case IMB_BLEND_SUB:
			blend_color_sub_float(dst, src1, src2); break;
		case IMB_BLEND_MUL:
			blend_color_mul_float(dst, src1, src2); break;
		case IMB_BLEND_LIGHTEN:
			blend_color_lighten_float(dst, src1, src2); break;
		case IMB_BLEND_DARKEN:
			blend_color_darken_float(dst, src1, src2); break;
		case IMB_BLEND_ERASE_ALPHA:
			blend_color_erase_alpha_float(dst, src1, src2); break;
		case IMB_BLEND_ADD_ALPHA:
			blend_color_add_alpha_float(dst, src1, src2); break;
		default:
			dst[0] = src1[0];
			dst[1] = src1[1];
			dst[2] = src1[2];
			dst[3] = src1[3];
			break;
	}
}
Exemplo n.º 2
0
void IMB_blend_color_float(float dst[4], float src1[4], float src2[4], IMB_BlendMode mode)
{
	switch (mode) {
		case IMB_BLEND_MIX:
			blend_color_mix_float(dst, src1, src2); break;
		case IMB_BLEND_ADD:
			blend_color_add_float(dst, src1, src2); break;
		case IMB_BLEND_SUB:
			blend_color_sub_float(dst, src1, src2); break;
		case IMB_BLEND_MUL:
			blend_color_mul_float(dst, src1, src2); break;
		case IMB_BLEND_LIGHTEN:
			blend_color_lighten_float(dst, src1, src2); break;
		case IMB_BLEND_DARKEN:
			blend_color_darken_float(dst, src1, src2); break;
		case IMB_BLEND_ERASE_ALPHA:
			blend_color_erase_alpha_float(dst, src1, src2); break;
		case IMB_BLEND_ADD_ALPHA:
			blend_color_add_alpha_float(dst, src1, src2); break;
		case IMB_BLEND_OVERLAY:
			blend_color_overlay_float(dst, src1, src2); break;
		case IMB_BLEND_HARDLIGHT:
			blend_color_hardlight_float(dst, src1, src2); break;
		case IMB_BLEND_COLORBURN:
			blend_color_burn_float(dst, src1, src2); break;
		case IMB_BLEND_LINEARBURN:
			blend_color_linearburn_float(dst, src1, src2); break;
		case IMB_BLEND_COLORDODGE:
			blend_color_dodge_float(dst, src1, src2); break;
		case IMB_BLEND_SCREEN:
			blend_color_screen_float(dst, src1, src2); break;
		case IMB_BLEND_SOFTLIGHT:
			blend_color_softlight_float(dst, src1, src2); break;
		case IMB_BLEND_PINLIGHT:
			blend_color_pinlight_float(dst, src1, src2); break;
		case IMB_BLEND_LINEARLIGHT:
			blend_color_linearlight_float(dst, src1, src2); break;
		case IMB_BLEND_VIVIDLIGHT:
			blend_color_vividlight_float(dst, src1, src2); break;
		case IMB_BLEND_DIFFERENCE:
			blend_color_difference_float(dst, src1, src2); break;
		case IMB_BLEND_EXCLUSION:
			blend_color_exclusion_float(dst, src1, src2); break;
		case IMB_BLEND_COLOR:
			blend_color_color_float(dst, src1, src2); break;
		case IMB_BLEND_HUE:
			blend_color_hue_float(dst, src1, src2); break;
		case IMB_BLEND_SATURATION:
			blend_color_saturation_float(dst, src1, src2); break;
		case IMB_BLEND_LUMINOSITY:
			blend_color_luminosity_float(dst, src1, src2); break;
		default:
			dst[0] = src1[0];
			dst[1] = src1[1];
			dst[2] = src1[2];
			dst[3] = src1[3];
			break;
	}
}
Exemplo n.º 3
0
void IMB_blend_color_float(float *dst, float *src1, float *src2, float fac, IMB_BlendMode mode)
{
    if (fac==0) {
        dst[0]= src1[0];
        dst[1]= src1[1];
        dst[2]= src1[2];
        dst[3]= src1[3];
        return;
    }

    switch (mode) {
    case IMB_BLEND_MIX:
        blend_color_mix_float(dst, src1, src2, fac);
        break;
    case IMB_BLEND_ADD:
        blend_color_add_float(dst, src1, src2, fac);
        break;
    case IMB_BLEND_SUB:
        blend_color_sub_float(dst, src1, src2, fac);
        break;
    case IMB_BLEND_MUL:
        blend_color_mul_float(dst, src1, src2, fac);
        break;
    case IMB_BLEND_LIGHTEN:
        blend_color_lighten_float(dst, src1, src2, fac);
        break;
    case IMB_BLEND_DARKEN:
        blend_color_darken_float(dst, src1, src2, fac);
        break;
    default:
        dst[0]= src1[0];
        dst[1]= src1[1];
        dst[2]= src1[2];
    }

    if (mode == IMB_BLEND_ERASE_ALPHA) {
        dst[3]= (src1[3] - fac*src2[3]);
        if (dst[3] < 0.0f) dst[3] = 0.0f;
    }
    else { /* this does ADD_ALPHA also */
        dst[3]= (src1[3] + fac*src2[3]);
        if (dst[3] > 1.0f) dst[3] = 1.0f;
    }
}
Exemplo n.º 4
0
static void paint_2d_lift_soften(ImagePaintState *s, ImBuf *ibuf, ImBuf *ibufb, int *pos, const short tile)
{
	bool sharpen = (s->painter->cache.invert ^ ((s->brush->flag & BRUSH_DIR_IN) != 0));
	float threshold = s->brush->sharp_threshold;
	int x, y, xi, yi, xo, yo, xk, yk;
	float count;
	int out_off[2], in_off[2], dim[2];
	int diff_pos[2];
	float outrgb[4];
	float rgba[4];
	BlurKernel *kernel = s->blurkernel;

	dim[0] = ibufb->x;
	dim[1] = ibufb->y;
	in_off[0] = pos[0];
	in_off[1] = pos[1];
	out_off[0] = out_off[1] = 0;

	if (!tile) {
		IMB_rectclip(ibuf, ibufb, &in_off[0], &in_off[1], &out_off[0],
		             &out_off[1], &dim[0], &dim[1]);

		if ((dim[0] == 0) || (dim[1] == 0))
			return;
	}

	/* find offset inside mask buffers to sample them */
	sub_v2_v2v2_int(diff_pos, out_off, in_off);

	for (y = 0; y < dim[1]; y++) {
		for (x = 0; x < dim[0]; x++) {
			/* get input pixel */
			xi = in_off[0] + x;
			yi = in_off[1] + y;

			count = 0.0;
			if (tile) {
				paint_2d_ibuf_tile_convert(ibuf, &xi, &yi, tile);
				if (xi < ibuf->x && xi >= 0 && yi < ibuf->y && yi >= 0)
					paint_2d_ibuf_rgb_get(ibuf, xi, yi, rgba);
				else
					zero_v4(rgba);
			}
			else {
				/* coordinates have been clipped properly here, it should be safe to do this */
				paint_2d_ibuf_rgb_get(ibuf, xi, yi, rgba);
			}
			zero_v4(outrgb);

			for (yk = 0; yk < kernel->side; yk++) {
				for (xk = 0; xk < kernel->side; xk++) {
					count += paint_2d_ibuf_add_if(ibuf, xi + xk - kernel->pixel_len,
					                               yi + yk - kernel->pixel_len, outrgb, tile,
					                               kernel->wdata[xk + yk * kernel->side]);
				}
			}

			if (count > 0.0f) {
				mul_v4_fl(outrgb, 1.0f / (float)count);

				if (sharpen) {
					/* subtract blurred image from normal image gives high pass filter */
					sub_v3_v3v3(outrgb, rgba, outrgb);

					/* now rgba_ub contains the edge result, but this should be converted to luminance to avoid
					 * colored speckles appearing in final image, and also to check for threshold */
					outrgb[0] = outrgb[1] = outrgb[2] = IMB_colormanagement_get_luminance(outrgb);
					if (fabsf(outrgb[0]) > threshold) {
						float mask = BKE_brush_alpha_get(s->scene, s->brush);
						float alpha = rgba[3];
						rgba[3] = outrgb[3] = mask;

						/* add to enhance edges */
						blend_color_add_float(outrgb, rgba, outrgb);
						outrgb[3] = alpha;
					}
					else
						copy_v4_v4(outrgb, rgba);
				}
			}
			else
				copy_v4_v4(outrgb, rgba);
			/* write into brush buffer */
			xo = out_off[0] + x;
			yo = out_off[1] + y;
			paint_2d_ibuf_rgb_set(ibufb, xo, yo, 0, outrgb);
		}
	}
}