@@ -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