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