/*******************************************************************************
* Copyright 2012-present Pixate, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
/**
* Copyright (c) 2012-2013 Pixate, Inc. All rights reserved.
*/
package com.pixate.freestyle.cg.strokes;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
public class PXNonScalingStroke extends PXStroke {
/*
* (non-Javadoc)
* @see
* com.pixate.freestyle.cg.strokes.PXStroke#applyStrokeToPath(android.graphics
* .Path, android.graphics.Paint, android.graphics.Canvas)
*/
@SuppressWarnings("deprecation")
@Override
public void applyStrokeToPath(Path path, Paint paint, Canvas context) {
if (this.color != null && this.width > 0f) {
//
// | a b 0 |
// | c d 0 |
// | tx ty 1 |
// TODO We'll probably need to get the matrix from the view.
// Canvas.getMatrix() is deprecated since api 16, in favor of
// getting the matrix directly from the view (View.getMatrix).
// Until and unless we re-work this to get it from view,
// suppress the deprecation warning.
Matrix matrix = context.getMatrix();
// ___________
// sx = sqrt(a^2 + c^2)
// ___________
// sy = sqrt( b^2 + d^2)
//
float[] transform = new float[9];
matrix.getValues(transform);
float sx = (float) Math.sqrt(transform[0] * transform[0] + transform[3] * transform[3]);
float sy = (float) Math.sqrt(transform[1] * transform[1] + transform[4] * transform[4]);
// uses the largest scale, in case the scale is non-homogeneous
float maxScale = Math.max(sx, sy);
// save scale so we can restore it
float originalWidth = this.width;
// scale stroke width based on max scale we calculated above
this.width /= maxScale;
// render
super.applyStrokeToPath(path, paint, context);
// restore original stroke width
this.width = originalWidth;
}
}
}