Fix T38606: C curve in the curve mapping compositing node not extrapolating correct.

The "premultiply" optimization here did not take the extrapolation into account.
This commit is contained in:
Brecht Van Lommel 2014-02-14 16:00:28 +01:00
parent e1d9308616
commit 42946c37c7
Notes: blender-bot 2023-02-14 11:12:12 +01:00
Referenced by issue #38606, "C" channel of RGB Curves node is ineffective at input values > 1.0
2 changed files with 13 additions and 0 deletions

View File

@ -637,6 +637,11 @@ void curvemapping_premultiply(CurveMapping *cumap, int restore)
MEM_freeN(cumap->cm[a].table);
cumap->cm[a].table = cumap->cm[a].premultable;
cumap->cm[a].premultable = NULL;
copy_v2_v2(cumap->cm[a].ext_in, cumap->cm[a].premul_ext_in);
copy_v2_v2(cumap->cm[a].ext_out, cumap->cm[a].premul_ext_out);
zero_v2(cumap->cm[a].premul_ext_in);
zero_v2(cumap->cm[a].premul_ext_out);
}
cumap->flag &= ~CUMA_PREMULLED;
@ -662,6 +667,11 @@ void curvemapping_premultiply(CurveMapping *cumap, int restore)
for (b = 0; b <= CM_TABLE; b++) {
cumap->cm[a].table[b].y = curvemap_evaluateF(cumap->cm + 3, cumap->cm[a].table[b].y);
}
copy_v2_v2(cumap->cm[a].premul_ext_in, cumap->cm[a].ext_in);
copy_v2_v2(cumap->cm[a].premul_ext_out, cumap->cm[a].ext_out);
mul_v2_v2(cumap->cm[a].ext_in, cumap->cm[3].ext_in);
mul_v2_v2(cumap->cm[a].ext_out, cumap->cm[3].ext_out);
}
cumap->flag |= CUMA_PREMULLED;

View File

@ -60,7 +60,10 @@ typedef struct CurveMap {
float ext_in[2], ext_out[2]; /* for extrapolated curves, the direction vector */
CurveMapPoint *curve; /* actual curve */
CurveMapPoint *table; /* display and evaluate table */
CurveMapPoint *premultable; /* for RGB curves, premulled table */
float premul_ext_in[2]; /* for RGB curves, premulled extrapolation vector */
float premul_ext_out[2];
} CurveMap;
/* cuma->flag */