@@ -14,7 +14,45 @@ var Lib = require('../../lib');
1414var  colorscaleDefaults  =  require ( '../../components/colorscale/defaults' ) ; 
1515var  attributes  =  require ( './attributes' ) ; 
1616
17- module . exports  =  function  supplyDefaults ( traceIn ,  traceOut ,  defaultColor ,  layout )  { 
17+ var  MIN  =  0.1 ;  // Note: often we don't want the data cube to be disappeared 
18+ 
19+ function  createWave ( n ,  minOpacity )  { 
20+     var  arr  =  [ ] ; 
21+     var  steps  =  32 ;  // Max: 256 
22+     for ( var  i  =  0 ;  i  <  steps ;  i ++ )  { 
23+         var  u  =  i  /  ( steps  -  1 ) ; 
24+         var  v  =  minOpacity  +  ( 1  -  minOpacity )  *  ( 1  -  Math . pow ( Math . sin ( n  *  u  *  Math . PI ) ,  2 ) ) ; 
25+         arr . push ( [ 
26+             u , 
27+             Math . max ( 1 ,  Math . min ( 0 ,  v ) ) 
28+         ] ) ; 
29+     } 
30+     return  arr ; 
31+ } 
32+ 
33+ function  isValidScaleArray ( scl )  { 
34+     var  highestVal  =  0 ; 
35+ 
36+     if ( ! Array . isArray ( scl )  ||  scl . length  <  2 )  return  false ; 
37+ 
38+     if ( ! scl [ 0 ]  ||  ! scl [ scl . length  -  1 ] )  return  false ; 
39+ 
40+     if ( + scl [ 0 ] [ 0 ]  !==  0  ||  + scl [ scl . length  -  1 ] [ 0 ]  !==  1 )  return  false ; 
41+ 
42+     for ( var  i  =  0 ;  i  <  scl . length ;  i ++ )  { 
43+         var  si  =  scl [ i ] ; 
44+ 
45+         if ( si . length  !==  2  ||  + si [ 0 ]  <  highestVal )  { 
46+             return  false ; 
47+         } 
48+ 
49+         highestVal  =  + si [ 0 ] ; 
50+     } 
51+ 
52+     return  true ; 
53+ } 
54+ 
55+ function  supplyDefaults ( traceIn ,  traceOut ,  defaultColor ,  layout )  { 
1856    var  i ,  j ; 
1957
2058    function  coerce ( attr ,  dflt )  { 
@@ -102,13 +140,33 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
102140        traceIn ,  traceOut ,  layout ,  coerce ,  { prefix : '' ,  cLetter : 'c' } 
103141    ) ; 
104142
143+     opacityscaleDefaults ( traceIn ,  traceOut ,  layout ,  coerce ) ; 
144+ 
105145    // disable 1D transforms - currently surface does NOT support column data like heatmap does 
106146    // you can use mesh3d for this use case, but not surface 
107147    traceOut . _length  =  null ; 
108- } ; 
148+ } 
149+ 
150+ function  opacityscaleDefaults ( traceIn ,  traceOut ,  layout ,  coerce )  { 
151+     var  opacityscale  =  coerce ( 'opacityscale' ) ; 
152+     if ( opacityscale  ===  'max' )  { 
153+         traceOut . opacityscale  =  [ [ 0 ,  MIN ] ,  [ 1 ,  1 ] ] ; 
154+     }  else  if ( opacityscale  ===  'min' )  { 
155+         traceOut . opacityscale  =  [ [ 0 ,  1 ] ,  [ 1 ,  MIN ] ] ; 
156+     }  else  if ( opacityscale  ===  'extremes' )  { 
157+         traceOut . opacityscale  =  createWave ( 1 ,  MIN ) ; 
158+     }  else  if ( ! isValidScaleArray ( opacityscale ) )  { 
159+         traceOut . opacityscale  =  undefined ; 
160+     } 
161+ } 
109162
110163function  mapLegacy ( traceIn ,  oldAttr ,  newAttr )  { 
111164    if ( oldAttr  in  traceIn  &&  ! ( newAttr  in  traceIn ) )  { 
112165        traceIn [ newAttr ]  =  traceIn [ oldAttr ] ; 
113166    } 
114167} 
168+ 
169+ module . exports  =  { 
170+     supplyDefaults : supplyDefaults , 
171+     opacityscaleDefaults : opacityscaleDefaults 
172+ } ; 
0 commit comments