/******************************************************************************* * 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.math; import java.util.EnumSet; import java.util.HashMap; import java.util.Map; import android.util.DisplayMetrics; /** * Pixate Dimension. */ public class PXDimension { // TODO: move enum-related logic into PXDimensionType enum private static Map<String, PXDimensionType> dimensionMap; static { dimensionMap = new HashMap<String, PXDimensionType>(16); for (PXDimensionType type : EnumSet.allOf(PXDimensionType.class)) { dimensionMap.put(type.toString(), type); } } private float number; private String dimension; private PXDimensionType type; /** * Constructs a new dimension. * * @param number * @param dimension */ public PXDimension(float number, String dimension) { this.number = number; this.dimension = dimension; this.type = dimensionMap.get(dimension); if (this.type == null) { this.type = PXDimensionType.USERDEFINED; } } public boolean isLength() { switch (type) { case PIXELS: case DEVICE_PIXELS: case CENTIMETERS: case MILLIMETERS: case INCHES: case POINTS: case PICAS: return true; default: return false; } } public boolean isAngle() { switch (type) { case DEGREES: case RADIANS: case GRADIANS: return true; default: return false; } } public boolean isTime() { switch (type) { case MILLISECONDS: case SECONDS: return true; default: return false; } } public boolean isMilliseconds() { return type == PXDimensionType.MILLISECONDS; } public boolean isSeconds() { return type == PXDimensionType.SECONDS; } public boolean isFrequency() { switch (type) { case HERTZ: case KILOHERTZ: return true; default: return false; } } public boolean isPercentage() { return (type.equals(PXDimensionType.PERCENTAGE)); } public boolean isUserDefined() { return (type.equals(PXDimensionType.USERDEFINED)); } public float getNumber() { return number; } public PXDimensionType getType() { return type; } public PXDimension degrees() { float result = 0.0f; switch (type) { case DEGREES: result = number; break; case GRADIANS: result = number * 0.9f; break; case RADIANS: result = (float) Math.toDegrees(number); break; default: break; } return new PXDimension(result, PXDimensionType.DEGREES.toString()); } public PXDimension points(DisplayMetrics displayMetrics) { float result = 0.0f; switch (type) { case PIXELS: result = number; break; case DEVICE_PIXELS: result = number * displayMetrics.density; break; case CENTIMETERS: result = (float) (number * 28.346456692913); break; case MILLIMETERS: result = (float) (number * 2.8346456692913); break; case INCHES: result = number * 72; break; case POINTS: result = number; break; case PICAS: result = number * 12; break; default: break; } return new PXDimension(result, PXDimensionType.POINTS.toString()); } public PXDimension radians() { float result = 0.0f; switch (type) { case DEGREES: result = (float) Math.toRadians(number); break; case GRADIANS: result = number * 0.015707963267949f; break; case RADIANS: result = number; break; default: break; } return new PXDimension(result, PXDimensionType.RADIANS.toString()); } @Override public int hashCode() { int hash = 1; hash = hash * 17 + dimension.hashCode(); hash = hash * 31 + (int) (1000 * number); hash = hash * 13 + type.ordinal(); return hash; } @Override public boolean equals(Object o) { if (o instanceof PXDimension) { PXDimension other = (PXDimension) o; return number == other.number && type == other.type && dimension.equals(other.dimension); } return false; } @Override public String toString() { return String.format("%s%s", number, dimension); } }