@@ -9,7 +9,7 @@ const isfn = o => typeof o === 'function';
99const isobj = o => o && typeof o === 'object' ;
1010const isnum = o => typeof o === 'number' ;
1111
12- const interpolate_fn = ( colors , mode = 'rgb' , overrides , pre = identity ) => {
12+ const interpolate_fn = ( colors , mode = 'rgb' , overrides , premap ) => {
1313 let def = getModeDefinition ( mode ) ;
1414 let conv = converter ( mode ) ;
1515
@@ -19,51 +19,72 @@ const interpolate_fn = (colors, mode = 'rgb', overrides, pre = identity) => {
1919
2020 colors . forEach ( val => {
2121 if ( Array . isArray ( val ) ) {
22- conv_colors . push ( pre ( conv ( val [ 0 ] ) ) ) ;
22+ conv_colors . push ( conv ( val [ 0 ] ) ) ;
2323 positions . push ( val [ 1 ] ) ;
2424 } else if ( isnum ( val ) || isfn ( val ) ) {
2525 // Color interpolation hint or easing function
2626 fns [ positions . length ] = val ;
2727 } else {
28- conv_colors . push ( pre ( conv ( val ) ) ) ;
28+ conv_colors . push ( conv ( val ) ) ;
2929 positions . push ( undefined ) ;
3030 }
3131 } ) ;
3232
3333 normalizePositions ( positions ) ;
3434
35- let zipped = def . channels . reduce ( ( res , channel ) => {
36- res [ channel ] = conv_colors . map ( color => color [ channel ] ) ;
37- return res ;
38- } , { } ) ;
39-
4035 // override the default interpolators
4136 // from the color space definition with any custom ones
42-
43- const interpolator = ( ch , values ) => {
44- let ifn , ffn ;
45- if ( isfn ( def . interpolate [ ch ] ) ) {
46- ifn = def . interpolate [ ch ] ;
47- ffn = identity ;
37+ let fixed = def . channels . reduce ( ( res , ch ) => {
38+ let ffn ;
39+ if ( isobj ( overrides ) && isobj ( overrides [ ch ] ) && overrides [ ch ] . fixup ) {
40+ ffn = overrides [ ch ] . fixup ;
41+ } else if ( isobj ( def . interpolate [ ch ] ) && def . interpolate [ ch ] . fixup ) {
42+ ffn = def . interpolate [ ch ] . fixup ;
4843 } else {
49- ifn = def . interpolate [ ch ] . use ;
50- ffn = def . interpolate [ ch ] . fixup || identity ;
44+ ffn = identity ;
5145 }
46+ res [ ch ] = ffn ( conv_colors . map ( color => color [ ch ] ) ) ;
47+ return res ;
48+ } , { } ) ;
49+
50+ if ( premap ) {
51+ let ccolors = conv_colors . map ( ( color , idx ) => {
52+ return def . channels . reduce (
53+ ( c , ch ) => {
54+ c [ ch ] = fixed [ ch ] [ idx ] ;
55+ return c ;
56+ } ,
57+ { mode }
58+ ) ;
59+ } ) ;
60+ fixed = def . channels . reduce ( ( res , ch ) => {
61+ res [ ch ] = ccolors . map ( c => {
62+ let v = premap ( c [ ch ] , ch , c , mode ) ;
63+ return isNaN ( v ) ? undefined : v ;
64+ } ) ;
65+ return res ;
66+ } , { } ) ;
67+ }
68+
69+ let interpolators = def . channels . reduce ( ( res , ch ) => {
70+ let ifn ;
5271 if ( isfn ( overrides ) ) {
5372 ifn = overrides ;
54- } else if ( isobj ( overrides ) ) {
55- if ( isfn ( overrides [ ch ] ) ) {
56- ifn = overrides [ ch ] ;
57- } else if ( isobj ( overrides [ ch ] ) ) {
58- ifn = isfn ( overrides [ ch ] . use ) ? overrides [ ch ] . use : ifn ;
59- ffn = isfn ( overrides [ ch ] . fixup ) ? overrides [ ch ] . fixup : ffn ;
60- }
73+ } else if ( isobj ( overrides ) && isfn ( overrides [ ch ] ) ) {
74+ ifn = overrides [ ch ] ;
75+ } else if (
76+ isobj ( overrides ) &&
77+ isobj ( overrides [ ch ] ) &&
78+ overrides [ ch ] . use
79+ ) {
80+ ifn = overrides [ ch ] . use ;
81+ } else if ( isfn ( def . interpolate [ ch ] ) ) {
82+ ifn = def . interpolate [ ch ] ;
83+ } else if ( isobj ( def . interpolate [ ch ] ) ) {
84+ ifn = def . interpolate [ ch ] . use ;
6185 }
62- return ifn ( ffn ( values ) ) ;
63- } ;
6486
65- let interpolators = def . channels . reduce ( ( res , ch ) => {
66- res [ ch ] = interpolator ( ch , zipped [ ch ] ) ;
87+ res [ ch ] = ifn ( fixed [ ch ] ) ;
6788 return res ;
6889 } , { } ) ;
6990
@@ -124,10 +145,9 @@ const interpolateWith = (premap, postmap) => (
124145 mode = 'rgb' ,
125146 overrides
126147) => {
127- let pre = premap ? mapper ( premap , mode ) : undefined ;
128- let post = postmap ? mapper ( postmap , mode ) : identity ;
129- let it = interpolate_fn ( colors , mode , overrides , pre ) ;
130- return t => post ( it ( t ) ) ;
148+ let post = postmap ? mapper ( postmap , mode ) : undefined ;
149+ let it = interpolate_fn ( colors , mode , overrides , premap ) ;
150+ return post ? t => post ( it ( t ) ) : it ;
131151} ;
132152
133153const interpolateWithPremultipliedAlpha = interpolateWith (
0 commit comments