History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/sun/awt/image/OffScreenImageSource.java (1 of 18352 files). Show all

Unified · Split

java/pkg/sun/awt/image/OffScreenImageSource.java+195−0
@@ -0,0 +1,195 @@
1/*
2 * Copyright (c) 1995, 2003, Oracle and/or its affiliates. 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. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package sun.awt.image;
27
28import java.util.Hashtable;
29import java.awt.image.ImageConsumer;
30import java.awt.image.ImageProducer;
31import java.awt.image.Raster;
32import java.awt.image.WritableRaster;
33import java.awt.image.ColorModel;
34import java.awt.image.IndexColorModel;
35import java.awt.image.DirectColorModel;
36import java.awt.image.BufferedImage;
37import java.awt.image.DataBuffer;
38
39public class OffScreenImageSource implements ImageProducer {
40 BufferedImage image;
41 int width;
42 int height;
43 Hashtable properties;
44
45 public OffScreenImageSource(BufferedImage image,
46 Hashtable properties) {
47 this.image = image;
48 if (properties != null) {
49 this.properties = properties;
50 } else {
51 this.properties = new Hashtable();
52 }
53 width = image.getWidth();
54 height = image.getHeight();
55 }
56
57 public OffScreenImageSource(BufferedImage image) {
58 this(image, null);
59 }
60
61 // We can only have one consumer since we immediately return the data...
62 private ImageConsumer theConsumer;
63
64 public synchronized void addConsumer(ImageConsumer ic) {
65 theConsumer = ic;
66 produce();
67 }
68
69 public synchronized boolean isConsumer(ImageConsumer ic) {
70 return (ic == theConsumer);
71 }
72
73 public synchronized void removeConsumer(ImageConsumer ic) {
74 if (theConsumer == ic) {
75 theConsumer = null;
76 }
77 }
78
79 public void startProduction(ImageConsumer ic) {
80 addConsumer(ic);
81 }
82
83 public void requestTopDownLeftRightResend(ImageConsumer ic) {
84 }
85
86 private void sendPixels() {
87 ColorModel cm = image.getColorModel();
88 WritableRaster raster = image.getRaster();
89 int numDataElements = raster.getNumDataElements();
90 int dataType = raster.getDataBuffer().getDataType();
91 int[] scanline = new int[width*numDataElements];
92 boolean needToCvt = true;
93
94 if (cm instanceof IndexColorModel) {
95 byte[] pixels = new byte[width];
96 theConsumer.setColorModel(cm);
97
98 if (raster instanceof ByteComponentRaster) {
99 needToCvt = false;
100 for (int y=0; y < height; y++) {
101 raster.getDataElements(0, y, width, 1, pixels);
102 theConsumer.setPixels(0, y, width, 1, cm, pixels, 0,
103 width);
104 }
105 }
106 else if (raster instanceof BytePackedRaster) {
107 needToCvt = false;
108 // Binary image. Need to unpack it
109 for (int y=0; y < height; y++) {
110 raster.getPixels(0, y, width, 1, scanline);
111 for (int x=0; x < width; x++) {
112 pixels[x] = (byte) scanline[x];
113 }
114 theConsumer.setPixels(0, y, width, 1, cm, pixels, 0,
115 width);
116 }
117 }
118 else if (dataType == DataBuffer.TYPE_SHORT ||
119 dataType == DataBuffer.TYPE_INT)
120 {
121 // Probably a short or int "GRAY" image
122 needToCvt = false;
123 for (int y=0; y < height; y++) {
124 raster.getPixels(0, y, width, 1, scanline);
125 theConsumer.setPixels(0, y, width, 1, cm, scanline, 0,
126 width);
127 }
128 }
129 }
130 else if (cm instanceof DirectColorModel) {
131 theConsumer.setColorModel(cm);
132 needToCvt = false;
133 switch (dataType) {
134 case DataBuffer.TYPE_INT:
135 for (int y=0; y < height; y++) {
136 raster.getDataElements(0, y, width, 1, scanline);
137 theConsumer.setPixels(0, y, width, 1, cm, scanline, 0,
138 width);
139 }
140 break;
141 case DataBuffer.TYPE_BYTE:
142 byte[] bscanline = new byte[width];
143 for (int y=0; y < height; y++) {
144 raster.getDataElements(0, y, width, 1, bscanline);
145 for (int x=0; x < width; x++) {
146 scanline[x] = bscanline[x]&0xff;
147 }
148 theConsumer.setPixels(0, y, width, 1, cm, scanline, 0,
149 width);
150 }
151 break;
152 case DataBuffer.TYPE_USHORT:
153 short[] sscanline = new short[width];
154 for (int y=0; y < height; y++) {
155 raster.getDataElements(0, y, width, 1, sscanline);
156 for (int x=0; x < width; x++) {
157 scanline[x] = sscanline[x]&0xffff;
158 }
159 theConsumer.setPixels(0, y, width, 1, cm, scanline, 0,
160 width);
161 }
162 break;
163 default:
164 needToCvt = true;
165 }
166 }
167
168 if (needToCvt) {
169 // REMIND: Need to add other types of CMs here
170 ColorModel newcm = ColorModel.getRGBdefault();
171 theConsumer.setColorModel(newcm);
172
173 for (int y=0; y < height; y++) {
174 for (int x=0; x < width; x++) {
175 scanline[x] = image.getRGB(x, y);
176 }
177 theConsumer.setPixels(0, y, width, 1, newcm, scanline, 0,
178 width);
179 }
180 }
181 }
182
183 private void produce() {
184 try {
185 theConsumer.setDimensions(image.getWidth(), image.getHeight());
186 theConsumer.setProperties(properties);
187 sendPixels();
188 theConsumer.imageComplete(ImageConsumer.SINGLEFRAMEDONE);
189 } catch (NullPointerException e) {
190 if (theConsumer != null) {
191 theConsumer.imageComplete(ImageConsumer.IMAGEERROR);
192 }
193 }
194 }
195}