579 Val = pow(1.0 - pow(1 - R, 1/Params[0]), 1/Params[0]);
580 break;
581
582 // y = (1 - (1-x)^1/g)^1/g
583 // y^g = (1 - (1-x)^1/g)
584 // 1 - y^g = (1-x)^1/g
585 // (1 - y^g)^g = 1 - x
586 // 1 - (1 - y^g)^g
587 case -108:
588 Val = 1 - pow(1 - pow(R, Params[0]), Params[0]);
589 break;
590
591 default:
592 // Unsupported parametric curve. Should never reach here
593 return 0;
594 }
595
596 return Val;
597 }
598
599 // Evaluate a segmented funtion for a single value. Return -1 if no valid segment found .
600 // If fn type is 0, perform an interpolation on the table
601 static
602 cmsFloat64Number EvalSegmentedFn(const cmsToneCurve *g, cmsFloat64Number R)
603 {
604 int i;
605
606 for (i = g ->nSegments-1; i >= 0 ; --i) {
607
608 // Check for domain
609 if ((R > g ->Segments[i].x0) && (R <= g ->Segments[i].x1)) {
610
611 // Type == 0 means segment is sampled
612 if (g ->Segments[i].Type == 0) {
613
614 cmsFloat32Number R1 = (cmsFloat32Number) (R - g ->Segments[i].x0) / (g ->Segments[i].x1 - g ->Segments[i].x0);
615 cmsFloat32Number Out;
616
617 // Setup the table (TODO: clean that)
618 g ->SegInterp[i]-> Table = g ->Segments[i].SampledPoints;
619
|
579 Val = pow(1.0 - pow(1 - R, 1/Params[0]), 1/Params[0]);
580 break;
581
582 // y = (1 - (1-x)^1/g)^1/g
583 // y^g = (1 - (1-x)^1/g)
584 // 1 - y^g = (1-x)^1/g
585 // (1 - y^g)^g = 1 - x
586 // 1 - (1 - y^g)^g
587 case -108:
588 Val = 1 - pow(1 - pow(R, Params[0]), Params[0]);
589 break;
590
591 default:
592 // Unsupported parametric curve. Should never reach here
593 return 0;
594 }
595
596 return Val;
597 }
598
599 // Evaluate a segmented function for a single value. Return -1 if no valid segment found .
600 // If fn type is 0, perform an interpolation on the table
601 static
602 cmsFloat64Number EvalSegmentedFn(const cmsToneCurve *g, cmsFloat64Number R)
603 {
604 int i;
605
606 for (i = g ->nSegments-1; i >= 0 ; --i) {
607
608 // Check for domain
609 if ((R > g ->Segments[i].x0) && (R <= g ->Segments[i].x1)) {
610
611 // Type == 0 means segment is sampled
612 if (g ->Segments[i].Type == 0) {
613
614 cmsFloat32Number R1 = (cmsFloat32Number) (R - g ->Segments[i].x0) / (g ->Segments[i].x1 - g ->Segments[i].x0);
615 cmsFloat32Number Out;
616
617 // Setup the table (TODO: clean that)
618 g ->SegInterp[i]-> Table = g ->Segments[i].SampledPoints;
619
|