From 3355efffd3f3c8171406b8062def04d5ed735d79 Mon Sep 17 00:00:00 2001 From: archmoj Date: Thu, 12 Dec 2019 14:58:24 -0500 Subject: [PATCH 1/3] use push instead of concat to generate drawing symbolList --- src/components/drawing/index.js | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) 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) { From 9a772c60ccf5557b78cbf75cb905e7faec28db15 Mon Sep 17 00:00:00 2001 From: archmoj Date: Mon, 6 Jan 2020 10:10:53 -0500 Subject: [PATCH 2/3] allow scattergl marker opacity, symbol & font size as well as hoverlable font size & namelength to be typedArrays --- src/traces/scattergl/convert.js | 15 +++++++++------ src/traces/scattergl/hover.js | 8 ++++---- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/traces/scattergl/convert.js b/src/traces/scattergl/convert.js index a0088cb696f..5a75c56cc26 100644 --- a/src/traces/scattergl/convert.js +++ b/src/traces/scattergl/convert.js @@ -59,7 +59,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 +187,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 +217,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); 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) { From 6468acc4f38a2ee3809dcc9662bca8d4fb9f7f1d Mon Sep 17 00:00:00 2001 From: archmoj Date: Mon, 6 Jan 2020 14:22:47 -0500 Subject: [PATCH 3/3] fixing scattergl and splom symbol numbers bug issue 2507 - add image tests with legends and using array for sizes and symbols --- src/traces/scattergl/convert.js | 7 +-- src/traces/scattergl/defaults.js | 3 +- src/traces/scattergl/helpers.js | 23 ++++++++++ src/traces/splom/defaults.js | 4 +- test/image/baselines/gl2d_symbol_numbers.png | Bin 0 -> 15184 bytes test/image/baselines/splom_symbol_numbers.png | Bin 0 -> 23862 bytes test/image/mocks/gl2d_symbol_numbers.json | 32 ++++++++++++++ test/image/mocks/splom_symbol_numbers.json | 41 ++++++++++++++++++ 8 files changed, 104 insertions(+), 6 deletions(-) create mode 100644 src/traces/scattergl/helpers.js create mode 100644 test/image/baselines/gl2d_symbol_numbers.png create mode 100644 test/image/baselines/splom_symbol_numbers.png create mode 100644 test/image/mocks/gl2d_symbol_numbers.json create mode 100644 test/image/mocks/splom_symbol_numbers.json diff --git a/src/traces/scattergl/convert.js b/src/traces/scattergl/convert.js index 5a75c56cc26..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; @@ -225,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) { @@ -256,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(); @@ -401,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/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 0000000000000000000000000000000000000000..cf0a00b987e04c36774967fd2f9f2fe79b1d7652 GIT binary patch literal 15184 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 Ui(9$}R?5;{)-~1v)~kE}2ZMx!rT_o{ literal 0 HcmV?d00001 diff --git a/test/image/baselines/splom_symbol_numbers.png b/test/image/baselines/splom_symbol_numbers.png new file mode 100644 index 0000000000000000000000000000000000000000..9ce8375190275d11533f1886538a12c40d5e8839 GIT binary patch literal 23862 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 literal 0 HcmV?d00001 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" + } + ] + } + ] +}