001/* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017package org.apache.commons.imaging; 018 019/** 020 * Used to specify pixel density and physical dimensions when reading or storing image information. 021 */ 022public final class PixelDensity { 023 private static final int PIXEL_NO_UNIT = 0; 024 private static final int PIXEL_PER_INCH = 254; 025 private static final int PIXEL_PER_METRE = 10000; 026 private static final int PIXEL_PER_CENTIMETRE = 100; 027 028 public static PixelDensity createFromPixelsPerCentimetre(final double x, final double y) { 029 return new PixelDensity(x, y, PIXEL_PER_CENTIMETRE); 030 } 031 032 public static PixelDensity createFromPixelsPerInch(final double x, final double y) { 033 return new PixelDensity(x, y, PIXEL_PER_INCH); 034 } 035 036 public static PixelDensity createFromPixelsPerMetre(final double x, final double y) { 037 return new PixelDensity(x, y, PIXEL_PER_METRE); 038 } 039 040 public static PixelDensity createUnitless(final double x, final double y) { 041 return new PixelDensity(x, y, PIXEL_NO_UNIT); 042 } 043 044 private final double horizontalDensity; 045 046 private final double verticalDensity; 047 048 // / One-tenth of a millimetre units. 049 private final int unitLength; 050 051 private PixelDensity(final double horizontalDensity, final double verticalDensity, final int unitLength) { 052 this.horizontalDensity = horizontalDensity; 053 this.verticalDensity = verticalDensity; 054 this.unitLength = unitLength; 055 } 056 057 public double getRawHorizontalDensity() { 058 return horizontalDensity; 059 } 060 061 public double getRawVerticalDensity() { 062 return verticalDensity; 063 } 064 065 public double horizontalDensityCentimetres() { 066 if (isInCentimetres()) { 067 return horizontalDensity; 068 } 069 return horizontalDensity * PIXEL_PER_CENTIMETRE / unitLength; 070 } 071 072 public double horizontalDensityInches() { 073 if (isInInches()) { 074 return horizontalDensity; 075 } 076 return horizontalDensity * PIXEL_PER_INCH / unitLength; 077 } 078 079 public double horizontalDensityMetres() { 080 if (isInMetres()) { 081 return horizontalDensity; 082 } 083 return horizontalDensity * PIXEL_PER_METRE / unitLength; 084 } 085 086 public boolean isInCentimetres() { 087 return unitLength == PIXEL_PER_CENTIMETRE; 088 } 089 090 public boolean isInInches() { 091 return unitLength == PIXEL_PER_INCH; 092 } 093 094 public boolean isInMetres() { 095 return unitLength == PIXEL_PER_METRE; 096 } 097 098 public boolean isUnitless() { 099 return unitLength == PIXEL_NO_UNIT; 100 } 101 102 public double verticalDensityCentimetres() { 103 if (isInCentimetres()) { 104 return verticalDensity; 105 } 106 return verticalDensity * PIXEL_PER_CENTIMETRE / unitLength; 107 } 108 109 public double verticalDensityInches() { 110 if (isInInches()) { 111 return verticalDensity; 112 } 113 return verticalDensity * PIXEL_PER_INCH / unitLength; 114 } 115 116 public double verticalDensityMetres() { 117 if (isInMetres()) { 118 return verticalDensity; 119 } 120 return verticalDensity * PIXEL_PER_METRE / unitLength; 121 } 122}