SourceForge: jiu/jiu: changeset 47:baf5bbe6df53
PNMCodec: converted IMAGE_TYPE constants to an ImageType enum java-1.5
authorKnut Arild Erstad <knutae@gmail.com>
Fri Aug 07 23:30:59 2009 +0200 (3 months ago)
branchjava-1.5
changeset 47baf5bbe6df53
parent 46b8b151dca207
child 48abe6a803a32c
PNMCodec: converted IMAGE_TYPE constants to an ImageType enum
net/sourceforge/jiu/codecs/PNMCodec.java
     1.1 --- a/net/sourceforge/jiu/codecs/PNMCodec.java	Fri Aug 07 23:03:26 2009 +0200
     1.2 +++ b/net/sourceforge/jiu/codecs/PNMCodec.java	Fri Aug 07 23:30:59 2009 +0200
     1.3 @@ -33,6 +33,7 @@
     1.4  import net.sourceforge.jiu.ops.MissingParameterException;
     1.5  import net.sourceforge.jiu.ops.OperationFailedException;
     1.6  import net.sourceforge.jiu.ops.WrongParameterException;
     1.7 +import net.sourceforge.jiu.util.EnumHelper;
     1.8  
     1.9  /**
    1.10   * A codec to read and write Portable Anymap (PNM) image files.
    1.11 @@ -101,29 +102,45 @@
    1.12  public class PNMCodec extends ImageCodec
    1.13  {
    1.14  	/**
    1.15 -	 * Image type constant for images of unknown type.
    1.16 +	 * Enumerates the possible image types.
    1.17 +	 * Note that the ordinal value of each enum value is significant,
    1.18 +	 * since it is currently used when loading and saving files.
    1.19  	 */
    1.20 -	public static final int IMAGE_TYPE_UNKNOWN = -1;
    1.21 +	public enum ImageType
    1.22 +	{
    1.23 +		/**
    1.24 +		 * For bilevel images, stored in PBM files.
    1.25 +		 */
    1.26 +		BILEVEL (".pbm"),
    1.27 +		/**
    1.28 +		 * For grayscale images, stored in PGM files.
    1.29 +		 */
    1.30 +		GRAY (".pgm"),
    1.31 +		/**
    1.32 +		 * For RGB truecolor images, stored in PPM files.
    1.33 +		 */
    1.34 +		COLOR (".ppm");
    1.35 +		
    1.36 +		private String fileExtension;
    1.37 +		
    1.38 +		private ImageType(String fileExtension)
    1.39 +		{
    1.40 +			this.fileExtension = fileExtension;
    1.41 +		}
    1.42 +		
    1.43 +		/**
    1.44 +		 * Get the suggested file extension for the image type.
    1.45 +		 * @return a lower case file extension, including the . (dot) character.
    1.46 +		 */
    1.47 +		public String getFileExtension()
    1.48 +		{
    1.49 +			return fileExtension;
    1.50 +		}
    1.51 +	}
    1.52  
    1.53 -	/**
    1.54 -	 * Image type constant for bilevel images, stored in PBM files.
    1.55 -	 */
    1.56 -	public static final int IMAGE_TYPE_BILEVEL = 0;
    1.57 -
    1.58 -	/**
    1.59 -	 * Image type constant for grayscale images, stored in PGM files.
    1.60 -	 */
    1.61 -	public static final int IMAGE_TYPE_GRAY = 1;
    1.62 -
    1.63 -	/**
    1.64 -	 * Image type constant for RGB truecolor images, stored in PPM files.
    1.65 -	 */
    1.66 -	public static final int IMAGE_TYPE_COLOR = 2;
    1.67 -	private static final String[] IMAGE_TYPE_FILE_EXTENSIONS = 
    1.68 -		{".pbm", ".pgm", ".ppm"};
    1.69  	private Boolean ascii;
    1.70  	private int columns;
    1.71 -	private int imageType;
    1.72 +	private ImageType imageType;
    1.73  	private PushbackInputStream in;
    1.74  	private DataOutput out;
    1.75  	private int height;
    1.76 @@ -133,32 +150,32 @@
    1.77  	/**
    1.78  	 * Attempts to find the appropriate image type by looking at a file's name.	
    1.79  	 * Ignores case when comparing.
    1.80 -	 * Returns {@link #IMAGE_TYPE_BILEVEL} for <code>.pbm</code>,
    1.81 -	 * {@link #IMAGE_TYPE_GRAY} for <code>.pgm</code> and
    1.82 -	 * {@link #IMAGE_TYPE_COLOR} for <code>.ppm</code>.
    1.83 -	 * Otherwise, {@link #IMAGE_TYPE_UNKNOWN} is returned.
    1.84 +	 * Returns {@link ImageType#BILEVEL} for <code>.pbm</code>,
    1.85 +	 * {@link ImageType#GRAY} for <code>.pgm</code> and
    1.86 +	 * {@link ImageType#COLOR} for <code>.ppm</code>.
    1.87 +	 * Otherwise, <code>null</code> is returned.
    1.88  	 * To get a file extension given that you have an image type, use
    1.89 -	 * {@link #getTypicalFileExtension}.
    1.90 +	 * {@link ImageType#getFileExtension()}.
    1.91  	 * 
    1.92  	 * @param fileName the file name to be examined
    1.93 -	 * @return one of the <code>IMAGE_TYPE_xxx</code> constants of this class
    1.94 +	 * @return an {@link ImageType} enum value, or <code>null</code>
    1.95  	 */
    1.96 -	public static int determineImageTypeFromFileName(String fileName)
    1.97 +	public static ImageType determineImageTypeFromFileName(String fileName)
    1.98  	{
    1.99  		if (fileName == null || fileName.length() < 4)
   1.100  		{
   1.101 -			return IMAGE_TYPE_UNKNOWN;
   1.102 +			return null;
   1.103  		}
   1.104  		String ext = fileName.substring(fileName.length() - 3);
   1.105  		ext = ext.toLowerCase();
   1.106 -		for (int i = 0; i < IMAGE_TYPE_FILE_EXTENSIONS.length; i++)
   1.107 +		for (ImageType type: ImageType.values())
   1.108  		{
   1.109 -			if (IMAGE_TYPE_FILE_EXTENSIONS[i].equals(ext))
   1.110 +			if (type.getFileExtension().equals(ext))
   1.111  			{
   1.112 -				return i;
   1.113 +				return type;
   1.114  			}
   1.115  		}
   1.116 -		return IMAGE_TYPE_UNKNOWN;
   1.117 +		return null;
   1.118  	}
   1.119  
   1.120  	/**
   1.121 @@ -184,28 +201,6 @@
   1.122  			"image/x-portable-anymap"};
   1.123  	}
   1.124  
   1.125 -	/**
   1.126 -	 * Returns the typical file extension (including leading dot) for an
   1.127 -	 * image type.
   1.128 -	 * Returns <code>null</code> for {@link #IMAGE_TYPE_UNKNOWN}.
   1.129 -	 * To get the image type given that you have a file name, use
   1.130 -	 * {@link #determineImageTypeFromFileName}.
   1.131 -	 *
   1.132 -	 * @param imageType the image type for which the extension is required
   1.133 -	 * @return the file extension or null
   1.134 -	 */
   1.135 -	public static String getTypicalFileExtension(int imageType)
   1.136 -	{
   1.137 -		if (imageType >= 0 && imageType < IMAGE_TYPE_FILE_EXTENSIONS.length)
   1.138 -		{
   1.139 -			return IMAGE_TYPE_FILE_EXTENSIONS[imageType];
   1.140 -		}
   1.141 -		else
   1.142 -		{
   1.143 -			return null;
   1.144 -		}
   1.145 -	}
   1.146 -
   1.147  	public boolean isLoadingSupported()
   1.148  	{
   1.149  		return true;
   1.150 @@ -252,7 +247,7 @@
   1.151  		String resolutionLine = loadTextLine();
   1.152  		setResolution(resolutionLine);
   1.153  		setBoundsIfNecessary(width, height);
   1.154 -		if (imageType == IMAGE_TYPE_BILEVEL)
   1.155 +		if (imageType == ImageType.BILEVEL)
   1.156  		{
   1.157  			maxSample = 1;
   1.158  		}
   1.159 @@ -269,17 +264,17 @@
   1.160  		checkImageResolution();
   1.161  		switch (imageType)
   1.162  		{
   1.163 -			case(IMAGE_TYPE_BILEVEL):
   1.164 +			case BILEVEL:
   1.165  			{
   1.166  				loadBilevelImage();
   1.167  				break;
   1.168  			}
   1.169 -			case(IMAGE_TYPE_COLOR):
   1.170 +			case COLOR:
   1.171  			{
   1.172  				loadColorImage();
   1.173  				break;
   1.174  			}
   1.175 -			case(IMAGE_TYPE_GRAY):
   1.176 +			case GRAY:
   1.177  			{
   1.178  				loadGrayImage();
   1.179  				break;
   1.180 @@ -786,7 +781,7 @@
   1.181  		ascii = new Boolean(v2 < 0x34);
   1.182  		// determine image type from second byte
   1.183  		v2 = v2 - 0x30;
   1.184 -		imageType = (v2 - 1) % 3;
   1.185 +		imageType = EnumHelper.fromOrdinal(ImageType.values(), (v2 - 1) % 3);
   1.186  		// skip LF and CR
   1.187  		int b;
   1.188  		do
   1.189 @@ -849,35 +844,35 @@
   1.190  		setBoundsIfNecessary(width, height);
   1.191  		if (image instanceof RGB24Image)
   1.192  		{
   1.193 -			imageType = IMAGE_TYPE_COLOR;
   1.194 +			imageType = ImageType.COLOR;
   1.195  			maxSample = 255;
   1.196  			save((RGB24Image)image);
   1.197  		}
   1.198  		else
   1.199  		if (image instanceof RGB48Image)
   1.200  		{
   1.201 -			imageType = IMAGE_TYPE_COLOR;
   1.202 +			imageType = ImageType.COLOR;
   1.203  			maxSample = 65535;
   1.204  			save((RGB48Image)image);
   1.205  		}
   1.206  		else
   1.207  		if (image instanceof BilevelImage)
   1.208  		{
   1.209 -			imageType = IMAGE_TYPE_BILEVEL;
   1.210 +			imageType = ImageType.BILEVEL;
   1.211  			maxSample = 1;
   1.212  			save((BilevelImage)image);
   1.213  		}
   1.214  		else
   1.215  		if (image instanceof Gray8Image)
   1.216  		{
   1.217 -			imageType = IMAGE_TYPE_GRAY;
   1.218 +			imageType = ImageType.GRAY;
   1.219  			maxSample = 255;
   1.220  			save((Gray8Image)image);
   1.221  		}
   1.222  		else
   1.223  		if (image instanceof Gray16Image)
   1.224  		{
   1.225 -			imageType = IMAGE_TYPE_GRAY;
   1.226 +			imageType = ImageType.GRAY;
   1.227  			maxSample = 65535;
   1.228  			save((Gray16Image)image);
   1.229  		}
   1.230 @@ -1123,7 +1118,7 @@
   1.231  	private void saveHeader() throws IOException
   1.232  	{
   1.233  		out.write(80); // 'P'
   1.234 -		int pnmType = 49 + imageType;
   1.235 +		int pnmType = 49 + imageType.ordinal();
   1.236  		if (getAscii() == null)
   1.237  		{
   1.238  			setAscii(maxSample > 255);
   1.239 @@ -1138,7 +1133,7 @@
   1.240  		out.write(32); // space
   1.241  		saveAsciiNumber(getBoundsHeight());
   1.242  		out.write(10); // line feed
   1.243 -		if (imageType != IMAGE_TYPE_BILEVEL)
   1.244 +		if (imageType != ImageType.BILEVEL)
   1.245  		{
   1.246  			// bilevel max sample is always 1 and MUST NOT be saved
   1.247  			saveAsciiNumber(maxSample);
   1.248 @@ -1238,17 +1233,17 @@
   1.249  		}
   1.250  		if (image instanceof BilevelImage)
   1.251  		{
   1.252 -			return IMAGE_TYPE_FILE_EXTENSIONS[IMAGE_TYPE_BILEVEL];
   1.253 +			return ImageType.BILEVEL.getFileExtension();
   1.254  		}
   1.255  		else
   1.256  		if (image instanceof GrayImage)
   1.257  		{
   1.258 -			return IMAGE_TYPE_FILE_EXTENSIONS[IMAGE_TYPE_GRAY];
   1.259 +			return ImageType.GRAY.getFileExtension();
   1.260  		}
   1.261  		else
   1.262  		if (image instanceof RGB24Image)
   1.263  		{
   1.264 -			return IMAGE_TYPE_FILE_EXTENSIONS[IMAGE_TYPE_COLOR];
   1.265 +			return ImageType.COLOR.getFileExtension();
   1.266  		}
   1.267  		return null;
   1.268  	}