blob: 9701a04521cf1b4702f25dee15b1858c1b5e1f10 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 1995-2003 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26package sun.awt.image;
27
28import java.util.Hashtable;
29import java.io.InputStream;
30import java.io.IOException;
31import java.awt.image.*;
32
33public abstract class ImageDecoder {
34 InputStreamImageSource source;
35 InputStream input;
36 Thread feeder;
37
38 protected boolean aborted;
39 protected boolean finished;
40 ImageConsumerQueue queue;
41 ImageDecoder next;
42
43 public ImageDecoder(InputStreamImageSource src, InputStream is) {
44 source = src;
45 input = is;
46 feeder = Thread.currentThread();
47 }
48
49 public boolean isConsumer(ImageConsumer ic) {
50 return ImageConsumerQueue.isConsumer(queue, ic);
51 }
52
53 public void removeConsumer(ImageConsumer ic) {
54 queue = ImageConsumerQueue.removeConsumer(queue, ic, false);
55 if (!finished && queue == null) {
56 abort();
57 }
58 }
59
60 protected ImageConsumerQueue nextConsumer(ImageConsumerQueue cq) {
61 synchronized (source) {
62 if (aborted) {
63 return null;
64 }
65 cq = ((cq == null) ? queue : cq.next);
66 while (cq != null) {
67 if (cq.interested) {
68 return cq;
69 }
70 cq = cq.next;
71 }
72 }
73 return null;
74 }
75
76 protected int setDimensions(int w, int h) {
77 ImageConsumerQueue cq = null;
78 int count = 0;
79 while ((cq = nextConsumer(cq)) != null) {
80 cq.consumer.setDimensions(w, h);
81 count++;
82 }
83 return count;
84 }
85
86 protected int setProperties(Hashtable props) {
87 ImageConsumerQueue cq = null;
88 int count = 0;
89 while ((cq = nextConsumer(cq)) != null) {
90 cq.consumer.setProperties(props);
91 count++;
92 }
93 return count;
94 }
95
96 protected int setColorModel(ColorModel model) {
97 ImageConsumerQueue cq = null;
98 int count = 0;
99 while ((cq = nextConsumer(cq)) != null) {
100 cq.consumer.setColorModel(model);
101 count++;
102 }
103 return count;
104 }
105
106 protected int setHints(int hints) {
107 ImageConsumerQueue cq = null;
108 int count = 0;
109 while ((cq = nextConsumer(cq)) != null) {
110 cq.consumer.setHints(hints);
111 count++;
112 }
113 return count;
114 }
115
116 protected void headerComplete() {
117 feeder.setPriority(ImageFetcher.LOW_PRIORITY);
118 }
119
120 protected int setPixels(int x, int y, int w, int h, ColorModel model,
121 byte pix[], int off, int scansize) {
122 source.latchConsumers(this);
123 ImageConsumerQueue cq = null;
124 int count = 0;
125 while ((cq = nextConsumer(cq)) != null) {
126 cq.consumer.setPixels(x, y, w, h, model, pix, off, scansize);
127 count++;
128 }
129 return count;
130 }
131
132 protected int setPixels(int x, int y, int w, int h, ColorModel model,
133 int pix[], int off, int scansize) {
134 source.latchConsumers(this);
135 ImageConsumerQueue cq = null;
136 int count = 0;
137 while ((cq = nextConsumer(cq)) != null) {
138 cq.consumer.setPixels(x, y, w, h, model, pix, off, scansize);
139 count++;
140 }
141 return count;
142 }
143
144 protected int imageComplete(int status, boolean done) {
145 source.latchConsumers(this);
146 if (done) {
147 finished = true;
148 source.doneDecoding(this);
149 }
150 ImageConsumerQueue cq = null;
151 int count = 0;
152 while ((cq = nextConsumer(cq)) != null) {
153 cq.consumer.imageComplete(status);
154 count++;
155 }
156 return count;
157 }
158
159 public abstract void produceImage() throws IOException,
160 ImageFormatException;
161
162 public void abort() {
163 aborted = true;
164 source.doneDecoding(this);
165 close();
166 java.security.AccessController.doPrivileged(
167 new java.security.PrivilegedAction() {
168 public Object run() {
169 feeder.interrupt();
170 return null;
171 }
172 });
173 }
174
175 public synchronized void close() {
176 if (input != null) {
177 try {
178 input.close();
179 } catch (IOException e) {
180 }
181 }
182 }
183}