Skip to content

Commit fa2e424

Browse files
committed
path pattern fills
1 parent ca6a886 commit fa2e424

File tree

5 files changed

+71
-16
lines changed

5 files changed

+71
-16
lines changed

src/components/drawing/attributes.js

+10
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,16 @@ exports.pattern = {
2828
'By default, no pattern is used for filling the area.',
2929
].join(' ')
3030
},
31+
path: {
32+
valType: 'string',
33+
arrayOk: true,
34+
editType: 'style',
35+
description: [
36+
'Sets a custom path for pattern fill.',
37+
'Use with no `shape` or `solidity`, provide an SVG path string for',
38+
'the regions of the square from (0,0) to (`size`,`size`) to color.'
39+
].join(' ')
40+
},
3141
fillmode: {
3242
valType: 'enumerated',
3343
values: ['replace', 'overlay'],

src/components/drawing/index.js

+26-10
Original file line numberDiff line numberDiff line change
@@ -218,13 +218,14 @@ drawing.dashStyle = function(dash, lineWidth) {
218218
function setFillStyle(sel, trace, gd, forLegend) {
219219
var markerPattern = trace.fillpattern;
220220
var fillgradient = trace.fillgradient;
221-
var patternShape = markerPattern && drawing.getPatternAttr(markerPattern.shape, 0, '');
221+
var pAttr = drawing.getPatternAttr;
222+
var patternShape = markerPattern && (pAttr(markerPattern.shape, 0, '') || pAttr(markerPattern.path, 0, ''));
222223
if(patternShape) {
223-
var patternBGColor = drawing.getPatternAttr(markerPattern.bgcolor, 0, null);
224-
var patternFGColor = drawing.getPatternAttr(markerPattern.fgcolor, 0, null);
224+
var patternBGColor = pAttr(markerPattern.bgcolor, 0, null);
225+
var patternFGColor = pAttr(markerPattern.fgcolor, 0, null);
225226
var patternFGOpacity = markerPattern.fgopacity;
226-
var patternSize = drawing.getPatternAttr(markerPattern.size, 0, 8);
227-
var patternSolidity = drawing.getPatternAttr(markerPattern.solidity, 0, 0.3);
227+
var patternSize = pAttr(markerPattern.size, 0, 8);
228+
var patternSolidity = pAttr(markerPattern.solidity, 0, 0.3);
228229
var patternID = trace.uid;
229230
drawing.pattern(sel, 'point', gd, patternID,
230231
patternShape, patternSize, patternSolidity,
@@ -306,6 +307,7 @@ drawing.fillGroupStyle = function(s, gd, forLegend) {
306307
};
307308

308309
var SYMBOLDEFS = require('./symbol_defs');
310+
const { marker } = require('../../traces/bar/attributes');
309311

310312
drawing.symbolNames = [];
311313
drawing.symbolFuncs = [];
@@ -662,6 +664,16 @@ drawing.pattern = function(sel, calledBy, gd, patternID, shape, size, solidity,
662664
fill: fgRGB
663665
};
664666
break;
667+
default:
668+
width = size;
669+
height = size;
670+
patternTag = 'path';
671+
patternAttrs = {
672+
d: shape,
673+
opacity: opacity,
674+
fill: fgRGB
675+
};
676+
break;
665677
}
666678

667679
var str = [
@@ -869,7 +881,10 @@ drawing.singlePointStyle = function(d, sel, trace, fns, gd, pt) {
869881
}
870882

871883
var markerPattern = marker.pattern;
872-
var patternShape = markerPattern && drawing.getPatternAttr(markerPattern.shape, d.i, '');
884+
var pAttr = drawing.getPatternAttr;
885+
var patternShape = markerPattern && (
886+
pAttr(markerPattern.shape, d.i, '') || pAttr(markerPattern.path, d.i, '')
887+
);
873888

874889
if(gradientType && gradientType !== 'none') {
875890
var gradientColor = d.mgc;
@@ -888,14 +903,15 @@ drawing.singlePointStyle = function(d, sel, trace, fns, gd, pt) {
888903
fgcolor = pt.color;
889904
perPointPattern = true;
890905
}
891-
var patternFGColor = drawing.getPatternAttr(fgcolor, d.i, (pt && pt.color) || null);
906+
var patternFGColor = pAttr(fgcolor, d.i, (pt && pt.color) || null);
892907

893-
var patternBGColor = drawing.getPatternAttr(markerPattern.bgcolor, d.i, null);
908+
var patternBGColor = pAttr(markerPattern.bgcolor, d.i, null);
894909
var patternFGOpacity = markerPattern.fgopacity;
895-
var patternSize = drawing.getPatternAttr(markerPattern.size, d.i, 8);
896-
var patternSolidity = drawing.getPatternAttr(markerPattern.solidity, d.i, 0.3);
910+
var patternSize = pAttr(markerPattern.size, d.i, 8);
911+
var patternSolidity = pAttr(markerPattern.solidity, d.i, 0.3);
897912
perPointPattern = perPointPattern || d.mcc ||
898913
Lib.isArrayOrTypedArray(markerPattern.shape) ||
914+
Lib.isArrayOrTypedArray(markerPattern.path) ||
899915
Lib.isArrayOrTypedArray(markerPattern.bgcolor) ||
900916
Lib.isArrayOrTypedArray(markerPattern.fgcolor) ||
901917
Lib.isArrayOrTypedArray(markerPattern.size) ||

src/components/legend/style.js

+6-3
Original file line numberDiff line numberDiff line change
@@ -376,11 +376,14 @@ module.exports = function style(s, gd, legend) {
376376
var fillColor = mcc || d0.mc || marker.color;
377377

378378
var markerPattern = marker.pattern;
379-
var patternShape = markerPattern && Drawing.getPatternAttr(markerPattern.shape, 0, '');
379+
var pAttr = Drawing.getPatternAttr;
380+
var patternShape = markerPattern && (
381+
pAttr(markerPattern.shape, 0, '') || pAttr(markerPattern.path, 0, '')
382+
);
380383

381384
if(patternShape) {
382-
var patternBGColor = Drawing.getPatternAttr(markerPattern.bgcolor, 0, null);
383-
var patternFGColor = Drawing.getPatternAttr(markerPattern.fgcolor, 0, null);
385+
var patternBGColor = pAttr(markerPattern.bgcolor, 0, null);
386+
var patternFGColor = pAttr(markerPattern.fgcolor, 0, null);
384387
var patternFGOpacity = markerPattern.fgopacity;
385388
var patternSize = dimAttr(markerPattern.size, 8, 10);
386389
var patternSolidity = dimAttr(markerPattern.solidity, 0.5, 1);

src/lib/coerce.js

+8-2
Original file line numberDiff line numberDiff line change
@@ -502,8 +502,14 @@ exports.coerceFont = function(coerce, attr, dfltObj, opts) {
502502
*/
503503
exports.coercePattern = function(coerce, attr, markerColor, hasMarkerColorscale) {
504504
var shape = coerce(attr + '.shape');
505-
if(shape) {
506-
coerce(attr + '.solidity');
505+
var path;
506+
if(!shape) {
507+
path = coerce(attr + '.path');
508+
}
509+
if(shape || path) {
510+
if(shape) {
511+
coerce(attr + '.solidity');
512+
}
507513
coerce(attr + '.size');
508514
var fillmode = coerce(attr + '.fillmode');
509515
var isOverlay = fillmode === 'overlay';

test/image/mocks/pattern_bars.json

+21-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,27 @@
5656
}
5757
}
5858
},
59-
59+
{
60+
"x": ["a", "b", "c", "d", "e"],
61+
"y": [7, 8, 9, 10, 11],
62+
"name": "Bar 5",
63+
"type": "bar",
64+
"textposition": "outside",
65+
"text": "path",
66+
"marker": {
67+
"pattern": {
68+
"path": [
69+
"M0,0H4V4H0Z",
70+
"M0,0H6V6Z",
71+
"M0,0V4H4Z",
72+
"M0,0C0,2,4,2,4,4C4,6,0,6,0,8H2C2,6,6,6,6,4C6,2,2,2,2,0Z",
73+
"M4,4L7,2A3.5,3.5,0,1,0,7,6Z"
74+
],
75+
"fgcolor": "yellow",
76+
"bgcolor": "black"
77+
}
78+
}
79+
},
6080
{
6181
"t": ["M", "N", "O", "P"],
6282
"r": [1, 2, 3, 4],

0 commit comments

Comments
 (0)