Merge pull request #6091 from tchandelle/linedash

Apply pixelRatio to line dash
This commit is contained in:
Andreas Hocevar
2016-12-06 15:53:23 +01:00
committed by GitHub
8 changed files with 52 additions and 12 deletions
+3 -3
View File
@@ -129,7 +129,7 @@ ol.render.canvas.LineStringReplay.prototype.setStrokeStyle_ = function() {
} }
this.instructions.push([ this.instructions.push([
ol.render.canvas.Instruction.SET_STROKE_STYLE, ol.render.canvas.Instruction.SET_STROKE_STYLE,
strokeStyle, lineWidth, lineCap, lineJoin, miterLimit, lineDash strokeStyle, lineWidth, lineCap, lineJoin, miterLimit, lineDash, true, 1
], [ ], [
ol.render.canvas.Instruction.BEGIN_PATH ol.render.canvas.Instruction.BEGIN_PATH
]); ]);
@@ -159,7 +159,7 @@ ol.render.canvas.LineStringReplay.prototype.drawLineString = function(lineString
this.hitDetectionInstructions.push([ this.hitDetectionInstructions.push([
ol.render.canvas.Instruction.SET_STROKE_STYLE, ol.render.canvas.Instruction.SET_STROKE_STYLE,
state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin, state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin,
state.miterLimit, state.lineDash state.miterLimit, state.lineDash, true, 1
], [ ], [
ol.render.canvas.Instruction.BEGIN_PATH ol.render.canvas.Instruction.BEGIN_PATH
]); ]);
@@ -187,7 +187,7 @@ ol.render.canvas.LineStringReplay.prototype.drawMultiLineString = function(multi
this.hitDetectionInstructions.push([ this.hitDetectionInstructions.push([
ol.render.canvas.Instruction.SET_STROKE_STYLE, ol.render.canvas.Instruction.SET_STROKE_STYLE,
state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin, state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin,
state.miterLimit, state.lineDash state.miterLimit, state.lineDash, true, 1
], [ ], [
ol.render.canvas.Instruction.BEGIN_PATH ol.render.canvas.Instruction.BEGIN_PATH
]); ]);
+6 -5
View File
@@ -1,6 +1,7 @@
goog.provide('ol.render.canvas.PolygonReplay'); goog.provide('ol.render.canvas.PolygonReplay');
goog.require('ol'); goog.require('ol');
goog.require('ol.array');
goog.require('ol.color'); goog.require('ol.color');
goog.require('ol.colorlike'); goog.require('ol.colorlike');
goog.require('ol.extent'); goog.require('ol.extent');
@@ -143,7 +144,7 @@ ol.render.canvas.PolygonReplay.prototype.drawCircle = function(circleGeometry, f
this.hitDetectionInstructions.push([ this.hitDetectionInstructions.push([
ol.render.canvas.Instruction.SET_STROKE_STYLE, ol.render.canvas.Instruction.SET_STROKE_STYLE,
state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin, state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin,
state.miterLimit, state.lineDash state.miterLimit, state.lineDash, true, 1
]); ]);
} }
var flatCoordinates = circleGeometry.getFlatCoordinates(); var flatCoordinates = circleGeometry.getFlatCoordinates();
@@ -195,7 +196,7 @@ ol.render.canvas.PolygonReplay.prototype.drawPolygon = function(polygonGeometry,
this.hitDetectionInstructions.push([ this.hitDetectionInstructions.push([
ol.render.canvas.Instruction.SET_STROKE_STYLE, ol.render.canvas.Instruction.SET_STROKE_STYLE,
state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin, state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin,
state.miterLimit, state.lineDash state.miterLimit, state.lineDash, true, 1
]); ]);
} }
var ends = polygonGeometry.getEnds(); var ends = polygonGeometry.getEnds();
@@ -232,7 +233,7 @@ ol.render.canvas.PolygonReplay.prototype.drawMultiPolygon = function(multiPolygo
this.hitDetectionInstructions.push([ this.hitDetectionInstructions.push([
ol.render.canvas.Instruction.SET_STROKE_STYLE, ol.render.canvas.Instruction.SET_STROKE_STYLE,
state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin, state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin,
state.miterLimit, state.lineDash state.miterLimit, state.lineDash, true, 1
]); ]);
} }
var endss = multiPolygonGeometry.getEndss(); var endss = multiPolygonGeometry.getEndss();
@@ -367,13 +368,13 @@ ol.render.canvas.PolygonReplay.prototype.setFillStrokeStyles_ = function(geometr
'miterLimit should be defined'); 'miterLimit should be defined');
if (state.currentStrokeStyle != strokeStyle || if (state.currentStrokeStyle != strokeStyle ||
state.currentLineCap != lineCap || state.currentLineCap != lineCap ||
state.currentLineDash != lineDash || !ol.array.equals(state.currentLineDash, lineDash) ||
state.currentLineJoin != lineJoin || state.currentLineJoin != lineJoin ||
state.currentLineWidth != lineWidth || state.currentLineWidth != lineWidth ||
state.currentMiterLimit != miterLimit) { state.currentMiterLimit != miterLimit) {
this.instructions.push([ this.instructions.push([
ol.render.canvas.Instruction.SET_STROKE_STYLE, ol.render.canvas.Instruction.SET_STROKE_STYLE,
strokeStyle, lineWidth, lineCap, lineJoin, miterLimit, lineDash strokeStyle, lineWidth, lineCap, lineJoin, miterLimit, lineDash, true, 1
]); ]);
state.currentStrokeStyle = strokeStyle; state.currentStrokeStyle = strokeStyle;
state.currentLineCap = lineCap; state.currentLineCap = lineCap;
+13 -1
View File
@@ -512,8 +512,12 @@ ol.render.canvas.Replay.prototype.replay_ = function(
'6th instruction should be a number'); '6th instruction should be a number');
ol.DEBUG && console.assert(instruction[6], ol.DEBUG && console.assert(instruction[6],
'7th instruction should not be null'); '7th instruction should not be null');
ol.DEBUG && console.assert(typeof instruction[8] === 'number',
'9th instruction should be a number');
var usePixelRatio = instruction[7] !== undefined ? var usePixelRatio = instruction[7] !== undefined ?
instruction[7] : true; instruction[7] : true;
var renderedPixelRatio = instruction[8];
var lineWidth = /** @type {number} */ (instruction[2]); var lineWidth = /** @type {number} */ (instruction[2]);
if (pendingStroke) { if (pendingStroke) {
context.stroke(); context.stroke();
@@ -525,7 +529,15 @@ ol.render.canvas.Replay.prototype.replay_ = function(
context.lineJoin = /** @type {string} */ (instruction[4]); context.lineJoin = /** @type {string} */ (instruction[4]);
context.miterLimit = /** @type {number} */ (instruction[5]); context.miterLimit = /** @type {number} */ (instruction[5]);
if (ol.has.CANVAS_LINE_DASH) { if (ol.has.CANVAS_LINE_DASH) {
context.setLineDash(/** @type {Array.<number>} */ (instruction[6])); var lineDash = /** @type {Array.<number>} */ (instruction[6]);
if (usePixelRatio && pixelRatio !== renderedPixelRatio) {
lineDash = lineDash.map(function(dash) {
return dash * pixelRatio / renderedPixelRatio;
});
instruction[6] = lineDash;
instruction[8] = pixelRatio;
}
context.setLineDash(lineDash);
} }
prevX = NaN; prevX = NaN;
prevY = NaN; prevY = NaN;
+1 -1
View File
@@ -169,7 +169,7 @@ ol.render.canvas.TextReplay.prototype.setReplayStrokeState_ = function(strokeSta
var setStrokeStyleInstruction = [ var setStrokeStyleInstruction = [
ol.render.canvas.Instruction.SET_STROKE_STYLE, strokeState.strokeStyle, ol.render.canvas.Instruction.SET_STROKE_STYLE, strokeState.strokeStyle,
strokeState.lineWidth, strokeState.lineCap, strokeState.lineJoin, strokeState.lineWidth, strokeState.lineCap, strokeState.lineJoin,
strokeState.miterLimit, strokeState.lineDash, false strokeState.miterLimit, strokeState.lineDash, false, 1
]; ];
this.instructions.push(setStrokeStyleInstruction); this.instructions.push(setStrokeStyleInstruction);
this.hitDetectionInstructions.push(setStrokeStyleInstruction); this.hitDetectionInstructions.push(setStrokeStyleInstruction);
+18 -1
View File
@@ -34,7 +34,7 @@ describe('ol.render.canvas.ReplayGroup', function() {
}); });
style2 = new ol.style.Style({ style2 = new ol.style.Style({
fill: new ol.style.Fill({color: 'white'}), fill: new ol.style.Fill({color: 'white'}),
stroke: new ol.style.Stroke({color: 'black', width: 1}) stroke: new ol.style.Stroke({color: 'black', width: 1, lineDash: [3, 6]})
}); });
fillCount = 0; fillCount = 0;
strokeCount = 0; strokeCount = 0;
@@ -139,6 +139,23 @@ describe('ol.render.canvas.ReplayGroup', function() {
expect(strokeCount).to.be(3); expect(strokeCount).to.be(3);
expect(beginPathCount).to.be(3); expect(beginPathCount).to.be(3);
}); });
it('applies the pixelRatio to the linedash array', function() {
var lineDash, lineDashCount = 0;
context.setLineDash = function(lineDash_) {
lineDashCount++;
lineDash = lineDash_.slice();
};
ol.renderer.vector.renderFeature(replay, feature1, style2, 1);
ol.renderer.vector.renderFeature(replay, feature2, style2, 1);
replay.replay(context, 2, transform, 0, {});
expect(lineDashCount).to.be(1);
expect(style2.getStroke().getLineDash()).to.be.eql([3, 6]);
expect(lineDash).to.be.eql([6, 12]);
});
}); });
}); });
Binary file not shown.

After

Width:  |  Height:  |  Size: 928 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 787 B

After

Width:  |  Height:  |  Size: 515 B

@@ -14,7 +14,7 @@ describe('ol.rendering.style.LineString', function() {
var target, map, vectorSource; var target, map, vectorSource;
function createMap(renderer) { function createMap(renderer, opt_pixelRatio) {
target = createMapDiv(50, 50); target = createMapDiv(50, 50);
vectorSource = new ol.source.Vector(); vectorSource = new ol.source.Vector();
@@ -23,6 +23,7 @@ describe('ol.rendering.style.LineString', function() {
}); });
map = new ol.Map({ map = new ol.Map({
pixelRatio: opt_pixelRatio || 1,
target: target, target: target,
renderer: renderer, renderer: renderer,
layers: [vectorLayer], layers: [vectorLayer],
@@ -85,6 +86,7 @@ describe('ol.rendering.style.LineString', function() {
color: '#000000', color: '#000000',
width: 2, width: 2,
lineCap: 'square', lineCap: 'square',
lineDash: [4, 8],
lineJoin: 'round' lineJoin: 'round'
}) })
})); }));
@@ -105,5 +107,13 @@ describe('ol.rendering.style.LineString', function() {
expectResemble(map, 'spec/ol/style/expected/linestring-strokes-webgl.png', expectResemble(map, 'spec/ol/style/expected/linestring-strokes-webgl.png',
14.6, done); 14.6, done);
}); });
it('tests the canvas renderer (HiDPI)', function(done) {
map = createMap('canvas', 2);
createFeatures();
expectResemble(
map, 'spec/ol/style/expected/linestring-strokes-canvas-hidpi.png',
3.0, done);
});
}); });
}); });