@@ -14,7 +14,45 @@ var Lib = require('../../lib');
14
14
var colorscaleDefaults = require ( '../../components/colorscale/defaults' ) ;
15
15
var attributes = require ( './attributes' ) ;
16
16
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 ) {
18
56
var i , j ;
19
57
20
58
function coerce ( attr , dflt ) {
@@ -102,13 +140,33 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
102
140
traceIn , traceOut , layout , coerce , { prefix : '' , cLetter : 'c' }
103
141
) ;
104
142
143
+ opacityscaleDefaults ( traceIn , traceOut , layout , coerce ) ;
144
+
105
145
// disable 1D transforms - currently surface does NOT support column data like heatmap does
106
146
// you can use mesh3d for this use case, but not surface
107
147
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
+ }
109
162
110
163
function mapLegacy ( traceIn , oldAttr , newAttr ) {
111
164
if ( oldAttr in traceIn && ! ( newAttr in traceIn ) ) {
112
165
traceIn [ newAttr ] = traceIn [ oldAttr ] ;
113
166
}
114
167
}
168
+
169
+ module . exports = {
170
+ supplyDefaults : supplyDefaults ,
171
+ opacityscaleDefaults : opacityscaleDefaults
172
+ } ;
0 commit comments