Author: desruisseaux
Date: Tue Jul 28 09:50:21 2015
New Revision: 1693058
URL: http://svn.apache.org/r1693058
Log:
WKT formatting: merge consecutive synthetic affine transforms.
Modified:
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ConcatenatedTransform.java
Modified:
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ConcatenatedTransform.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ConcatenatedTransform.java?rev=1693058&r1=1693057&r2=1693058&view=diff
==============================================================================
---
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ConcatenatedTransform.java
[UTF-8] (original)
+++
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ConcatenatedTransform.java
[UTF-8] Tue Jul 28 09:50:21 2015
@@ -428,6 +428,35 @@ class ConcatenatedTransform extends Abst
i = ((AbstractMathTransform) step).beforeFormat(transforms, i,
false);
}
}
+ /*
+ * Merge consecutive affine transforms. The transforms list should
never contain consecutive instances
+ * of LinearTransform because the ConcatenatedTransform.create(…)
method already merged them (this is
+ * verified by assertions in MathTransforms). However the above loop
may have created synthetic affine
+ * transforms for WKT formatting purpose. Those synthetic affine
transforms are actually represented by
+ * Matrix objects (rather than full MathTransform objects), and two
matrices may have been generated
+ * consecutively.
+ */
+ Matrix after = null;
+ for (int i=transforms.size(); --i >= 0;) {
+ final Object step = transforms.get(i);
+ if (step instanceof Matrix) {
+ if (after != null) {
+ final Matrix merged = Matrices.multiply(after, (Matrix)
step);
+ if (merged.isIdentity()) {
+ transforms.subList(i, i+2).clear();
+ after = null;
+ } else {
+ transforms.set(i, MathTransforms.linear(merged));
+ transforms.remove(i+1);
+ after = merged;
+ }
+ } else {
+ after = (Matrix) step;
+ }
+ } else {
+ after = null;
+ }
+ }
return transforms;
}