Skip to content

Commit

Permalink
rework getTransformFromProjections
Browse files Browse the repository at this point in the history
  • Loading branch information
mike-000 committed Feb 18, 2024
1 parent 070049c commit 2d6aec0
Showing 1 changed file with 48 additions and 22 deletions.
70 changes: 48 additions & 22 deletions src/ol/proj.js
Expand Up @@ -71,11 +71,7 @@ import {
clear as clearTransformFuncs,
get as getTransformFunc,
} from './proj/transforms.js';
import {
apply as applyMatrix,
create as createMatrix,
invert as invertMatrix,
} from './transform.js';
import {apply as applyMatrix, invert as invertMatrix} from './transform.js';
import {applyTransform, getWidth} from './extent.js';
import {clamp, modulo} from './math.js';
import {equals, getWorldsAway} from './coordinate.js';
Expand Down Expand Up @@ -477,25 +473,55 @@ export function getTransformFromProjections(
) {
const sourceCode = sourceProjection.getCode();
const destinationCode = destinationProjection.getCode();
let transformFunc = getTransformFunc(sourceCode, destinationCode);
if (!transformFunc) {
transformFunc = identityTransform;
const transformFunc = getTransformFunc(sourceCode, destinationCode);
const sourceMatrix = sourceProjection.getMatrix();
const destinationMatrix = destinationProjection.getMatrix();
if (!sourceMatrix && !destinationMatrix) {
return transformFunc || identityTransform;
}
let sourceMatrix = sourceProjection.getMatrix();
let destinationMatrix = destinationProjection.getMatrix();
if (sourceMatrix || destinationMatrix) {
const transform = transformFunc;
sourceMatrix = invertMatrix((sourceMatrix || createMatrix()).slice());
destinationMatrix = destinationMatrix || createMatrix();
const coordTransform = function (coordinate) {
return applyMatrix(
destinationMatrix,
transform(applyMatrix(sourceMatrix, coordinate.slice())),
);
};
transformFunc = createTransformFromCoordinateTransform(coordTransform);

let sourceTransform, destinationTransform;
if (sourceMatrix) {
const matrix = invertMatrix(sourceMatrix.slice());
sourceTransform = createTransformFromCoordinateTransform(
function (coordinate) {
return applyMatrix(matrix, coordinate);
},
);
}
return transformFunc;
if (destinationMatrix) {
const matrix = destinationMatrix;
destinationTransform = createTransformFromCoordinateTransform(
function (coordinate) {
return applyMatrix(matrix, coordinate);
},
);
}
return (
/**
* @param {Array<number>} input Input.
* @param {Array<number>} [output] Output.
* @param {number} [dimension] Dimension.
* @return {Array<number>} Output.
*/
function (input, output, dimension) {
const length = input.length;
output = output !== undefined ? output : new Array(length);
for (let i = 0; i < length; ++i) {
output[i] = input[i];
}
if (sourceTransform) {
sourceTransform(output, output, dimension);
}
if (transformFunc) {
transformFunc(output, output, dimension);
}
if (destinationTransform) {
destinationTransform(output, output, dimension);
}
return output;
}
);
}

/**
Expand Down

0 comments on commit 2d6aec0

Please sign in to comment.