diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-10-25 14:14:19 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-10-28 00:43:06 +0300 |
commit | 868717e312930f6c1eb75cf6a099de0dab035bdb (patch) | |
tree | c477f73afc94109075b4ea02cfa35dbc587c6eec | |
parent | 4f6b01ce1fa5d618b37c49170fc23fe78ff4b471 (diff) |
Support symmetrical curve mapping presets
Previously curve mapping was always setting to only a single slope which then
was symmetrizied by a tools (such as brush or compositing).
With this change it's possible to set curve to symmetrical slopes as a part
of preset.
-rw-r--r-- | source/blender/blenkernel/BKE_colortools.h | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/colortools.c | 19 |
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; |