Add pixelRatio support for DOM vector renderer

Adds the scaling and transforms to support pixelRatio values other than
1.
This commit is contained in:
Andreas Hocevar
2015-01-12 22:14:52 +01:00
parent 5dca3e9b20
commit bbf074b70a
2 changed files with 31 additions and 10 deletions
+3 -2
View File
@@ -224,8 +224,9 @@ ol.renderer.dom.Map.prototype.renderFrame = function(frameState) {
(map.hasListener(ol.render.EventType.PRECOMPOSE) || (map.hasListener(ol.render.EventType.PRECOMPOSE) ||
map.hasListener(ol.render.EventType.POSTCOMPOSE))) { map.hasListener(ol.render.EventType.POSTCOMPOSE))) {
var canvas = this.context_.canvas; var canvas = this.context_.canvas;
canvas.width = frameState.size[0]; var pixelRatio = frameState.pixelRatio;
canvas.height = frameState.size[1]; canvas.width = frameState.size[0] * pixelRatio;
canvas.height = frameState.size[1] * pixelRatio;
} }
this.dispatchComposeEvent_(ol.render.EventType.PRECOMPOSE, frameState); this.dispatchComposeEvent_(ol.render.EventType.PRECOMPOSE, frameState);
+28 -8
View File
@@ -83,6 +83,12 @@ ol.renderer.dom.VectorLayer = function(mapRenderer, vectorLayer) {
*/ */
this.transform_ = goog.vec.Mat4.createNumber(); this.transform_ = goog.vec.Mat4.createNumber();
/**
* @private
* @type {goog.vec.Mat4.Number}
*/
this.elementTransform_ = goog.vec.Mat4.createNumber();
}; };
goog.inherits(ol.renderer.dom.VectorLayer, ol.renderer.dom.Layer); goog.inherits(ol.renderer.dom.VectorLayer, ol.renderer.dom.Layer);
@@ -97,22 +103,36 @@ ol.renderer.dom.VectorLayer.prototype.composeFrame =
goog.asserts.assertInstanceof(vectorLayer, ol.layer.Vector); goog.asserts.assertInstanceof(vectorLayer, ol.layer.Vector);
var viewState = frameState.viewState; var viewState = frameState.viewState;
var viewCenter = viewState.center;
var viewRotation = viewState.rotation; var viewRotation = viewState.rotation;
var viewResolution = viewState.resolution;
var pixelRatio = frameState.pixelRatio; var pixelRatio = frameState.pixelRatio;
var viewWidth = frameState.size[0];
var viewHeight = frameState.size[1];
var imageWidth = viewWidth * pixelRatio;
var imageHeight = viewHeight * pixelRatio;
var transform = ol.vec.Mat4.makeTransform2D(this.transform_, var transform = ol.vec.Mat4.makeTransform2D(this.transform_,
pixelRatio * frameState.size[0] / 2, pixelRatio * viewWidth / 2,
pixelRatio * frameState.size[1] / 2, pixelRatio * viewHeight / 2,
pixelRatio / viewState.resolution, pixelRatio / viewResolution,
-pixelRatio / viewState.resolution, -pixelRatio / viewResolution,
-viewState.rotation, -viewRotation,
-viewState.center[0], -viewState.center[1]); -viewCenter[0], -viewCenter[1]);
var context = this.context_; var context = this.context_;
// Clear the canvas and set the correct size // Clear the canvas and set the correct size
context.canvas.width = frameState.size[0]; context.canvas.width = imageWidth;
context.canvas.height = frameState.size[1]; context.canvas.height = imageHeight;
var elementTransform = ol.vec.Mat4.makeTransform2D(this.elementTransform_,
0, 0,
1 / pixelRatio, 1 / pixelRatio,
0,
-(imageWidth - viewWidth) / 2 * pixelRatio,
-(imageHeight - viewHeight) / 2 * pixelRatio);
ol.dom.transformElement2D(context.canvas, elementTransform, 6);
this.dispatchEvent_(ol.render.EventType.PRECOMPOSE, frameState, transform); this.dispatchEvent_(ol.render.EventType.PRECOMPOSE, frameState, transform);