1 /* ImageReader.java -- Decodes raster images.
2 Copyright (C) 2004 Free Software Foundation, Inc.
4 This file is part of GNU Classpath.
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library. Thus, the terms and
23 conditions of the GNU General Public License cover the whole
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module. An independent module is a module which is not derived from
33 or based on this library. If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so. If you do not wish to do so, delete this
36 exception statement from your version. */
39 package javax.imageio;
41 import java.awt.image.BufferedImage;
42 import java.awt.image.Raster;
43 import java.io.IOException;
44 import java.util.ArrayList;
45 import java.util.Iterator;
46 import java.util.List;
47 import java.util.Locale;
49 import javax.imageio.event.IIOReadProgressListener;
50 import javax.imageio.event.IIOReadUpdateListener;
51 import javax.imageio.event.IIOReadWarningListener;
52 import javax.imageio.metadata.IIOMetadata;
53 import javax.imageio.spi.ImageReaderSpi;
54 import javax.imageio.stream.ImageInputStream;
56 public abstract class ImageReader
58 private boolean aborted;
60 protected Locale[] availableLocales;
61 protected boolean ignoreMetadata;
62 protected Object input;
63 protected Locale locale;
64 protected int minIndex;
65 protected ImageReaderSpi originatingProvider;
66 protected List progressListeners = new ArrayList();
67 protected boolean seekForwardOnly;
68 protected List updateListeners = new ArrayList();
69 protected List warningListeners = new ArrayList();
70 protected List warningLocales = new ArrayList();
72 protected ImageReader(ImageReaderSpi originatingProvider)
74 this.originatingProvider = originatingProvider;
82 protected boolean abortRequested()
87 public void addIIOReadProgressListener(IIOReadProgressListener listener)
92 progressListeners.add(listener);
95 public void addIIOReadUpdateListener(IIOReadUpdateListener listener)
100 updateListeners.add(listener);
103 public void addIIOReadWarningListener(IIOReadWarningListener listener)
105 if (listener == null)
108 warningListeners.add(listener);
111 public boolean canReadRaster()
116 protected void clearAbortRequest()
121 public void dispose()
123 // The default implementation does nothing.
126 public float getAspectRatio(int imageIndex)
129 return (float) (getWidth(imageIndex) / getHeight(imageIndex));
132 public Locale[] getAvailableLocales()
134 if (availableLocales == null)
137 return (Locale[]) availableLocales.clone();
140 public ImageReadParam getDefaultReadParam()
142 return new ImageReadParam();
145 public String getFormatName()
148 return originatingProvider.getFormatNames()[0];
151 public abstract int getHeight(int imageIndex)
154 public abstract IIOMetadata getImageMetadata(int imageIndex)
157 public abstract Iterator getImageTypes(int imageIndex)
160 public void setInput(Object input,
161 boolean seekForwardOnly,
162 boolean ignoreMetadata)
164 Class[] okClasses = originatingProvider.getInputTypes();
165 if (okClasses == null)
167 if (!(input instanceof ImageInputStream))
168 throw new IllegalArgumentException();
172 boolean classOk = false;
173 for (int i = 0; i < okClasses.length; ++i)
174 if (okClasses[i].isInstance(input))
177 throw new IllegalArgumentException();
181 this.seekForwardOnly = seekForwardOnly;
182 this.ignoreMetadata = ignoreMetadata;
186 public void setInput(Object in, boolean seekForwardOnly)
188 setInput(in, seekForwardOnly, false);
191 public void setInput(Object in)
193 setInput(in, false, false);
196 public Object getInput()
201 public Locale getLocale()
206 public abstract int getNumImages(boolean allowSearch)
209 public int getNumThumbnails(int imageIndex)
215 public ImageReaderSpi getOriginatingProvider()
217 return originatingProvider;
220 public abstract IIOMetadata getStreamMetadata()
223 public int getThumbnailHeight(int imageIndex, int thumbnailIndex)
226 return readThumbnail(imageIndex, thumbnailIndex).getHeight();
229 public int getThumbnailWidth(int imageIndex, int thumbnailIndex)
232 return readThumbnail(imageIndex, thumbnailIndex).getWidth();
235 public int getTileGridXOffset(int imageIndex)
241 public int getTileGridYOffset(int imageIndex)
247 public int getTileHeight(int imageIndex)
250 return getHeight(imageIndex);
253 public int getTileWidth(int imageIndex)
256 return getWidth(imageIndex);
259 public abstract int getWidth(int imageIndex)
262 public boolean hasThumbnails(int imageIndex)
265 return getNumThumbnails(imageIndex) > 0;
268 public boolean isIgnoringMetadata()
270 return ignoreMetadata;
273 public boolean isImageTiled(int imageIndex)
279 public boolean isRandomAccessEasy(int imageIndex)
285 public boolean isSeekForwardOnly()
287 return seekForwardOnly;
290 protected void processImageComplete()
292 Iterator it = progressListeners.iterator();
296 IIOReadProgressListener listener = (IIOReadProgressListener) it.next();
297 listener.imageComplete (this);
301 protected void processImageProgress(float percentageDone)
303 Iterator it = progressListeners.iterator();
307 IIOReadProgressListener listener = (IIOReadProgressListener) it.next();
308 listener.imageProgress(this, percentageDone);
312 protected void processImageStarted(int imageIndex)
314 Iterator it = progressListeners.iterator();
318 IIOReadProgressListener listener = (IIOReadProgressListener) it.next();
319 listener.imageStarted(this, imageIndex);
323 protected void processImageUpdate(BufferedImage image, int minX, int minY,
324 int width, int height, int periodX,
325 int periodY, int[] bands)
327 Iterator it = updateListeners.iterator();
331 IIOReadUpdateListener listener = (IIOReadUpdateListener) it.next();
332 listener.imageUpdate(this, image, minX, minY, width, height, periodX,
337 protected void processPassComplete(BufferedImage image)
339 Iterator it = updateListeners.iterator();
343 IIOReadUpdateListener listener = (IIOReadUpdateListener) it.next();
344 listener.passComplete(this, image);
348 protected void processPassStarted(BufferedImage image, int pass, int minPass,
349 int maxPass, int minX, int minY,
350 int periodX, int periodY, int[] bands)
352 Iterator it = updateListeners.iterator();
356 IIOReadUpdateListener listener = (IIOReadUpdateListener) it.next();
357 listener.passStarted(this, image, pass, minPass, maxPass, minX, minY,
358 periodX, periodY, bands);
362 protected void processReadAborted()
364 Iterator it = progressListeners.iterator();
368 IIOReadProgressListener listener = (IIOReadProgressListener) it.next();
369 listener.readAborted(this);
373 protected void processSequenceComplete()
375 Iterator it = progressListeners.iterator();
379 IIOReadProgressListener listener = (IIOReadProgressListener) it.next();
380 listener.sequenceComplete(this);
384 protected void processSequenceStarted(int minIndex)
386 Iterator it = progressListeners.iterator();
390 IIOReadProgressListener listener = (IIOReadProgressListener) it.next();
391 listener.sequenceStarted(this, minIndex);
395 protected void processThumbnailComplete()
397 Iterator it = progressListeners.iterator();
401 IIOReadProgressListener listener = (IIOReadProgressListener) it.next();
402 listener.thumbnailComplete(this);
406 protected void processThumbnailPassComplete(BufferedImage thumbnail)
408 Iterator it = updateListeners.iterator();
412 IIOReadUpdateListener listener = (IIOReadUpdateListener) it.next();
413 listener.thumbnailPassComplete(this, thumbnail);
417 protected void processThumbnailPassStarted(BufferedImage thumbnail, int pass,
418 int minPass, int maxPass, int minX,
419 int minY, int periodX, int periodY,
422 Iterator it = updateListeners.iterator();
426 IIOReadUpdateListener listener = (IIOReadUpdateListener) it.next();
427 listener.thumbnailPassStarted(this, thumbnail, pass, minPass, maxPass,
428 minX, minY, periodX, periodY, bands);
432 protected void processThumbnailProgress(float percentageDone)
434 Iterator it = progressListeners.iterator();
438 IIOReadProgressListener listener = (IIOReadProgressListener) it.next();
439 listener.thumbnailProgress(this, percentageDone);
443 protected void processThumbnailStarted(int imageIndex, int thumbnailIndex)
445 Iterator it = progressListeners.iterator();
449 IIOReadProgressListener listener = (IIOReadProgressListener) it.next();
450 listener.thumbnailStarted(this, imageIndex, thumbnailIndex);
454 protected void processThumbnailUpdate(BufferedImage image, int minX, int minY,
455 int width, int height, int periodX,
456 int periodY, int[] bands)
458 Iterator it = updateListeners.iterator();
462 IIOReadUpdateListener listener = (IIOReadUpdateListener) it.next();
463 listener.thumbnailUpdate(this, image, minX, minY, width, height,
464 periodX, periodY, bands);
468 protected void processWarningOccurred(String warning)
470 Iterator it = warningListeners.iterator();
474 IIOReadWarningListener listener = (IIOReadWarningListener) it.next();
475 listener.warningOccurred(this, warning);
479 public abstract BufferedImage read(int imageIndex, ImageReadParam param)
482 public boolean readerSupportsThumbnails()
487 public Raster readRaster(int imageIndex, ImageReadParam param)
490 throw new UnsupportedOperationException();
493 public BufferedImage readThumbnail(int imageIndex, int thumbnailIndex)
496 throw new UnsupportedOperationException();
499 public void removeAllIIOReadProgressListeners()
501 progressListeners.clear();
504 public void removeAllIIOReadUpdateListeners()
506 updateListeners.clear();
509 public void removeAllIIOReadWarningListeners()
511 warningListeners.clear();
514 public void removeIIOReadProgressListener(IIOReadProgressListener listener)
516 if (listener == null)
519 progressListeners.remove(listener);
522 public void removeIIOReadUpdateListener(IIOReadUpdateListener listener)
524 if (listener == null)
527 updateListeners.remove(listener);
530 public void removeIIOReadWarningListener(IIOReadWarningListener listener)
532 if (listener == null)
535 warningListeners.remove(listener);
538 public void setLocale(Locale locale)
542 // Check if its a valid locale.
543 boolean found = false;
545 if (availableLocales != null)
546 for (int i = availableLocales.length - 1; i >= 0; --i)
547 if (availableLocales[i].equals(locale))
551 throw new IllegalArgumentException("looale not available");
554 this.locale = locale;