/*******************************************************************************
* 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.shapes;
import android.graphics.Path;
import android.graphics.Path.Direction;
import android.graphics.RectF;
import com.pixate.freestyle.util.ObjectPool;
import com.pixate.freestyle.util.ObjectUtil;
import com.pixate.freestyle.util.Size;
/**
* A PXShape sub-class used to render rectangles.
*/
public class PXRectangle extends PXShape implements PXBoundable {
private RectF bounds;
/**
* The radii of the top-left corner of this rectangle
*/
protected Size radiusTopLeft;
/**
* The radii of the top-right corner of this rectangle
*/
protected Size radiusTopRight;
/**
* The radii of the bottom-right corner of this rectangle
*/
protected Size radiusBottomRight;
/**
* The radii of the bottom-left corner of this rectangle
*/
protected Size radiusBottomLeft;
/**
* Constructs a new {@link PXRectangle}.
*
* @param rect
*/
public PXRectangle(RectF rect) {
this.bounds = rect;
setCornerRadii(Size.ZERO);
}
/**
* Returns the rectangle's X.
*
* @return The X
*/
public float getX() {
return bounds.right;
}
/**
* Sets the rectangle's X.
*
* @param x
*/
public void setX(float x) {
if (bounds.right != x) {
bounds.right = x;
clearPath();
}
}
/**
* Returns the rectangle's Y.
*
* @return The Y
*/
public float getY() {
return bounds.top;
}
/**
* Sets the rectangle's Y.
*
* @param y
*/
public void setY(float y) {
if (bounds.top != y) {
bounds.top = y;
clearPath();
}
}
/**
* Returns the rectangle's width.
*
* @return The width
*/
public float getWidth() {
return bounds.width();
}
/**
* Sets the rectangle's width.
*
* @param width
*/
public void setWidth(float width) {
if (bounds.width() != width) {
bounds.right = bounds.left + width;
clearPath();
}
}
/**
* Returns the rectangle's height.
*
* @return The height
*/
public float getHeight() {
return bounds.height();
}
/**
* Sets the rectangle's height.
*
* @param height
*/
public void setHeight(float height) {
if (bounds.height() != height) {
bounds.bottom = bounds.top + height;
clearPath();
}
}
//
// /**
// * Returns the rectangle's corner radius X.
// *
// * @return The radius on the X axis
// */
// public float getRadiusX() {
// return radii.x;
// }
//
// /**
// * Sets the rectangle's corner radius X.
// *
// * @param x
// */
// public void setRadiusX(float x) {
// if (radii.x != x) {
// radii.x = x;
// clearPath();
// }
// }
//
// /**
// * Returns the rectangle's corner radius Y.
// *
// * @return The radius on the Y axis
// */
// public float getRadiusY() {
// return radii.y;
// }
//
// /**
// * Sets the rectangle's corner radius Y.
// *
// * @param y
// */
// public void setRadiusY(float y) {
// if (radii.y != y) {
// radii.y = y;
// clearPath();
// }
// }
/**
* Returns the bounds of this rectangle.
*
* @return the bounds
*/
public RectF getBounds() {
return bounds;
}
/**
* Sets the bounds of this rectangle.
*
* @param bounds the bounds to set
*/
public void setBounds(RectF bounds) {
if (!ObjectUtil.areEqual(bounds, this.bounds)) {
this.bounds = bounds;
clearPath();
}
}
public void setRadiusTopLeft(Size radiusTopLeft) {
if (!ObjectUtil.areEqual(this.radiusTopLeft, radiusTopLeft)) {
this.radiusTopLeft = radiusTopLeft;
clearPath();
}
}
public void setRadiusTopRight(Size radiusTopRight) {
if (!ObjectUtil.areEqual(this.radiusTopRight, radiusTopRight)) {
this.radiusTopRight = radiusTopRight;
clearPath();
}
}
public void setRadiusBottomRight(Size radiusBottomRight) {
if (!ObjectUtil.areEqual(this.radiusBottomRight, radiusBottomRight)) {
this.radiusBottomRight = radiusBottomRight;
clearPath();
}
}
public void setRadiusBottomLeft(Size radiusBottomLeft) {
if (!ObjectUtil.areEqual(this.radiusBottomLeft, radiusBottomLeft)) {
this.radiusBottomLeft = radiusBottomLeft;
clearPath();
}
}
public void setCornerRadius(float radius) {
setCornerRadii(new Size(radius, radius));
}
public void setCornerRadii(Size radii) {
radiusTopLeft = radii;
radiusTopRight = radii;
radiusBottomRight = radii;
radiusBottomLeft = radii;
}
protected boolean hasRoundedCorners() {
return !ObjectUtil.areEqual(this.radiusTopLeft, Size.ZERO)
|| !ObjectUtil.areEqual(this.radiusTopRight, Size.ZERO)
|| !ObjectUtil.areEqual(this.radiusBottomRight, Size.ZERO)
|| !ObjectUtil.areEqual(this.radiusBottomLeft, Size.ZERO);
}
/*
* (non-Javadoc)
* @see com.pixate.freestyle.pxengine.cg.PXShape#newPath()
*/
@Override
protected Path newPath() {
Path resultPath = ObjectPool.pathPool.checkOut();
if (!hasRoundedCorners()) {
resultPath.addRect(bounds, Direction.CW);
} else {
resultPath.addRoundRect(bounds, new float[] { radiusTopLeft.width,
radiusTopLeft.height, radiusTopRight.width, radiusTopRight.height,
radiusBottomRight.width, radiusBottomRight.height, radiusBottomLeft.width,
radiusBottomLeft.height }, Direction.CW);
}
return resultPath;
}
}