package com.marshalchen.common.uimodule.shapeimageview.path.parser;
import android.graphics.Matrix;
import android.util.Log;
class TransformParser {
private static final String TAG = SvgToPath.class.getSimpleName();
// Process a list of transforms
// foo(n,n,n...) bar(n,n,n..._ ...)
// delims are whitespace or ,'s
static Matrix parseTransform(String s) {
//Log.d(TAG, s);
Matrix matrix = new Matrix();
while (true) {
parseTransformItem(s, matrix);
int rparen = s.indexOf(")");
if (rparen > 0 && s.length() > rparen + 1) {
s = s.substring(rparen + 1).replaceFirst("[\\s,]*", "");
} else {
break;
}
}
return matrix;
}
private static void parseTransformItem(String s, Matrix matrix) {
if (s.startsWith("matrix(")) {
NumberParse np = NumberParse.parseNumbers(s.substring("matrix(".length()));
if (np.numbers.size() == 6) {
Matrix mat = new Matrix();
mat.setValues(new float[] {
// Row 1
np.numbers.get(0),
np.numbers.get(2),
np.numbers.get(4),
// Row 2
np.numbers.get(1),
np.numbers.get(3),
np.numbers.get(5),
// Row 3
0,
0,
1,
});
matrix.preConcat(mat);
}
} else if (s.startsWith("translate(")) {
NumberParse np = NumberParse.parseNumbers(s.substring("translate(".length()));
if (np.numbers.size() > 0) {
float tx = np.numbers.get(0);
float ty = 0;
if (np.numbers.size() > 1) {
ty = np.numbers.get(1);
}
matrix.preTranslate(tx, ty);
}
} else if (s.startsWith("scale(")) {
NumberParse np = NumberParse.parseNumbers(s.substring("scale(".length()));
if (np.numbers.size() > 0) {
float sx = np.numbers.get(0);
float sy = sx;
if (np.numbers.size() > 1) {
sy = np.numbers.get(1);
}
matrix.preScale(sx, sy);
}
} else if (s.startsWith("skewX(")) {
NumberParse np = NumberParse.parseNumbers(s.substring("skewX(".length()));
if (np.numbers.size() > 0) {
float angle = np.numbers.get(0);
matrix.preSkew((float) Math.tan(angle), 0);
}
} else if (s.startsWith("skewY(")) {
NumberParse np = NumberParse.parseNumbers(s.substring("skewY(".length()));
if (np.numbers.size() > 0) {
float angle = np.numbers.get(0);
matrix.preSkew(0, (float) Math.tan(angle));
}
} else if (s.startsWith("rotate(")) {
NumberParse np = NumberParse.parseNumbers(s.substring("rotate(".length()));
if (np.numbers.size() > 0) {
float angle = np.numbers.get(0);
float cx = 0;
float cy = 0;
if (np.numbers.size() > 2) {
cx = np.numbers.get(1);
cy = np.numbers.get(2);
}
matrix.preTranslate(cx, cy);
matrix.preRotate(angle);
matrix.preTranslate(-cx, -cy);
}
} else {
Log.w(TAG, "Invalid transform (" + s + ")");
}
}
}