diff --git a/src/components/drawing/index.js b/src/components/drawing/index.js index c0d8922a457..d8f99f96535 100644 --- a/src/components/drawing/index.js +++ b/src/components/drawing/index.js @@ -217,21 +217,31 @@ drawing.symbolList = []; Object.keys(SYMBOLDEFS).forEach(function(k) { var symDef = SYMBOLDEFS[k]; - drawing.symbolList = drawing.symbolList.concat( - [symDef.n, k, symDef.n + 100, k + '-open']); - drawing.symbolNames[symDef.n] = k; - drawing.symbolFuncs[symDef.n] = symDef.f; + var n = symDef.n; + drawing.symbolList.push( + n, + k, + n + 100, + k + '-open' + ); + drawing.symbolNames[n] = k; + drawing.symbolFuncs[n] = symDef.f; + if(symDef.needLine) { - drawing.symbolNeedLines[symDef.n] = true; + drawing.symbolNeedLines[n] = true; } if(symDef.noDot) { - drawing.symbolNoDot[symDef.n] = true; + drawing.symbolNoDot[n] = true; } else { - drawing.symbolList = drawing.symbolList.concat( - [symDef.n + 200, k + '-dot', symDef.n + 300, k + '-open-dot']); + drawing.symbolList.push( + n + 200, + k + '-dot', + n + 300, + k + '-open-dot' + ); } if(symDef.noFill) { - drawing.symbolNoFill[symDef.n] = true; + drawing.symbolNoFill[n] = true; } }); @@ -253,8 +263,9 @@ drawing.symbolNumber = function(v) { v = drawing.symbolNames.indexOf(v); if(v >= 0) { v += vbase; } } - if((v % 100 >= MAXSYMBOL) || v >= 400) { return 0; } - return Math.floor(Math.max(v, 0)); + + return (v % 100 >= MAXSYMBOL || v >= 400) ? + 0 : Math.floor(Math.max(v, 0)); }; function makePointPath(symbolNumber, r) { diff --git a/src/traces/scattergl/convert.js b/src/traces/scattergl/convert.js index a0088cb696f..bed3fa3ca79 100644 --- a/src/traces/scattergl/convert.js +++ b/src/traces/scattergl/convert.js @@ -21,6 +21,7 @@ var formatColor = require('../../lib/gl_format_color').formatColor; var subTypes = require('../scatter/subtypes'); var makeBubbleSizeFn = require('../scatter/make_bubble_size_func'); +var helpers = require('./helpers'); var constants = require('./constants'); var DESELECTDIM = require('../../constants/interactions').DESELECTDIM; @@ -59,7 +60,7 @@ function convertStyle(gd, trace) { opts.markerSel = convertMarkerSelection(trace, trace.selected); opts.markerUnsel = convertMarkerSelection(trace, trace.unselected); - if(!trace.unselected && Array.isArray(trace.marker.opacity)) { + if(!trace.unselected && Lib.isArrayOrTypedArray(trace.marker.opacity)) { var mo = trace.marker.opacity; opts.markerUnsel.opacity = new Array(mo.length); for(i = 0; i < mo.length; i++) { @@ -187,15 +188,18 @@ function convertTextStyle(gd, trace) { optsOut.color = tfc; } - if(Array.isArray(tfs) || Array.isArray(tff)) { + if(Lib.isArrayOrTypedArray(tfs) || Array.isArray(tff)) { // if any textfont param is array - make render a batch optsOut.font = new Array(count); for(i = 0; i < count; i++) { var fonti = optsOut.font[i] = {}; - fonti.size = Array.isArray(tfs) ? - (isNumeric(tfs[i]) ? tfs[i] : 0) : - tfs; + fonti.size = ( + Lib.isTypedArray(tfs) ? tfs[i] : + Array.isArray(tfs) ? ( + isNumeric(tfs[i]) ? tfs[i] : 0 + ) : tfs + ); fonti.family = Array.isArray(tff) ? tff[i] : tff; } @@ -214,7 +218,7 @@ function convertMarkerStyle(trace) { var optsOut = {}; var i; - var multiSymbol = Array.isArray(optsIn.symbol); + var multiSymbol = Lib.isArrayOrTypedArray(optsIn.symbol); var multiColor = Lib.isArrayOrTypedArray(optsIn.color); var multiLineColor = Lib.isArrayOrTypedArray(optsIn.line.color); var multiOpacity = Lib.isArrayOrTypedArray(optsIn.opacity); @@ -222,7 +226,7 @@ function convertMarkerStyle(trace) { var multiLineWidth = Lib.isArrayOrTypedArray(optsIn.line.width); var isOpen; - if(!multiSymbol) isOpen = constants.OPEN_RE.test(optsIn.symbol); + if(!multiSymbol) isOpen = helpers.isOpenSymbol(optsIn.symbol); // prepare colors if(multiSymbol || multiColor || multiLineColor || multiOpacity) { @@ -253,7 +257,7 @@ function convertMarkerStyle(trace) { for(i = 0; i < count; i++) { if(multiSymbol) { var symbol = optsIn.symbol[i]; - isOpen = constants.OPEN_RE.test(symbol); + isOpen = helpers.isOpenSymbol(symbol); } if(isOpen) { borderColors[i] = colors[i].slice(); @@ -398,7 +402,7 @@ function getSymbolSdf(symbol) { var symbolNoDot = !!Drawing.symbolNoDot[symbolNumber % 100]; var symbolNoFill = !!Drawing.symbolNoFill[symbolNumber % 100]; - var isDot = constants.DOT_RE.test(symbol); + var isDot = helpers.isDotSymbol(symbol); // get symbol sdf from cache or generate it if(SYMBOL_SDF[symbol]) return SYMBOL_SDF[symbol]; diff --git a/src/traces/scattergl/defaults.js b/src/traces/scattergl/defaults.js index b66c7e9a1ed..a30becb09ee 100644 --- a/src/traces/scattergl/defaults.js +++ b/src/traces/scattergl/defaults.js @@ -11,6 +11,7 @@ var Lib = require('../../lib'); var Registry = require('../../registry'); +var helpers = require('./helpers'); var attributes = require('./attributes'); var constants = require('../scatter/constants'); var subTypes = require('../scatter/subtypes'); @@ -25,7 +26,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout return Lib.coerce(traceIn, traceOut, attributes, attr, dflt); } - var isOpen = traceIn.marker ? /-open/.test(traceIn.marker.symbol) : false; + var isOpen = traceIn.marker ? helpers.isOpenSymbol(traceIn.marker.symbol) : false; var isBubble = subTypes.isBubble(traceIn); var len = handleXYDefaults(traceIn, traceOut, layout, coerce); diff --git a/src/traces/scattergl/helpers.js b/src/traces/scattergl/helpers.js new file mode 100644 index 00000000000..f2be43a0a16 --- /dev/null +++ b/src/traces/scattergl/helpers.js @@ -0,0 +1,23 @@ +/** +* Copyright 2012-2020, Plotly, Inc. +* All rights reserved. +* +* This source code is licensed under the MIT license found in the +* LICENSE file in the root directory of this source tree. +*/ + +'use strict'; + +var constants = require('./constants'); + +exports.isOpenSymbol = function(symbol) { + return (typeof symbol === 'string') ? + constants.OPEN_RE.test(symbol) : + symbol % 200 > 100; +}; + +exports.isDotSymbol = function(symbol) { + return (typeof symbol === 'string') ? + constants.DOT_RE.test(symbol) : + symbol > 200; +}; diff --git a/src/traces/scattergl/hover.js b/src/traces/scattergl/hover.js index 04709c058ee..6e7c03a947c 100644 --- a/src/traces/scattergl/hover.js +++ b/src/traces/scattergl/hover.js @@ -109,7 +109,7 @@ function calcHover(pointData, x, y, trace) { var font = trace.textfont; if(font) { - di.ts = Array.isArray(font.size) ? font.size[id] : font.size; + di.ts = Lib.isArrayOrTypedArray(font.size) ? font.size[id] : font.size; di.tc = Array.isArray(font.color) ? font.color[id] : font.color; di.tf = Array.isArray(font.family) ? font.family[id] : font.family; } @@ -118,7 +118,7 @@ function calcHover(pointData, x, y, trace) { if(marker) { di.ms = Lib.isArrayOrTypedArray(marker.size) ? marker.size[id] : marker.size; di.mo = Lib.isArrayOrTypedArray(marker.opacity) ? marker.opacity[id] : marker.opacity; - di.mx = Array.isArray(marker.symbol) ? marker.symbol[id] : marker.symbol; + di.mx = Lib.isArrayOrTypedArray(marker.symbol) ? marker.symbol[id] : marker.symbol; di.mc = Lib.isArrayOrTypedArray(marker.color) ? marker.color[id] : marker.color; } @@ -143,10 +143,10 @@ function calcHover(pointData, x, y, trace) { if(hoverlabel) { di.hbg = Array.isArray(hoverlabel.bgcolor) ? hoverlabel.bgcolor[id] : hoverlabel.bgcolor; di.hbc = Array.isArray(hoverlabel.bordercolor) ? hoverlabel.bordercolor[id] : hoverlabel.bordercolor; - di.hts = Array.isArray(hoverlabel.font.size) ? hoverlabel.font.size[id] : hoverlabel.font.size; + di.hts = Lib.isArrayOrTypedArray(hoverlabel.font.size) ? hoverlabel.font.size[id] : hoverlabel.font.size; di.htc = Array.isArray(hoverlabel.font.color) ? hoverlabel.font.color[id] : hoverlabel.font.color; di.htf = Array.isArray(hoverlabel.font.family) ? hoverlabel.font.family[id] : hoverlabel.font.family; - di.hnl = Array.isArray(hoverlabel.namelength) ? hoverlabel.namelength[id] : hoverlabel.namelength; + di.hnl = Lib.isArrayOrTypedArray(hoverlabel.namelength) ? hoverlabel.namelength[id] : hoverlabel.namelength; } var hoverinfo = trace.hoverinfo; if(hoverinfo) { diff --git a/src/traces/splom/defaults.js b/src/traces/splom/defaults.js index a2302a581ce..4d062510d9d 100644 --- a/src/traces/splom/defaults.js +++ b/src/traces/splom/defaults.js @@ -15,7 +15,7 @@ var attributes = require('./attributes'); var subTypes = require('../scatter/subtypes'); var handleMarkerDefaults = require('../scatter/marker_defaults'); var mergeLength = require('../parcoords/merge_length'); -var OPEN_RE = /-open/; +var isOpenSymbol = require('../scattergl/helpers').isOpenSymbol; module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) { function coerce(attr, dflt) { @@ -44,7 +44,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout handleMarkerDefaults(traceIn, traceOut, defaultColor, layout, coerce); - var isOpen = OPEN_RE.test(traceOut.marker.symbol); + var isOpen = isOpenSymbol(traceOut.marker.symbol); var isBubble = subTypes.isBubble(traceOut); coerce('marker.line.width', isOpen || isBubble ? 1 : 0); diff --git a/test/image/baselines/gl2d_symbol_numbers.png b/test/image/baselines/gl2d_symbol_numbers.png new file mode 100644 index 00000000000..cf0a00b987e Binary files /dev/null and b/test/image/baselines/gl2d_symbol_numbers.png differ diff --git a/test/image/baselines/splom_symbol_numbers.png b/test/image/baselines/splom_symbol_numbers.png new file mode 100644 index 00000000000..9ce83751902 Binary files /dev/null and b/test/image/baselines/splom_symbol_numbers.png differ diff --git a/test/image/mocks/gl2d_symbol_numbers.json b/test/image/mocks/gl2d_symbol_numbers.json new file mode 100644 index 00000000000..e60155b8d08 --- /dev/null +++ b/test/image/mocks/gl2d_symbol_numbers.json @@ -0,0 +1,32 @@ +{ + "data": [ + { + "y": [ + 0, + 0, + 0 + ], + "type": "scattergl", + "marker": { + "size": 24, + "symbol": "diamond-open-dot" + } + }, + { + "y": [ + 1, + 1, + 1 + ], + "type": "scattergl", + "marker": { + "size": 24, + "symbol": 302 + } + } + ], + "layout": { + "width": 600, + "height": 400 + } +} diff --git a/test/image/mocks/splom_symbol_numbers.json b/test/image/mocks/splom_symbol_numbers.json new file mode 100644 index 00000000000..09f63059ec9 --- /dev/null +++ b/test/image/mocks/splom_symbol_numbers.json @@ -0,0 +1,41 @@ +{ + "data": [ + { + "type": "splom", + "marker": { + "size": [ + 12, + 16, + 24, + 32 + ], + "symbol": [ + 1, + 102, + 203, + 304 + ] + }, + "dimensions": [ + { + "values": [ + 0, + 1, + 2, + 3 + ], + "label": "A" + }, + { + "values": [ + 0, + 2, + 5, + 6 + ], + "label": "B" + } + ] + } + ] +}