static void gradient_render_pixel (gdouble x, gdouble y, GimpRGB *color, gpointer render_data) { RenderBlendData *rbd = render_data; gdouble factor; /* Calculate blending factor */ switch (rbd->gradient_type) { case GIMP_GRADIENT_LINEAR: factor = gradient_calc_linear_factor (rbd->dist, rbd->vec, rbd->offset, x - rbd->sx, y - rbd->sy); break; case GIMP_GRADIENT_BILINEAR: factor = gradient_calc_bilinear_factor (rbd->dist, rbd->vec, rbd->offset, x - rbd->sx, y - rbd->sy); break; case GIMP_GRADIENT_RADIAL: factor = gradient_calc_radial_factor (rbd->dist, rbd->offset, x - rbd->sx, y - rbd->sy); break; case GIMP_GRADIENT_SQUARE: factor = gradient_calc_square_factor (rbd->dist, rbd->offset, x - rbd->sx, y - rbd->sy); break; case GIMP_GRADIENT_CONICAL_SYMMETRIC: factor = gradient_calc_conical_sym_factor (rbd->dist, rbd->vec, rbd->offset, x - rbd->sx, y - rbd->sy); break; case GIMP_GRADIENT_CONICAL_ASYMMETRIC: factor = gradient_calc_conical_asym_factor (rbd->dist, rbd->vec, rbd->offset, x - rbd->sx, y - rbd->sy); break; case GIMP_GRADIENT_SHAPEBURST_ANGULAR: factor = gradient_calc_shapeburst_angular_factor (rbd->dist_buffer, x, y); break; case GIMP_GRADIENT_SHAPEBURST_SPHERICAL: factor = gradient_calc_shapeburst_spherical_factor (rbd->dist_buffer, x, y); break; case GIMP_GRADIENT_SHAPEBURST_DIMPLED: factor = gradient_calc_shapeburst_dimpled_factor (rbd->dist_buffer, x, y); break; case GIMP_GRADIENT_SPIRAL_CLOCKWISE: factor = gradient_calc_spiral_factor (rbd->dist, rbd->vec, rbd->offset, x - rbd->sx, y - rbd->sy, TRUE); break; case GIMP_GRADIENT_SPIRAL_ANTICLOCKWISE: factor = gradient_calc_spiral_factor (rbd->dist, rbd->vec, rbd->offset, x - rbd->sx, y - rbd->sy, FALSE); break; default: g_assert_not_reached (); return; } /* Adjust for repeat */ switch (rbd->repeat) { case GIMP_REPEAT_NONE: factor = CLAMP (factor, 0.0, 1.0); break; case GIMP_REPEAT_SAWTOOTH: factor = factor - floor (factor); break; case GIMP_REPEAT_TRIANGULAR: { guint ifactor; if (factor < 0.0) factor = -factor; ifactor = (guint) factor; factor = factor - floor (factor); if (ifactor & 1) factor = 1.0 - factor; } break; } /* Blend the colors */ if (rbd->blend_mode == GIMP_CUSTOM_MODE) { #ifdef USE_GRADIENT_CACHE *color = rbd->gradient_cache[(gint) (factor * (rbd->gradient_cache_size - 1))]; #else gimp_gradient_get_color_at (rbd->gradient, rbd->context, NULL, factor, rbd->reverse, color); #endif } else { /* Blend values */ if (rbd->reverse) factor = 1.0 - factor; color->r = rbd->fg.r + (rbd->bg.r - rbd->fg.r) * factor; color->g = rbd->fg.g + (rbd->bg.g - rbd->fg.g) * factor; color->b = rbd->fg.b + (rbd->bg.b - rbd->fg.b) * factor; color->a = rbd->fg.a + (rbd->bg.a - rbd->fg.a) * factor; if (rbd->blend_mode == GIMP_FG_BG_HSV_MODE) { GimpHSV hsv = *((GimpHSV *) color); gimp_hsv_to_rgb (&hsv, color); } } }
static void gradient_render_pixel (gdouble x, gdouble y, GimpRGB *color, gpointer render_data) { RenderBlendData *rbd = render_data; gdouble factor; /* Calculate blending factor */ switch (rbd->gradient_type) { case GIMP_GRADIENT_LINEAR: factor = gradient_calc_linear_factor (rbd->dist, rbd->vec, rbd->offset, x - rbd->sx, y - rbd->sy); break; case GIMP_GRADIENT_BILINEAR: factor = gradient_calc_bilinear_factor (rbd->dist, rbd->vec, rbd->offset, x - rbd->sx, y - rbd->sy); break; case GIMP_GRADIENT_RADIAL: factor = gradient_calc_radial_factor (rbd->dist, rbd->offset, x - rbd->sx, y - rbd->sy); break; case GIMP_GRADIENT_SQUARE: factor = gradient_calc_square_factor (rbd->dist, rbd->offset, x - rbd->sx, y - rbd->sy); break; case GIMP_GRADIENT_CONICAL_SYMMETRIC: factor = gradient_calc_conical_sym_factor (rbd->dist, rbd->vec, rbd->offset, x - rbd->sx, y - rbd->sy); break; case GIMP_GRADIENT_CONICAL_ASYMMETRIC: factor = gradient_calc_conical_asym_factor (rbd->dist, rbd->vec, rbd->offset, x - rbd->sx, y - rbd->sy); break; case GIMP_GRADIENT_SHAPEBURST_ANGULAR: factor = gradient_calc_shapeburst_angular_factor (rbd->dist_buffer, x, y); break; case GIMP_GRADIENT_SHAPEBURST_SPHERICAL: factor = gradient_calc_shapeburst_spherical_factor (rbd->dist_buffer, x, y); break; case GIMP_GRADIENT_SHAPEBURST_DIMPLED: factor = gradient_calc_shapeburst_dimpled_factor (rbd->dist_buffer, x, y); break; case GIMP_GRADIENT_SPIRAL_CLOCKWISE: factor = gradient_calc_spiral_factor (rbd->dist, rbd->vec, rbd->offset, x - rbd->sx, y - rbd->sy, TRUE); break; case GIMP_GRADIENT_SPIRAL_ANTICLOCKWISE: factor = gradient_calc_spiral_factor (rbd->dist, rbd->vec, rbd->offset, x - rbd->sx, y - rbd->sy, FALSE); break; default: g_assert_not_reached (); return; } /* Adjust for repeat */ switch (rbd->repeat) { case GIMP_REPEAT_TRUNCATE: break; case GIMP_REPEAT_NONE: factor = CLAMP (factor, 0.0, 1.0); break; case GIMP_REPEAT_SAWTOOTH: factor = factor - floor (factor); break; case GIMP_REPEAT_TRIANGULAR: { guint ifactor; if (factor < 0.0) factor = -factor; ifactor = (guint) factor; factor = factor - floor (factor); if (ifactor & 1) factor = 1.0 - factor; } break; } /* Blend the colors */ if (factor < 0.0 || factor > 1.0) { color->r = color->g = color->b = 0; color->a = GIMP_OPACITY_TRANSPARENT; } else { #ifdef USE_GRADIENT_CACHE *color = rbd->gradient_cache[(gint) (factor * (rbd->gradient_cache_size - 1))]; #else gimp_gradient_get_color_at (rbd->gradient, rbd->context, NULL, factor, rbd->reverse, color); #endif } }