Skip to content

Commit e9c15d3

Browse files
authored
fix Layer opacity lose efficacy when it has Mask (#2502)
* fix Layer opacity lose efficacy when it has Mask * update spec
1 parent 4dd07a8 commit e9c15d3

File tree

6 files changed

+181
-147
lines changed

6 files changed

+181
-147
lines changed

packages/maptalks/src/renderer/layer/CanvasRenderer.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -631,6 +631,8 @@ class CanvasRenderer extends Class {
631631
const map = this.getMap();
632632
//when clipping, layer's middleWest needs to be reset for mask's containerPoint conversion
633633
this.middleWest = map._containerPointToPoint(new Point(0, map.height / 2));
634+
//geometry 渲染逻辑里会修改globalAlpha,这里保存一下
635+
const alpha = context.globalAlpha;
634636
context.save();
635637
const dpr = map.getDevicePixelRatio();
636638
if (dpr !== 1) {
@@ -664,6 +666,7 @@ class CanvasRenderer extends Class {
664666
console.error(error);
665667
}
666668
this.middleWest = old;
669+
context.globalAlpha = alpha;
667670
return true;
668671
}
669672

packages/maptalks/test/SpecCommon.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,3 +359,15 @@ function coordinate2PointWidthAltitude(map, coordinate) {
359359
return point;
360360
}
361361
/*eslint-enable no-unused-vars */
362+
363+
// eslint-disable-next-line no-undef
364+
var uaParser = new UAParser();
365+
var uaResult = uaParser.getOS();
366+
// eslint-disable-next-line no-unused-vars
367+
function isWindows() {
368+
return (uaResult.name && uaResult.name.toLowerCase().indexOf('windows') > -1)
369+
}
370+
// eslint-disable-next-line no-unused-vars
371+
function isLinux() {
372+
return (uaResult.name && uaResult.name.toLowerCase().indexOf('linux') > -1)
373+
}

packages/maptalks/test/geometry/TextBoxSpec.js

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -199,9 +199,10 @@ describe('Geometry.TextBox', function () {
199199
layer = new maptalks.VectorLayer('id', { 'drawImmediate': true });
200200
map.addLayer(layer);
201201
layer.addGeometry(vector);
202-
var parser = new UAParser();
203-
var result = parser.getOS();
204-
if (result.name && result.name.toLowerCase().indexOf('windows') > -1) {
202+
203+
204+
// eslint-disable-next-line no-undef
205+
if (isWindows()) {
205206
expect(layer).to.be.painted(100 / 2 - padding[0] - 4, 0);
206207
} else {
207208
expect(layer).to.be.painted(100 / 2 - padding[0] - 2, 0);
@@ -251,16 +252,17 @@ describe('Geometry.TextBox', function () {
251252
layer = new maptalks.VectorLayer('id', { 'drawImmediate': true });
252253
map.addLayer(layer);
253254
layer.addGeometry(vector);
254-
var parser = new UAParser();
255+
255256
var offset = 8;
256-
var result = parser.getOS();
257-
console.log(result);
258-
if (result.name) {
259-
if (result.name.toLowerCase().indexOf('linux') > -1) {
260-
offset = 9;
261-
}
257+
258+
259+
260+
// eslint-disable-next-line no-undef
261+
if (isLinux()) {
262+
offset = 9;
262263
}
263264

265+
264266
expect(layer).to.be.painted(0, 100 / 2 - padding[1] - offset);
265267
expect(layer).not.be.painted();
266268
});

packages/maptalks/test/layer/ImageLayerSpec.js

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,15 +68,13 @@ describe('Layer.ImageLayer', function () {
6868
renderer: 'canvas'
6969
});
7070
layer.on('layerload', function () {
71-
var parser = new UAParser();
7271
var alpha = 104;
73-
var result = parser.getOS();
74-
console.log(result);
75-
if (result.name) {
76-
if (result.name.toLowerCase().indexOf('linux') > -1) {
77-
alpha = 104;
78-
}
72+
73+
// eslint-disable-next-line no-undef
74+
if (isLinux()) {
75+
alpha = 104;
7976
}
77+
8078
var size = map.getSize();
8179
var ctx = layer.getRenderer().canvas.getContext('2d');
8280
var imageData = ctx.getImageData(size.width / 2, size.height / 2, 1, 1).data;

packages/maptalks/test/layer/LayerSpec.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,27 @@ describe('Layer.Spec', function () {
377377
// }, 60);
378378
});
379379

380+
it('change opacity when has mask', function (done) {
381+
var layer1 = new maptalks.TileLayer('1', {
382+
renderer: 'canvas',
383+
urlTemplate: 'resources/tile-red-256.png'
384+
}).addTo(map);
385+
expect(layer1.getOpacity()).to.be.eql(1);
386+
layer1.setOpacity(0.5);
387+
expect(layer1.getOpacity()).to.be.eql(0.5);
388+
const extent = map.getExtent();
389+
const mask = new maptalks.Polygon([...extent.toArray()]);
390+
layer1.setMask(mask);
391+
setTimeout(() => {
392+
var canvas = map.getRenderer().canvas;
393+
var size = map.getSize().toPoint();
394+
var context = canvas.getContext('2d');
395+
var imgData = context.getImageData(Math.round(size.x / 2), Math.round(size.y / 2), 1, 1).data;
396+
expect([...imgData]).to.be.eql([255, 0, 0, 128]);
397+
done();
398+
}, 1000);
399+
});
400+
380401
it('#getCollisionIndex', function () {
381402
var layer = new maptalks.TileLayer('1', { renderer:'canvas' });
382403
expect(layer.getCollisionIndex()).to.be.ok();

0 commit comments

Comments
 (0)