Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/BKE_colortools.h8
-rw-r--r--source/blender/blenkernel/intern/colortools.c19
2 files changed, 24 insertions, 3 deletions
diff --git a/source/blender/blenkernel/BKE_colortools.h b/source/blender/blenkernel/BKE_colortools.h
index 74a327c3808..b88972b74e1 100644
--- a/source/blender/blenkernel/BKE_colortools.h
+++ b/source/blender/blenkernel/BKE_colortools.h
@@ -51,8 +51,12 @@ struct CurveMapping *curvemapping_copy(struct CurveMapping *cumap);
void curvemapping_set_black_white_ex(const float black[3], const float white[3], float r_bwmul[3]);
void curvemapping_set_black_white(struct CurveMapping *cumap, const float black[3], const float white[3]);
-#define CURVEMAP_SLOPE_NEGATIVE 0
-#define CURVEMAP_SLOPE_POSITIVE 1
+enum {
+ CURVEMAP_SLOPE_NEGATIVE = 0,
+ CURVEMAP_SLOPE_POSITIVE = 1,
+ CURVEMAP_SLOPE_RAISE_FALL = 2,
+};
+
void curvemap_reset(struct CurveMap *cuma, const struct rctf *clipr, int preset, int slope);
void curvemap_remove(struct CurveMap *cuma, const short flag);
bool curvemap_remove_point(struct CurveMap *cuma, struct CurveMapPoint *cmp);
diff --git a/source/blender/blenkernel/intern/colortools.c b/source/blender/blenkernel/intern/colortools.c
index 92259235588..c6e3d1919e1 100644
--- a/source/blender/blenkernel/intern/colortools.c
+++ b/source/blender/blenkernel/intern/colortools.c
@@ -368,7 +368,24 @@ void curvemap_reset(CurveMap *cuma, const rctf *clipr, int preset, int slope)
MEM_freeN(cuma->curve);
cuma->curve = newpoints;
}
-
+ else if (slope == CURVEMAP_SLOPE_RAISE_FALL) {
+ const int num_points = cuma->totpoint * 2 - 1;
+ CurveMapPoint *new_points = MEM_mallocN(num_points * sizeof(CurveMapPoint),
+ "curve symmetric points");
+ int i;
+ for (i = 0; i < cuma->totpoint; i++) {
+ const int src_last_point = cuma->totpoint - i - 1;
+ const int dst_last_point = num_points - i - 1;
+ new_points[i] = cuma->curve[src_last_point];
+ new_points[i].x = (1.0f - cuma->curve[src_last_point].x) * 0.5f;
+ new_points[dst_last_point] = new_points[i];
+ new_points[dst_last_point].x = 0.5f + cuma->curve[src_last_point].x * 0.5f;
+ }
+ cuma->totpoint = num_points;
+ MEM_freeN(cuma->curve);
+ cuma->curve = new_points;
+ }
+
if (cuma->table) {
MEM_freeN(cuma->table);
cuma->table = NULL;