root/dwt/graphics/ImageLoader.d

Revision 312:ebe343095cf1, 10.7 kB (checked in by Frank Benoit <benoit@tionex.de>, 4 months ago)

Fix tango.core.Array.remove use

Line 
1 /*******************************************************************************
2  * Copyright (c) 2000, 2008 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  *     IBM Corporation - initial API and implementation
10  * Port to the D programming language:
11  *     Frank Benoit <benoit@tionex.de>
12  *******************************************************************************/
13 module dwt.graphics.ImageLoader;
14
15
16 public import dwt.graphics.ImageLoaderListener;
17 public import dwt.graphics.ImageLoaderEvent;
18 public import dwt.graphics.ImageData;
19
20 import dwt.DWT;
21 import dwt.internal.Compatibility;
22 import dwt.internal.image.FileFormat;
23
24 import tango.core.Exception;
25 import tango.core.Array;
26 import dwt.dwthelper.utils;
27
28
29 /**
30  * Instances of this class are used to load images from,
31  * and save images to, a file or stream.
32  * <p>
33  * Currently supported image formats are:
34  * </p><ul>
35  * <li>BMP (Windows or OS/2 Bitmap)</li>
36  * <li>ICO (Windows Icon)</li>
37  * <li>JPEG</li>
38  * <li>GIF</li>
39  * <li>PNG</li>
40  * <li>TIFF</li>
41  * </ul>
42  * <code>ImageLoaders</code> can be used to:
43  * <ul>
44  * <li>load/save single images in all formats</li>
45  * <li>load/save multiple images (GIF/ICO/TIFF)</li>
46  * <li>load/save animated GIF images</li>
47  * <li>load interlaced GIF/PNG images</li>
48  * <li>load progressive JPEG images</li>
49  * </ul>
50  *
51  * @see <a href="http://www.eclipse.org/swt/examples.php">DWT Example: ImageAnalyzer</a>
52  * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a>
53  */
54
55 public class ImageLoader {
56
57     /**
58      * the array of ImageData objects in this ImageLoader.
59      * This array is read in when the load method is called,
60      * and it is written out when the save method is called
61      */
62     public ImageData[] data;
63
64     /**
65      * the width of the logical screen on which the images
66      * reside, in pixels (this corresponds to the GIF89a
67      * Logical Screen Width value)
68      */
69     public int logicalScreenWidth;
70
71     /**
72      * the height of the logical screen on which the images
73      * reside, in pixels (this corresponds to the GIF89a
74      * Logical Screen Height value)
75      */
76     public int logicalScreenHeight;
77
78     /**
79      * the background pixel for the logical screen (this
80      * corresponds to the GIF89a Background Color Index value).
81      * The default is -1 which means 'unspecified background'
82      *
83      */
84     public int backgroundPixel;
85
86     /**
87      * the number of times to repeat the display of a sequence
88      * of animated images (this corresponds to the commonly-used
89      * GIF application extension for "NETSCAPE 2.0 01").
90      * The default is 1. A value of 0 means 'display repeatedly'
91      */
92     public int repeatCount;
93
94     /*
95      * the set of ImageLoader event listeners, created on demand
96      */
97     ImageLoaderListener[] imageLoaderListeners;
98
99 /**
100  * Construct a new empty ImageLoader.
101  */
102 public this() {
103     reset();
104 }
105
106 /**
107  * Resets the fields of the ImageLoader, except for the
108  * <code>imageLoaderListeners</code> field.
109  */
110 void reset() {
111     data = null;
112     logicalScreenWidth = 0;
113     logicalScreenHeight = 0;
114     backgroundPixel = -1;
115     repeatCount = 1;
116 }
117
118 /**
119  * Loads an array of <code>ImageData</code> objects from the
120  * specified input stream. Throws an error if either an error
121  * occurs while loading the images, or if the images are not
122  * of a supported type. Returns the loaded image data array.
123  *
124  * @param stream the input stream to load the images from
125  * @return an array of <code>ImageData</code> objects loaded from the specified input stream
126  *
127  * @exception IllegalArgumentException <ul>
128  *    <li>ERROR_NULL_ARGUMENT - if the stream is null</li>
129  * </ul>
130  * @exception DWTException <ul>
131  *    <li>ERROR_IO - if an IO error occurs while reading from the stream</li>
132  *    <li>ERROR_INVALID_IMAGE - if the image stream contains invalid data</li>
133  *    <li>ERROR_UNSUPPORTED_FORMAT - if the image stream contains an unrecognized format</li>
134  * </ul>
135  */
136 public ImageData[] load(InputStream stream) {
137     if (stream is null) DWT.error(DWT.ERROR_NULL_ARGUMENT);
138     reset();
139     data = FileFormat.load(stream, this);
140     return data;
141 }
142
143 /**
144  * Loads an array of <code>ImageData</code> objects from the
145  * file with the specified name. Throws an error if either
146  * an error occurs while loading the images, or if the images are
147  * not of a supported type. Returns the loaded image data array.
148  *
149  * @param filename the name of the file to load the images from
150  * @return an array of <code>ImageData</code> objects loaded from the specified file
151  *
152  * @exception IllegalArgumentException <ul>
153  *    <li>ERROR_NULL_ARGUMENT - if the file name is null</li>
154  * </ul>
155  * @exception DWTException <ul>
156  *    <li>ERROR_IO - if an IO error occurs while reading from the file</li>
157  *    <li>ERROR_INVALID_IMAGE - if the image file contains invalid data</li>
158  *    <li>ERROR_UNSUPPORTED_FORMAT - if the image file contains an unrecognized format</li>
159  * </ul>
160  */
161 public ImageData[] load(String filename) {
162     if (filename is null) DWT.error(DWT.ERROR_NULL_ARGUMENT);
163     InputStream stream = null;
164     void close(){
165         try {
166             if( stream !is null ) stream.close();
167         } catch (IOException e) {
168             // Ignore error
169         }
170     }
171     try {
172         stream = Compatibility.newFileInputStream(filename);
173         scope(exit) close();
174
175         return load(stream);
176     } catch (IOException e) {
177         DWT.error(DWT.ERROR_IO, e);
178     }
179     return null;
180 }
181
182 /**
183  * Saves the image data in this ImageLoader to the specified stream.
184  * The format parameter can have one of the following values:
185  * <dl>
186  * <dt><code>IMAGE_BMP</code></dt>
187  * <dd>Windows BMP file format, no compression</dd>
188  * <dt><code>IMAGE_BMP_RLE</code></dt>
189  * <dd>Windows BMP file format, RLE compression if appropriate</dd>
190  * <dt><code>IMAGE_GIF</code></dt>
191  * <dd>GIF file format</dd>
192  * <dt><code>IMAGE_ICO</code></dt>
193  * <dd>Windows ICO file format</dd>
194  * <dt><code>IMAGE_JPEG</code></dt>
195  * <dd>JPEG file format</dd>
196  * <dt><code>IMAGE_PNG</code></dt>
197  * <dd>PNG file format</dd>
198  * </dl>
199  *
200  * @param stream the output stream to write the images to
201  * @param format the format to write the images in
202  *
203  * @exception IllegalArgumentException <ul>
204  *    <li>ERROR_NULL_ARGUMENT - if the stream is null</li>
205  * </ul>
206  * @exception DWTException <ul>
207  *    <li>ERROR_IO - if an IO error occurs while writing to the stream</li>
208  *    <li>ERROR_INVALID_IMAGE - if the image data contains invalid data</li>
209  *    <li>ERROR_UNSUPPORTED_FORMAT - if the image data cannot be saved to the requested format</li>
210  * </ul>
211  */
212 public void save(OutputStream stream, int format) {
213     if (stream is null) DWT.error(DWT.ERROR_NULL_ARGUMENT);
214     FileFormat.save(stream, format, this);
215 }
216
217 /**
218  * Saves the image data in this ImageLoader to a file with the specified name.
219  * The format parameter can have one of the following values:
220  * <dl>
221  * <dt><code>IMAGE_BMP</code></dt>
222  * <dd>Windows BMP file format, no compression</dd>
223  * <dt><code>IMAGE_BMP_RLE</code></dt>
224  * <dd>Windows BMP file format, RLE compression if appropriate</dd>
225  * <dt><code>IMAGE_GIF</code></dt>
226  * <dd>GIF file format</dd>
227  * <dt><code>IMAGE_ICO</code></dt>
228  * <dd>Windows ICO file format</dd>
229  * <dt><code>IMAGE_JPEG</code></dt>
230  * <dd>JPEG file format</dd>
231  * <dt><code>IMAGE_PNG</code></dt>
232  * <dd>PNG file format</dd>
233  * </dl>
234  *
235  * @param filename the name of the file to write the images to
236  * @param format the format to write the images in
237  *
238  * @exception IllegalArgumentException <ul>
239  *    <li>ERROR_NULL_ARGUMENT - if the file name is null</li>
240  * </ul>
241  * @exception DWTException <ul>
242  *    <li>ERROR_IO - if an IO error occurs while writing to the file</li>
243  *    <li>ERROR_INVALID_IMAGE - if the image data contains invalid data</li>
244  *    <li>ERROR_UNSUPPORTED_FORMAT - if the image data cannot be saved to the requested format</li>
245  * </ul>
246  */
247 public void save(String filename, int format) {
248     if (filename is null) DWT.error(DWT.ERROR_NULL_ARGUMENT);
249     OutputStream stream = null;
250     try {
251         stream = Compatibility.newFileOutputStream(filename);
252     } catch (IOException e) {
253         DWT.error(DWT.ERROR_IO, e);
254     }
255     save(stream, format);
256     try {
257         stream.close();
258     } catch (IOException e) {
259     }
260 }
261
262 /**
263  * Adds the listener to the collection of listeners who will be
264  * notified when image data is either partially or completely loaded.
265  * <p>
266  * An ImageLoaderListener should be added before invoking
267  * one of the receiver's load methods. The listener's
268  * <code>imageDataLoaded</code> method is called when image
269  * data has been partially loaded, as is supported by interlaced
270  * GIF/PNG or progressive JPEG images.
271  *
272  * @param listener the listener which should be notified
273  *
274  * @exception IllegalArgumentException <ul>
275  *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
276  * </ul>
277  *
278  * @see ImageLoaderListener
279  * @see ImageLoaderEvent
280  */
281 public void addImageLoaderListener(ImageLoaderListener listener) {
282     if (listener is null) DWT.error (DWT.ERROR_NULL_ARGUMENT);
283     imageLoaderListeners ~= listener;
284 }
285
286 /**
287  * Removes the listener from the collection of listeners who will be
288  * notified when image data is either partially or completely loaded.
289  *
290  * @param listener the listener which should no longer be notified
291  *
292  * @exception IllegalArgumentException <ul>
293  *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
294  * </ul>
295  *
296  * @see #addImageLoaderListener(ImageLoaderListener)
297  */
298 public void removeImageLoaderListener(ImageLoaderListener listener) {
299     if (listener is null) DWT.error (DWT.ERROR_NULL_ARGUMENT);
300     if (imageLoaderListeners.length == 0 ) return;
301     imageLoaderListeners.length = tango.core.Array.remove( imageLoaderListeners, listener, delegate bool(ImageLoaderListener l1, ImageLoaderListener l2 ){ return l1 is l2; });
302 }
303
304 /**
305  * Returns <code>true</code> if the receiver has image loader
306  * listeners, and <code>false</code> otherwise.
307  *
308  * @return <code>true</code> if there are <code>ImageLoaderListener</code>s, and <code>false</code> otherwise
309  *
310  * @see #addImageLoaderListener(ImageLoaderListener)
311  * @see #removeImageLoaderListener(ImageLoaderListener)
312  */
313 public bool hasListeners() {
314     return imageLoaderListeners.length > 0;
315 }
316
317 /**
318  * Notifies all image loader listeners that an image loader event
319  * has occurred. Pass the specified event object to each listener.
320  *
321  * @param event the <code>ImageLoaderEvent</code> to send to each <code>ImageLoaderListener</code>
322  */
323 public void notifyListeners(ImageLoaderEvent event) {
324     if (!hasListeners()) return;
325     foreach( listener; imageLoaderListeners ){
326         listener.imageDataLoaded(event);
327     }
328 }
329
330 }
Note: See TracBrowser for help on using the browser.