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 }