Lines Matching refs:curve
64 static float eval_curve(const skcms_Curve* curve, float x) { in eval_curve() argument
65 if (curve->table_entries == 0) { in eval_curve()
66 return skcms_TransferFunction_eval(&curve->parametric, x); in eval_curve()
69 float ix = fmaxf_(0, fminf_(x, 1)) * (curve->table_entries - 1); in eval_curve()
75 if (curve->table_8) { in eval_curve()
76 l = curve->table_8[lo] * (1/255.0f); in eval_curve()
77 h = curve->table_8[hi] * (1/255.0f); in eval_curve()
80 memcpy(&be_l, curve->table_16 + 2*lo, 2); in eval_curve()
81 memcpy(&be_h, curve->table_16 + 2*hi, 2); in eval_curve()
90 static float max_roundtrip_error(const skcms_Curve* curve, const skcms_TransferFunction* inv_tf) { in max_roundtrip_error() argument
91 uint32_t N = curve->table_entries > 256 ? curve->table_entries : 256; in max_roundtrip_error()
96 y = eval_curve(curve, x); in max_roundtrip_error()
102 bool skcms_AreApproximateInverses(const skcms_Curve* curve, const skcms_TransferFunction* inv_tf) { in skcms_AreApproximateInverses() argument
103 return max_roundtrip_error(curve, inv_tf) < (1/512.0f); in skcms_AreApproximateInverses()
281 skcms_Curve* curve, uint32_t* curve_size) { in read_curve_para() argument
303 curve->table_entries = 0; in read_curve_para()
304 curve->parametric.a = 1.0f; in read_curve_para()
305 curve->parametric.b = 0.0f; in read_curve_para()
306 curve->parametric.c = 0.0f; in read_curve_para()
307 curve->parametric.d = 0.0f; in read_curve_para()
308 curve->parametric.e = 0.0f; in read_curve_para()
309 curve->parametric.f = 0.0f; in read_curve_para()
310 curve->parametric.g = read_big_fixed(paraTag->variable); in read_curve_para()
314 curve->parametric.a = read_big_fixed(paraTag->variable + 4); in read_curve_para()
315 curve->parametric.b = read_big_fixed(paraTag->variable + 8); in read_curve_para()
316 if (curve->parametric.a == 0) { in read_curve_para()
319 curve->parametric.d = -curve->parametric.b / curve->parametric.a; in read_curve_para()
322 curve->parametric.a = read_big_fixed(paraTag->variable + 4); in read_curve_para()
323 curve->parametric.b = read_big_fixed(paraTag->variable + 8); in read_curve_para()
324 curve->parametric.e = read_big_fixed(paraTag->variable + 12); in read_curve_para()
325 if (curve->parametric.a == 0) { in read_curve_para()
328 curve->parametric.d = -curve->parametric.b / curve->parametric.a; in read_curve_para()
329 curve->parametric.f = curve->parametric.e; in read_curve_para()
332 curve->parametric.a = read_big_fixed(paraTag->variable + 4); in read_curve_para()
333 curve->parametric.b = read_big_fixed(paraTag->variable + 8); in read_curve_para()
334 curve->parametric.c = read_big_fixed(paraTag->variable + 12); in read_curve_para()
335 curve->parametric.d = read_big_fixed(paraTag->variable + 16); in read_curve_para()
338 curve->parametric.a = read_big_fixed(paraTag->variable + 4); in read_curve_para()
339 curve->parametric.b = read_big_fixed(paraTag->variable + 8); in read_curve_para()
340 curve->parametric.c = read_big_fixed(paraTag->variable + 12); in read_curve_para()
341 curve->parametric.d = read_big_fixed(paraTag->variable + 16); in read_curve_para()
342 curve->parametric.e = read_big_fixed(paraTag->variable + 20); in read_curve_para()
343 curve->parametric.f = read_big_fixed(paraTag->variable + 24); in read_curve_para()
346 return tf_is_valid(&curve->parametric); in read_curve_para()
357 skcms_Curve* curve, uint32_t* curve_size) { in read_curve_curv() argument
374 curve->table_entries = 0; in read_curve_curv()
375 curve->parametric.a = 1.0f; in read_curve_curv()
376 curve->parametric.b = 0.0f; in read_curve_curv()
377 curve->parametric.c = 0.0f; in read_curve_curv()
378 curve->parametric.d = 0.0f; in read_curve_curv()
379 curve->parametric.e = 0.0f; in read_curve_curv()
380 curve->parametric.f = 0.0f; in read_curve_curv()
383 curve->parametric.g = 1.0f; in read_curve_curv()
386 curve->parametric.g = read_big_u16(curvTag->variable) * (1.0f / 256.0f); in read_curve_curv()
389 curve->table_8 = nullptr; in read_curve_curv()
390 curve->table_16 = curvTag->variable; in read_curve_curv()
391 curve->table_entries = value_count; in read_curve_curv()
400 skcms_Curve* curve, uint32_t* curve_size) { in read_curve() argument
401 if (!buf || size < 4 || !curve) { in read_curve()
407 return read_curve_para(buf, size, curve, curve_size); in read_curve()
409 return read_curve_curv(buf, size, curve, curve_size); in read_curve()
738 static int fit_linear(const skcms_Curve* curve, int N, float tol, in fit_linear() argument
757 *f = eval_curve(curve, 0); in fit_linear()
767 float y = eval_curve(curve, x); in fit_linear()
818 skcms_Curve* curve = curves[i]; in read_a2b() local
820 if (curve && curve->table_entries && curve->table_entries <= (uint32_t)INT_MAX) { in read_a2b()
821 int N = (int)curve->table_entries; in read_a2b()
824 if (N == fit_linear(curve, N, 1.0f/(2*N), &c,&d,&f) in read_a2b()
827 curve->table_entries = 0; in read_a2b()
828 curve->table_8 = nullptr; in read_a2b()
829 curve->table_16 = nullptr; in read_a2b()
830 curve->parametric = skcms_TransferFunction{1,1,0,0,0,0,0}; in read_a2b()
1522 const skcms_Curve* curve, in rg_nonlinear() argument
1526 const float y = eval_curve(curve, x); in rg_nonlinear()
1550 static bool gauss_newton_step(const skcms_Curve* curve, in gauss_newton_step() argument
1597 float resid = rg_nonlinear(x,curve,tf,P, dfdP); in gauss_newton_step()
1632 static bool fit_nonlinear(const skcms_Curve* curve, int L, int N, skcms_TransferFunction* tf) { in fit_nonlinear() argument
1651 if (!gauss_newton_step(curve, tf, in fit_nonlinear()
1674 bool skcms_ApproximateCurve(const skcms_Curve* curve, in skcms_ApproximateCurve() argument
1677 if (!curve || !approx || !max_error) { in skcms_ApproximateCurve()
1681 if (curve->table_entries == 0) { in skcms_ApproximateCurve()
1686 if (curve->table_entries == 1 || curve->table_entries > (uint32_t)INT_MAX) { in skcms_ApproximateCurve()
1691 int N = (int)curve->table_entries; in skcms_ApproximateCurve()
1702 int L = fit_linear(curve, N, kTolerances[t], &tf.c, &tf.d); in skcms_ApproximateCurve()
1714 tf.a = (eval_curve(curve, (N-1)*dx) - in skcms_ApproximateCurve()
1715 eval_curve(curve, (N-2)*dx)) in skcms_ApproximateCurve()
1717 tf.b = eval_curve(curve, (N-2)*dx) in skcms_ApproximateCurve()
1724 float mid_y = eval_curve(curve, mid_x); in skcms_ApproximateCurve()
1733 !fit_nonlinear(curve, L,N, &tf_inv)) { in skcms_ApproximateCurve()
1754 float err = max_roundtrip_error(curve, &tf_inv); in skcms_ApproximateCurve()
1994 static OpAndArg select_curve_op(const skcms_Curve* curve, int channel) { in select_curve_op() argument
2004 if (curve->table_entries == 0) { in select_curve_op()
2005 return is_identity_tf(&curve->parametric) in select_curve_op()
2007 : OpAndArg{ ops[channel].parametric, &curve->parametric }; in select_curve_op()
2010 return OpAndArg{ ops[channel].table, curve }; in select_curve_op()