Use ol.transform.compose() for common transform compositions
This commit is contained in:
committed by
Andreas Hocevar
parent
a655234cc3
commit
618cb389e5
@@ -272,10 +272,11 @@ ol.render.canvas.Immediate.prototype.drawImages_ = function(flatCoordinates, off
|
|||||||
if (rotation !== 0 || this.imageScale_ != 1) {
|
if (rotation !== 0 || this.imageScale_ != 1) {
|
||||||
var centerX = x + this.imageAnchorX_;
|
var centerX = x + this.imageAnchorX_;
|
||||||
var centerY = y + this.imageAnchorY_;
|
var centerY = y + this.imageAnchorY_;
|
||||||
ol.transform.translate(ol.transform.reset(localTransform), centerX, centerY);
|
ol.transform.compose(localTransform,
|
||||||
ol.transform.scale(localTransform, this.imageScale_, this.imageScale_);
|
centerX, centerY,
|
||||||
ol.transform.rotate(localTransform, rotation);
|
this.imageScale_, this.imageScale_,
|
||||||
ol.transform.translate(localTransform, -centerX, -centerY);
|
rotation,
|
||||||
|
-centerX, -centerY);
|
||||||
context.setTransform.apply(context, localTransform);
|
context.setTransform.apply(context, localTransform);
|
||||||
}
|
}
|
||||||
context.drawImage(this.image_, this.imageOriginX_, this.imageOriginY_,
|
context.drawImage(this.image_, this.imageOriginX_, this.imageOriginY_,
|
||||||
@@ -320,11 +321,11 @@ ol.render.canvas.Immediate.prototype.drawText_ = function(flatCoordinates, offse
|
|||||||
var x = pixelCoordinates[offset] + this.textOffsetX_;
|
var x = pixelCoordinates[offset] + this.textOffsetX_;
|
||||||
var y = pixelCoordinates[offset + 1] + this.textOffsetY_;
|
var y = pixelCoordinates[offset + 1] + this.textOffsetY_;
|
||||||
if (this.textRotation_ !== 0 || this.textScale_ != 1) {
|
if (this.textRotation_ !== 0 || this.textScale_ != 1) {
|
||||||
var localTransform = ol.transform.reset(this.tmpLocalTransform_);
|
var localTransform = ol.transform.compose(this.tmpLocalTransform_,
|
||||||
ol.transform.translate(localTransform, x, y);
|
x, y,
|
||||||
ol.transform.scale(localTransform, this.textScale_, this.textScale_);
|
this.textScale_, this.textScale_,
|
||||||
ol.transform.rotate(localTransform, this.textRotation_);
|
this.textRotation_,
|
||||||
ol.transform.translate(localTransform, -x, -y);
|
-x, -y);
|
||||||
context.setTransform.apply(context, localTransform);
|
context.setTransform.apply(context, localTransform);
|
||||||
}
|
}
|
||||||
if (this.textStrokeState_) {
|
if (this.textStrokeState_) {
|
||||||
|
|||||||
@@ -331,10 +331,8 @@ ol.render.canvas.Replay.prototype.replay_ = function(
|
|||||||
if (scale != 1 || rotation !== 0) {
|
if (scale != 1 || rotation !== 0) {
|
||||||
var centerX = x + anchorX;
|
var centerX = x + anchorX;
|
||||||
var centerY = y + anchorY;
|
var centerY = y + anchorY;
|
||||||
ol.transform.translate(ol.transform.reset(localTransform), centerX, centerY);
|
ol.transform.compose(localTransform,
|
||||||
ol.transform.scale(localTransform, scale, scale);
|
centerX, centerY, scale, scale, rotation, -centerX, -centerY);
|
||||||
ol.transform.rotate(localTransform, rotation);
|
|
||||||
ol.transform.translate(localTransform, -centerX, -centerY);
|
|
||||||
context.transform.apply(context, localTransform);
|
context.transform.apply(context, localTransform);
|
||||||
}
|
}
|
||||||
var alpha = context.globalAlpha;
|
var alpha = context.globalAlpha;
|
||||||
@@ -390,10 +388,7 @@ ol.render.canvas.Replay.prototype.replay_ = function(
|
|||||||
x = pixelCoordinates[d] + offsetX;
|
x = pixelCoordinates[d] + offsetX;
|
||||||
y = pixelCoordinates[d + 1] + offsetY;
|
y = pixelCoordinates[d + 1] + offsetY;
|
||||||
if (scale != 1 || rotation !== 0) {
|
if (scale != 1 || rotation !== 0) {
|
||||||
ol.transform.translate(ol.transform.reset(localTransform), x, y);
|
ol.transform.compose(localTransform, x, y, scale, scale, rotation, -x, -y);
|
||||||
ol.transform.scale(localTransform, scale, scale);
|
|
||||||
ol.transform.rotate(localTransform, rotation);
|
|
||||||
ol.transform.translate(localTransform, -x, -y);
|
|
||||||
context.transform.apply(context, localTransform);
|
context.transform.apply(context, localTransform);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1897,11 +1892,11 @@ ol.render.canvas.ReplayGroup.prototype.finish = function() {
|
|||||||
ol.render.canvas.ReplayGroup.prototype.forEachFeatureAtCoordinate = function(
|
ol.render.canvas.ReplayGroup.prototype.forEachFeatureAtCoordinate = function(
|
||||||
coordinate, resolution, rotation, skippedFeaturesHash, callback) {
|
coordinate, resolution, rotation, skippedFeaturesHash, callback) {
|
||||||
|
|
||||||
var transform = ol.transform.reset(this.hitDetectionTransform_);
|
var transform = ol.transform.compose(this.hitDetectionTransform_,
|
||||||
ol.transform.translate(transform, 0.5, 0.5);
|
0.5, 0.5,
|
||||||
ol.transform.scale(transform, 1 / resolution, -1 / resolution);
|
1 / resolution, -1 / resolution,
|
||||||
ol.transform.rotate(transform, -rotation);
|
-rotation,
|
||||||
ol.transform.translate(transform, -coordinate[0], -coordinate[1]);
|
-coordinate[0], -coordinate[1]);
|
||||||
|
|
||||||
var context = this.hitDetectionContext_;
|
var context = this.hitDetectionContext_;
|
||||||
context.clearRect(0, 0, 1, 1);
|
context.clearRect(0, 0, 1, 1);
|
||||||
|
|||||||
@@ -184,14 +184,14 @@ ol.renderer.canvas.Layer.prototype.getImageTransform = goog.abstractMethod;
|
|||||||
ol.renderer.canvas.Layer.prototype.getTransform = function(frameState, offsetX) {
|
ol.renderer.canvas.Layer.prototype.getTransform = function(frameState, offsetX) {
|
||||||
var viewState = frameState.viewState;
|
var viewState = frameState.viewState;
|
||||||
var pixelRatio = frameState.pixelRatio;
|
var pixelRatio = frameState.pixelRatio;
|
||||||
var transform = ol.transform.reset(this.transform_);
|
var dx1 = pixelRatio * frameState.size[0] / 2;
|
||||||
ol.transform.translate(transform,
|
var dy1 = pixelRatio * frameState.size[1] / 2;
|
||||||
pixelRatio * frameState.size[0] / 2, pixelRatio * frameState.size[1] / 2);
|
var sx = pixelRatio / viewState.resolution;
|
||||||
ol.transform.scale(transform,
|
var sy = -sx;
|
||||||
pixelRatio / viewState.resolution, -pixelRatio / viewState.resolution);
|
var angle = -viewState.rotation;
|
||||||
ol.transform.rotate(transform, -viewState.rotation);
|
var dx2 = -viewState.center[0] + offsetX;
|
||||||
return ol.transform.translate(transform,
|
var dy2 = -viewState.center[1];
|
||||||
-viewState.center[0] + offsetX, -viewState.center[1]);
|
return ol.transform.compose(this.transform_, dx1, dy1, sx, sy, angle, dx2, dy2);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -120,17 +120,15 @@ ol.renderer.canvas.Map.prototype.dispatchComposeEvent_ = function(type, frameSta
|
|||||||
* @return {!ol.Transform} Transform.
|
* @return {!ol.Transform} Transform.
|
||||||
*/
|
*/
|
||||||
ol.renderer.canvas.Map.prototype.getTransform = function(frameState) {
|
ol.renderer.canvas.Map.prototype.getTransform = function(frameState) {
|
||||||
var pixelRatio = frameState.pixelRatio;
|
|
||||||
var viewState = frameState.viewState;
|
var viewState = frameState.viewState;
|
||||||
var resolution = viewState.resolution;
|
var dx1 = this.canvas_.width / 2;
|
||||||
var transform = ol.transform.reset(this.transform_);
|
var dy1 = this.canvas_.height / 2;
|
||||||
ol.transform.translate(transform,
|
var sx = frameState.pixelRatio / viewState.resolution;
|
||||||
this.canvas_.width / 2, this.canvas_.height / 2);
|
var sy = -sx;
|
||||||
ol.transform.scale(transform,
|
var angle = -viewState.rotation;
|
||||||
pixelRatio / resolution, -pixelRatio / resolution);
|
var dx2 = -viewState.center[0];
|
||||||
ol.transform.rotate(transform, -viewState.rotation);
|
var dy2 = -viewState.center[1];
|
||||||
return ol.transform.translate(transform,
|
return ol.transform.compose(this.transform_, dx1, dy1, sx, sy, angle, dx2, dy2);
|
||||||
-viewState.center[0], -viewState.center[1]);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -326,11 +326,11 @@ ol.renderer.canvas.TileLayer.prototype.renderTileImages = function(context, fram
|
|||||||
if (hasRenderListeners) {
|
if (hasRenderListeners) {
|
||||||
var dX = drawOffsetX - offsetX / drawScale + offsetX;
|
var dX = drawOffsetX - offsetX / drawScale + offsetX;
|
||||||
var dY = drawOffsetY - offsetY / drawScale + offsetY;
|
var dY = drawOffsetY - offsetY / drawScale + offsetY;
|
||||||
var imageTransform = ol.transform.reset(this.imageTransform_);
|
var imageTransform = ol.transform.compose(this.imageTransform_,
|
||||||
ol.transform.translate(imageTransform, drawSize / 2 - dX, drawSize / 2 - dY);
|
drawSize / 2 - dX, drawSize / 2 - dY,
|
||||||
ol.transform.scale(imageTransform, pixelScale, -pixelScale);
|
pixelScale, -pixelScale,
|
||||||
ol.transform.rotate(imageTransform, -rotation);
|
-rotation,
|
||||||
ol.transform.translate(imageTransform, -center[0] + dX / pixelScale, -center[1] - dY / pixelScale);
|
-center[0] + dX / pixelScale, -center[1] - dY / pixelScale);
|
||||||
this.dispatchRenderEvent(renderContext, frameState, imageTransform);
|
this.dispatchRenderEvent(renderContext, frameState, imageTransform);
|
||||||
}
|
}
|
||||||
if (rotation || hasRenderListeners) {
|
if (rotation || hasRenderListeners) {
|
||||||
|
|||||||
@@ -148,13 +148,11 @@ ol.renderer.canvas.VectorTileLayer.prototype.renderTileReplays_ = function(
|
|||||||
if (pixelSpace) {
|
if (pixelSpace) {
|
||||||
origin = ol.extent.getTopLeft(tileExtent);
|
origin = ol.extent.getTopLeft(tileExtent);
|
||||||
tileTransform = ol.transform.reset(this.tmpTransform_);
|
tileTransform = ol.transform.reset(this.tmpTransform_);
|
||||||
ol.transform.translate(tileTransform, offsetX, offsetY);
|
tileTransform = ol.transform.compose(this.tmpTransform_,
|
||||||
ol.transform.scale(tileTransform,
|
offsetX, offsetY,
|
||||||
pixelScale * tilePixelResolution, pixelScale * tilePixelResolution);
|
pixelScale * tilePixelResolution, pixelScale * tilePixelResolution,
|
||||||
ol.transform.rotate(tileTransform, rotation);
|
rotation,
|
||||||
ol.transform.translate(tileTransform,
|
(origin[0] - center[0]) / tilePixelResolution, (center[1] - origin[1]) / tilePixelResolution);
|
||||||
(origin[0] - center[0]) / tilePixelResolution,
|
|
||||||
(center[1] - origin[1]) / tilePixelResolution);
|
|
||||||
} else {
|
} else {
|
||||||
tileTransform = transform;
|
tileTransform = transform;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -118,14 +118,13 @@ ol.renderer.dom.ImageLayer.prototype.prepareFrame = function(frameState, layerSt
|
|||||||
var imageExtent = image.getExtent();
|
var imageExtent = image.getExtent();
|
||||||
var imageResolution = image.getResolution();
|
var imageResolution = image.getResolution();
|
||||||
var transform = ol.transform.create();
|
var transform = ol.transform.create();
|
||||||
ol.transform.translate(transform,
|
ol.transform.compose(transform,
|
||||||
frameState.size[0] / 2, frameState.size[1] / 2);
|
frameState.size[0] / 2, frameState.size[1] / 2,
|
||||||
ol.transform.scale(transform,
|
imageResolution / viewResolution, imageResolution / viewResolution,
|
||||||
imageResolution / viewResolution, imageResolution / viewResolution);
|
viewRotation,
|
||||||
ol.transform.rotate(transform, viewRotation);
|
|
||||||
ol.transform.translate(transform,
|
|
||||||
(imageExtent[0] - viewCenter[0]) / imageResolution,
|
(imageExtent[0] - viewCenter[0]) / imageResolution,
|
||||||
(viewCenter[1] - imageExtent[3]) / imageResolution);
|
(viewCenter[1] - imageExtent[3]) / imageResolution);
|
||||||
|
|
||||||
if (image != this.image_) {
|
if (image != this.image_) {
|
||||||
var imageElement = image.getImage(this);
|
var imageElement = image.getImage(this);
|
||||||
// Bootstrap sets the style max-width: 100% for all images, which breaks
|
// Bootstrap sets the style max-width: 100% for all images, which breaks
|
||||||
|
|||||||
@@ -123,15 +123,14 @@ ol.renderer.dom.Map.prototype.dispatchComposeEvent_ = function(type, frameState)
|
|||||||
var context = this.context_;
|
var context = this.context_;
|
||||||
var canvas = context.canvas;
|
var canvas = context.canvas;
|
||||||
|
|
||||||
var transform = ol.transform.reset(this.transform_);
|
var transform = ol.transform.compose(this.transform_,
|
||||||
ol.transform.translate(transform, canvas.width / 2, canvas.height / 2);
|
canvas.width / 2, canvas.height / 2,
|
||||||
ol.transform.scale(transform,
|
pixelRatio / viewState.resolution, -pixelRatio / viewState.resolution,
|
||||||
pixelRatio / viewState.resolution, -pixelRatio / viewState.resolution);
|
-rotation,
|
||||||
ol.transform.rotate(transform, -viewState.rotation);
|
|
||||||
ol.transform.translate(transform,
|
|
||||||
-viewState.center[0], -viewState.center[1]);
|
-viewState.center[0], -viewState.center[1]);
|
||||||
|
|
||||||
var vectorContext = new ol.render.canvas.Immediate(context, pixelRatio,
|
var vectorContext = new ol.render.canvas.Immediate(context, pixelRatio,
|
||||||
extent, this.transform_, rotation);
|
extent, transform, rotation);
|
||||||
var composeEvent = new ol.render.Event(type, map, vectorContext,
|
var composeEvent = new ol.render.Event(type, map, vectorContext,
|
||||||
frameState, context, null);
|
frameState, context, null);
|
||||||
map.dispatchEvent(composeEvent);
|
map.dispatchEvent(composeEvent);
|
||||||
|
|||||||
@@ -210,13 +210,13 @@ ol.renderer.dom.TileLayer.prototype.prepareFrame = function(frameState, layerSta
|
|||||||
}
|
}
|
||||||
resolution = tileLayerZ.getResolution();
|
resolution = tileLayerZ.getResolution();
|
||||||
origin = tileLayerZ.getOrigin();
|
origin = tileLayerZ.getOrigin();
|
||||||
ol.transform.translate(ol.transform.reset(transform),
|
|
||||||
frameState.size[0] / 2, frameState.size[1] / 2);
|
ol.transform.compose(transform,
|
||||||
ol.transform.scale(transform,
|
frameState.size[0] / 2, frameState.size[1] / 2,
|
||||||
resolution / viewState.resolution, resolution / viewState.resolution);
|
resolution / viewState.resolution, resolution / viewState.resolution,
|
||||||
ol.transform.rotate(transform, viewState.rotation);
|
viewState.rotation,
|
||||||
ol.transform.translate(transform,
|
|
||||||
(origin[0] - center[0]) / resolution, (center[1] - origin[1]) / resolution);
|
(origin[0] - center[0]) / resolution, (center[1] - origin[1]) / resolution);
|
||||||
|
|
||||||
tileLayerZ.setTransform(transform);
|
tileLayerZ.setTransform(transform);
|
||||||
if (tileLayerZKey in newTileLayerZKeys) {
|
if (tileLayerZKey in newTileLayerZKeys) {
|
||||||
for (j = tileLayerZKey - 1; j >= 0; --j) {
|
for (j = tileLayerZKey - 1; j >= 0; --j) {
|
||||||
|
|||||||
@@ -119,13 +119,11 @@ ol.renderer.dom.VectorLayer.prototype.composeFrame = function(frameState, layerS
|
|||||||
var imageWidth = viewWidth * pixelRatio;
|
var imageWidth = viewWidth * pixelRatio;
|
||||||
var imageHeight = viewHeight * pixelRatio;
|
var imageHeight = viewHeight * pixelRatio;
|
||||||
|
|
||||||
var transform = ol.transform.reset(this.transform_);
|
var transform = ol.transform.compose(this.transform_,
|
||||||
ol.transform.translate(transform,
|
pixelRatio * viewWidth / 2, pixelRatio * viewHeight / 2,
|
||||||
pixelRatio * viewWidth / 2, pixelRatio * viewHeight / 2);
|
pixelRatio / viewResolution, -pixelRatio / viewResolution,
|
||||||
ol.transform.scale(transform,
|
-viewRotation,
|
||||||
pixelRatio / viewResolution, -pixelRatio / viewResolution);
|
-viewCenter[0], -viewCenter[1]);
|
||||||
ol.transform.rotate(transform, -viewRotation);
|
|
||||||
ol.transform.translate(transform, -viewCenter[0], -viewCenter[1]);
|
|
||||||
|
|
||||||
var context = this.context_;
|
var context = this.context_;
|
||||||
|
|
||||||
|
|||||||
@@ -69,13 +69,13 @@ ol.renderer.Map.prototype.calculateMatrices2D = function(frameState) {
|
|||||||
var pixelToCoordinateTransform = frameState.pixelToCoordinateTransform;
|
var pixelToCoordinateTransform = frameState.pixelToCoordinateTransform;
|
||||||
goog.asserts.assert(coordinateToPixelTransform,
|
goog.asserts.assert(coordinateToPixelTransform,
|
||||||
'frameState has a coordinateToPixelTransform');
|
'frameState has a coordinateToPixelTransform');
|
||||||
ol.transform.translate(ol.transform.reset(coordinateToPixelTransform),
|
|
||||||
frameState.size[0] / 2, frameState.size[1] / 2);
|
ol.transform.compose(coordinateToPixelTransform,
|
||||||
ol.transform.scale(coordinateToPixelTransform,
|
frameState.size[0] / 2, frameState.size[1] / 2,
|
||||||
1 / viewState.resolution, -1 / viewState.resolution);
|
1 / viewState.resolution, -1 / viewState.resolution,
|
||||||
ol.transform.rotate(coordinateToPixelTransform, -viewState.rotation);
|
-viewState.rotation,
|
||||||
ol.transform.translate(coordinateToPixelTransform,
|
|
||||||
-viewState.center[0], -viewState.center[1]);
|
-viewState.center[0], -viewState.center[1]);
|
||||||
|
|
||||||
ol.transform.invert(
|
ol.transform.invert(
|
||||||
ol.transform.setFromArray(pixelToCoordinateTransform, coordinateToPixelTransform));
|
ol.transform.setFromArray(pixelToCoordinateTransform, coordinateToPixelTransform));
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -215,10 +215,14 @@ ol.source.ImageVector.prototype.getStyleFunction = function() {
|
|||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
ol.source.ImageVector.prototype.getTransform_ = function(center, resolution, pixelRatio, size) {
|
ol.source.ImageVector.prototype.getTransform_ = function(center, resolution, pixelRatio, size) {
|
||||||
var transform = ol.transform.reset(this.transform_);
|
var dx1 = size[0] / 2;
|
||||||
ol.transform.translate(transform, size[0] / 2, size[1] / 2);
|
var dy1 = size[1] / 2;
|
||||||
ol.transform.scale(transform, pixelRatio / resolution, -pixelRatio / resolution);
|
var sx = pixelRatio / resolution;
|
||||||
return ol.transform.translate(transform, -center[0], -center[1]);
|
var sy = -sx;
|
||||||
|
var dx2 = -center[0];
|
||||||
|
var dy2 = -center[1];
|
||||||
|
|
||||||
|
return ol.transform.compose(this.transform_, dx1, dy1, sx, sy, 0, dx2, dy2);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user