Merge branch 'master' of https://source.jalview.org/git/jalviewjs.git
[jalviewjs.git] / site / j2s / java / awt / image / RescaleOp.js
1 Clazz.declarePackage ("java.awt.image");
2 Clazz.load (["java.awt.image.BufferedImageOp", "$.RasterOp"], "java.awt.image.RescaleOp", ["java.lang.IllegalArgumentException", "java.awt.geom.Point2D", "java.awt.image.BufferedImage", "$.ByteLookupTable", "$.ImagingOpException", "$.LookupOp", "swingjs.JSToolkit"], function () {
3 c$ = Clazz.decorateAsClass (function () {
4 this.scaleFactors = null;
5 this.offsets = null;
6 this.length = 0;
7 this.hints = null;
8 this.swingJStype = 'R';
9 this.srcNbits = 0;
10 this.dstNbits = 0;
11 Clazz.instantialize (this, arguments);
12 }, java.awt.image, "RescaleOp", null, [java.awt.image.BufferedImageOp, java.awt.image.RasterOp]);
13 Clazz.makeConstructor (c$, 
14 function (scaleFactors, offsets, hints) {
15 this.length = scaleFactors.length;
16 if (this.length > offsets.length) this.length = offsets.length;
17 this.scaleFactors =  Clazz.newFloatArray (this.length, 0);
18 this.offsets =  Clazz.newFloatArray (this.length, 0);
19 for (var i = 0; i < this.length; i++) {
20 this.scaleFactors[i] = scaleFactors[i];
21 this.offsets[i] = offsets[i];
22 }
23 this.hints = hints;
24 }, "~A,~A,java.awt.RenderingHints");
25 Clazz.makeConstructor (c$, 
26 function (scaleFactor, offset, hints) {
27 this.length = 1;
28 this.scaleFactors =  Clazz.newFloatArray (1, 0);
29 this.offsets =  Clazz.newFloatArray (1, 0);
30 this.scaleFactors[0] = scaleFactor;
31 this.offsets[0] = offset;
32 this.hints = hints;
33 }, "~N,~N,java.awt.RenderingHints");
34 Clazz.defineMethod (c$, "getScaleFactors", 
35 function (scaleFactors) {
36 if (scaleFactors == null) {
37 return this.scaleFactors.clone ();
38 }System.arraycopy (this.scaleFactors, 0, scaleFactors, 0, Math.min (this.scaleFactors.length, scaleFactors.length));
39 return scaleFactors;
40 }, "~A");
41 Clazz.defineMethod (c$, "getOffsets", 
42 function (offsets) {
43 if (offsets == null) {
44 return this.offsets.clone ();
45 }System.arraycopy (this.offsets, 0, offsets, 0, Math.min (this.offsets.length, offsets.length));
46 return offsets;
47 }, "~A");
48 Clazz.defineMethod (c$, "getNumFactors", 
49 function () {
50 return this.length;
51 });
52 Clazz.defineMethod (c$, "createByteLut", 
53  function (scale, off, nBands, nElems) {
54 var lutData =  Clazz.newByteArray (scale.length, nElems, 0);
55 for (var band = 0; band < scale.length; band++) {
56 var bandScale = scale[band];
57 var bandOff = off[band];
58 var bandLutData = lutData[band];
59 for (var i = 0; i < nElems; i++) {
60 var val = Clazz.floatToInt (i * bandScale + bandOff);
61 if ((val & 0xffffff00) != 0) {
62 if (val < 0) {
63 val = 0;
64 } else {
65 val = 255;
66 }}bandLutData[i] = val;
67 }
68 }
69 return  new java.awt.image.ByteLookupTable (0, lutData);
70 }, "~A,~A,~N,~N");
71 Clazz.defineMethod (c$, "canUseLookup", 
72  function (src, dst) {
73 var datatype = src.getDataBuffer ().getDataType ();
74 if (datatype != 0) {
75 return false;
76 }var dstSM = dst.getSampleModel ();
77 this.dstNbits = dstSM.getSampleSize (0);
78 if (!(this.dstNbits == 8 || this.dstNbits == 16)) {
79 return false;
80 }for (var i = 1; i < src.getNumBands (); i++) {
81 var bandSize = dstSM.getSampleSize (i);
82 if (bandSize != this.dstNbits) {
83 return false;
84 }}
85 var srcSM = src.getSampleModel ();
86 this.srcNbits = srcSM.getSampleSize (0);
87 if (this.srcNbits > 16) {
88 return false;
89 }for (var i = 1; i < src.getNumBands (); i++) {
90 var bandSize = srcSM.getSampleSize (i);
91 if (bandSize != this.srcNbits) {
92 return false;
93 }}
94 return true;
95 }, "java.awt.image.Raster,java.awt.image.Raster");
96 Clazz.defineMethod (c$, "filter", 
97 function (src, dst) {
98 var srcCM = src.getColorModel ();
99 var dstCM;
100 var numBands = srcCM.getNumColorComponents ();
101 if (this.length != 1 && this.length != numBands && this.length != srcCM.getNumComponents ()) {
102 throw  new IllegalArgumentException ("Number of scaling constants does not equal the number of of color or color/alpha  components");
103 }if (this.length > numBands && srcCM.hasAlpha ()) {
104 this.length = numBands + 1;
105 }var width = src.getWidth ();
106 var height = src.getHeight ();
107 if (dst == null) {
108 dst = this.createCompatibleDestImage (src, null);
109 dstCM = srcCM;
110 } else {
111 if (width != dst.getWidth ()) {
112 throw  new IllegalArgumentException ("Src width (" + width + ") not equal to dst width (" + dst.getWidth () + ")");
113 }if (height != dst.getHeight ()) {
114 throw  new IllegalArgumentException ("Src height (" + height + ") not equal to dst height (" + dst.getHeight () + ")");
115 }dstCM = dst.getColorModel ();
116 if (srcCM.getColorSpace ().getType () != dstCM.getColorSpace ().getType ()) {
117 swingjs.JSToolkit.notImplemented (null);
118 throw  new java.awt.image.ImagingOpException ("SwingJS only supports RGB color space");
119 }}var origDst = dst;
120 var srcRaster = src.getRaster ();
121 var dstRaster = dst.getRaster ();
122 if (srcCM.hasAlpha ()) {
123 if (numBands - 1 == this.length || this.length == 1) {
124 var minx = srcRaster.getMinX ();
125 var miny = srcRaster.getMinY ();
126 var bands =  Clazz.newIntArray (numBands - 1, 0);
127 for (var i = 0; i < numBands - 1; i++) {
128 bands[i] = i;
129 }
130 srcRaster = srcRaster.createWritableChild (minx, miny, srcRaster.getWidth (), srcRaster.getHeight (), minx, miny, bands);
131 }}if (dstCM.hasAlpha ()) {
132 var dstNumBands = dstRaster.getNumBands ();
133 if (dstNumBands - 1 == this.length || this.length == 1) {
134 var minx = dstRaster.getMinX ();
135 var miny = dstRaster.getMinY ();
136 var bands =  Clazz.newIntArray (numBands - 1, 0);
137 for (var i = 0; i < numBands - 1; i++) {
138 bands[i] = i;
139 }
140 dstRaster = dstRaster.createWritableChild (minx, miny, dstRaster.getWidth (), dstRaster.getHeight (), minx, miny, bands);
141 }}this.filter (srcRaster, dstRaster);
142 return origDst;
143 }, "java.awt.image.BufferedImage,java.awt.image.BufferedImage");
144 Clazz.defineMethod (c$, "filter", 
145 function (src, dst) {
146 var numBands = src.getNumBands ();
147 var width = src.getWidth ();
148 var height = src.getHeight ();
149 var srcPix = null;
150 var step = 0;
151 var tidx = 0;
152 if (dst == null) {
153 dst = this.createCompatibleDestRaster (src);
154 } else if (height != dst.getHeight () || width != dst.getWidth ()) {
155 throw  new IllegalArgumentException ("Width or height of Rasters do not match");
156 } else if (numBands != dst.getNumBands ()) {
157 throw  new IllegalArgumentException ("Number of bands in src " + numBands + " does not equal number of bands in dest " + dst.getNumBands ());
158 }if (this.length != 1 && this.length != src.getNumBands ()) {
159 throw  new IllegalArgumentException ("Number of scaling constants does not equal the number of of bands in the src raster");
160 }if (this.canUseLookup (src, dst)) {
161 var srcNgray = (1 << this.srcNbits);
162 var dstNgray = (1 << this.dstNbits);
163 if (dstNgray != 256) {
164 throw  new java.awt.image.ImagingOpException ("SwingJS requires 256 gray scale");
165 }if (dstNgray == 256) {
166 var lut = this.createByteLut (this.scaleFactors, this.offsets, numBands, srcNgray);
167 var op =  new java.awt.image.LookupOp (lut, this.hints);
168 op.filter (src, dst);
169 }} else {
170 if (this.length > 1) {
171 step = 1;
172 }var sminX = src.getMinX ();
173 var sY = src.getMinY ();
174 var dminX = dst.getMinX ();
175 var dY = dst.getMinY ();
176 var sX;
177 var dX;
178 var nbits;
179 var dstMax =  Clazz.newIntArray (numBands, 0);
180 var dstMask =  Clazz.newIntArray (numBands, 0);
181 var dstSM = dst.getSampleModel ();
182 for (var z = 0; z < numBands; z++) {
183 nbits = dstSM.getSampleSize (z);
184 dstMax[z] = (1 << nbits) - 1;
185 dstMask[z] = ~(dstMax[z]);
186 }
187 var val;
188 for (var y = 0; y < height; y++, sY++, dY++) {
189 dX = dminX;
190 sX = sminX;
191 for (var x = 0; x < width; x++, sX++, dX++) {
192 srcPix = src.getPixel (sX, sY, srcPix);
193 tidx = 0;
194 for (var z = 0; z < numBands; z++, tidx += step) {
195 val = Clazz.floatToInt (srcPix[z] * this.scaleFactors[tidx] + this.offsets[tidx]);
196 if ((val & dstMask[z]) != 0) {
197 if (val < 0) {
198 val = 0;
199 } else {
200 val = dstMax[z];
201 }}srcPix[z] = val;
202 }
203 dst.setPixel (dX, dY, srcPix);
204 }
205 }
206 }return dst;
207 }, "java.awt.image.Raster,java.awt.image.WritableRaster");
208 Clazz.defineMethod (c$, "getBounds2D", 
209 function (src) {
210 return this.getBounds2D (src.getRaster ());
211 }, "java.awt.image.BufferedImage");
212 Clazz.defineMethod (c$, "getBounds2D", 
213 function (src) {
214 return src.getBounds ();
215 }, "java.awt.image.Raster");
216 Clazz.overrideMethod (c$, "createCompatibleDestImage", 
217 function (src, destCM) {
218 var image;
219 if (destCM == null) {
220 var cm = src.getColorModel ();
221 image =  new java.awt.image.BufferedImage (cm, src.getRaster ().createCompatibleWritableRaster (), cm.isAlphaPremultiplied (), null);
222 } else {
223 var w = src.getWidth ();
224 var h = src.getHeight ();
225 image =  new java.awt.image.BufferedImage (destCM, destCM.createCompatibleWritableRaster (w, h), destCM.isAlphaPremultiplied (), null);
226 }return image;
227 }, "java.awt.image.BufferedImage,java.awt.image.ColorModel");
228 Clazz.overrideMethod (c$, "createCompatibleDestRaster", 
229 function (src) {
230 return src.createCompatibleWritableRaster (src.getWidth (), src.getHeight ());
231 }, "java.awt.image.Raster");
232 Clazz.overrideMethod (c$, "getPoint2D", 
233 function (srcPt, dstPt) {
234 if (dstPt == null) {
235 dstPt =  new java.awt.geom.Point2D.Float ();
236 }dstPt.setLocation (srcPt.getX (), srcPt.getY ());
237 return dstPt;
238 }, "java.awt.geom.Point2D,java.awt.geom.Point2D");
239 Clazz.overrideMethod (c$, "getRenderingHints", 
240 function () {
241 return this.hints;
242 });
243 });