Skip to content

Commit 07958ea

Browse files
semelevenai
authored andcommitted
add mask-composite (#1202)
1 parent 653b10d commit 07958ea

File tree

5 files changed

+144
-0
lines changed

5 files changed

+144
-0
lines changed

lib/hacks/mask-composite.js

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
let Declaration = require('../declaration')
2+
3+
class MaskComposite extends Declaration {
4+
static names = ['mask', 'mask-composite'];
5+
6+
static oldValues = {
7+
add: 'source-over',
8+
substract: 'source-out',
9+
intersect: 'source-in',
10+
exclude: 'xor'
11+
};
12+
13+
static regexp = new RegExp(
14+
`\\s+(${ Object.keys(MaskComposite.oldValues).join(
15+
'|'
16+
) })\\b(?!\\))\\s*(?=[,])`,
17+
'ig'
18+
);
19+
20+
/**
21+
* Prefix mask-composite for webkit
22+
*/
23+
insert (decl, prefix, prefixes) {
24+
let isCompositeProp = decl.prop === 'mask-composite'
25+
26+
let compositeValues
27+
28+
if (isCompositeProp) {
29+
compositeValues = decl.value.split(',')
30+
} else {
31+
compositeValues = decl.value.match(MaskComposite.regexp) || []
32+
}
33+
34+
compositeValues = compositeValues.map(el => el.trim()).filter(el => el)
35+
let hasCompositeValues = compositeValues.length
36+
37+
let compositeDecl
38+
39+
if (hasCompositeValues) {
40+
compositeDecl = this.clone(decl)
41+
compositeDecl.value = compositeValues
42+
.map(value => MaskComposite.oldValues[value] || value)
43+
.join(', ')
44+
45+
if (compositeValues.includes('intersect')) {
46+
compositeDecl.value += ', xor'
47+
}
48+
49+
compositeDecl.prop = prefix + 'mask-composite'
50+
}
51+
52+
if (isCompositeProp) {
53+
if (!hasCompositeValues) {
54+
return undefined
55+
}
56+
57+
if (this.needCascade(decl)) {
58+
compositeDecl.raws.before = this.calcBefore(prefixes, decl, prefix)
59+
}
60+
61+
return decl.parent.insertBefore(decl, compositeDecl)
62+
}
63+
64+
let cloned = this.clone(decl)
65+
cloned.prop = prefix + cloned.prop
66+
67+
if (hasCompositeValues) {
68+
cloned.value = cloned.value.replace(MaskComposite.regexp, '')
69+
}
70+
71+
if (this.needCascade(decl)) {
72+
cloned.raws.before = this.calcBefore(prefixes, decl, prefix)
73+
}
74+
75+
decl.parent.insertBefore(decl, cloned)
76+
77+
if (!hasCompositeValues) {
78+
return decl
79+
}
80+
81+
if (this.needCascade(decl)) {
82+
compositeDecl.raws.before = this.calcBefore(prefixes, decl, prefix)
83+
}
84+
return decl.parent.insertBefore(decl, compositeDecl)
85+
}
86+
}
87+
88+
module.exports = MaskComposite

lib/prefixes.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ Declaration.hack(require('./hacks/align-self'))
2929
Declaration.hack(require('./hacks/appearance'))
3030
Declaration.hack(require('./hacks/flex-basis'))
3131
Declaration.hack(require('./hacks/mask-border'))
32+
Declaration.hack(require('./hacks/mask-composite'))
3233
Declaration.hack(require('./hacks/align-items'))
3334
Declaration.hack(require('./hacks/flex-shrink'))
3435
Declaration.hack(require('./hacks/break-props'))

test/autoprefixer.test.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,7 @@ describe('hacks', () => {
502502
it('supports all placeholders', () => check('placeholder'))
503503
it('supports image-rendering', () => check('image-rendering'))
504504
it('supports border-box mask', () => check('mask-border'))
505+
it('supports mask-composite', () => check('mask-composite'))
505506
it('supports image-set()', () => check('image-set'))
506507
it('supports writing-mode', () => check('writing-mode'))
507508
it('supports cross-fade()', () => check('cross-fade'))

test/cases/mask-composite.css

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
a {
2+
mask: url(add.png) add, url(substract.png);
3+
}
4+
5+
a {
6+
mask: url(intersect.png) intersect, url(exclude.png);
7+
}
8+
9+
a {
10+
mask: url(image.png) intersect, url(image.png) add, url(image.png);
11+
}
12+
13+
a {
14+
mask-composite: add;
15+
}
16+
17+
a {
18+
mask-composite:;
19+
}
20+
21+
a {
22+
mask-composite: add, substract, exclude;
23+
}

test/cases/mask-composite.out.css

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
a {
2+
-webkit-mask: url(add.png), url(substract.png);
3+
-webkit-mask-composite: source-over;
4+
mask: url(add.png) add, url(substract.png);
5+
}
6+
7+
a {
8+
-webkit-mask: url(intersect.png), url(exclude.png);
9+
-webkit-mask-composite: source-in, xor;
10+
mask: url(intersect.png) intersect, url(exclude.png);
11+
}
12+
13+
a {
14+
-webkit-mask: url(image.png), url(image.png), url(image.png);
15+
-webkit-mask-composite: source-in, source-over, xor;
16+
mask: url(image.png) intersect, url(image.png) add, url(image.png);
17+
}
18+
19+
a {
20+
-webkit-mask-composite: source-over;
21+
mask-composite: add;
22+
}
23+
24+
a {
25+
mask-composite:;
26+
}
27+
28+
a {
29+
-webkit-mask-composite: source-over, source-out, xor;
30+
mask-composite: add, substract, exclude;
31+
}

0 commit comments

Comments
 (0)