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.
This commit is contained in:
Sergey Sharybin 2015-10-25 16:14:19 +05:00
parent 4f6b01ce1f
commit 868717e312
2 changed files with 24 additions and 3 deletions

View File

@ -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);

View File

@ -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;