See More

package clojure2d.java; import java.awt.image.BufferedImage; import java.awt.image.Raster; import java.awt.image.WritableRaster; import fastmath.vector.Vec4; public final class Pixels { public static BufferedImage imageFromPixels(int[] p, int w, int h) { BufferedImage img = new BufferedImage(w,h,BufferedImage.TYPE_INT_ARGB); setImagePixels(img,p); return img; } public static int[] getRasterPixels(Raster raster, int x, int y, int w, int h) { int[] buff = new int[4 * w * h]; return raster.getPixels(x,y,w,h,buff); } public static int[] getRasterPixels(Raster raster) { return getRasterPixels(raster, 0, 0, raster.getWidth(), raster.getHeight()); } public static int[] getImagePixels(BufferedImage img, int x, int y, int w, int h) { return getRasterPixels(img.getRaster(),x,y,w,h); } public static int[] getImagePixels(BufferedImage img) { return getRasterPixels(img.getRaster(), 0, 0, img.getWidth(), img.getHeight()); } public static void setRasterPixels(WritableRaster raster, int x, int y, int w, int h, int[] p) { raster.setPixels(x,y,w,h,p); } public static void setRasterPixels(WritableRaster raster, int[] p) { setRasterPixels(raster, 0, 0, raster.getWidth(), raster.getHeight(), p); } public static void setImagePixels(BufferedImage img, int x, int y, int w, int h, int[] p) { img.getRaster().setPixels(x,y,w,h,p); } public static void setImagePixels(BufferedImage img, int[] p) { setImagePixels(img, 0, 0, img.getWidth(), img.getHeight(), p); } public static int[] getChannel(int[] p, int ch) { int[] buff = new int[p.length >> 2]; for(int i=ch, iter=0;i

=w) || (y<0) || (y>=h)) { switch(edge) { case -1: return p[((constrain(y,0,h-1) * w + constrain(x,0,w-1)) << 2) + ch]; case -2: return p[((mod(y,h) * w + mod(x,w)) << 2) + ch]; default: return edge; } } else { return p[((y * w + x) << 2) + ch]; } } public static int unsafeGetValue(int[] p, int ch, int x, int y, int w) { return p[((y * w + x) << 2) + ch]; } public static int getValue(int[] p, int ch, int idx) { return p[(idx << 2) + ch]; } public static void setValue(int[] p, int ch, int x, int y, int w, int v) { p[((y * w + x) << 2) + ch]=v; } public static void setValue(int[] p, int ch, int idx, int v) { p[(idx << 2) + ch]=v; } public static Vec4 getColor(int[] p, int x, int y, int w, int h, int edge) { int idx=0; if( (x<0) || (x>=w) || (y<0) || (y>=h)) { switch(edge) { case -1: idx=(constrain(y,0,h-1) * w + constrain(x,0,w-1)) << 2; break; case -2: idx=(mod(y,h) * w + mod(x,w)) << 2; break; default: return new Vec4(edge,edge,edge,255); } } else { idx=(y * w + x) << 2; } return new Vec4(p[idx],p[idx+1],p[idx+2],p[idx+3]); } public static Vec4 getColor(int[] p, int idx) { int i = idx << 2; return new Vec4(p[i],p[i+1],p[i+2],p[i+3]); } public static Vec4 unsafeGetColor(int[] p, int x, int y, int w) { int idx=(y * w + x) << 2; return new Vec4(p[idx],p[idx+1],p[idx+2],p[idx+3]); } public static void setColor(int [] p, int x, int y, int w, Vec4 c) { int idx = (y * w + x) << 2; p[idx] = constrain((int)(c.x+0.5),0,255); p[idx+1] = constrain((int)(c.y+0.5),0,255); p[idx+2] = constrain((int)(c.z+0.5),0,255); p[idx+3] = constrain((int)(c.w+0.5),0,255); } public static void setColor(int [] p, int idx, Vec4 c) { int i = idx << 2; p[i] = constrain((int)(c.x+0.5),0,255); p[i+1] = constrain((int)(c.y+0.5),0,255); p[i+2] = constrain((int)(c.z+0.5),0,255); p[i+3] = constrain((int)(c.w+0.5),0,255); } // some basic utilities public static int constrain(int v, int mn, int mx) { return v < mn ? mn : (v > mx ? mx : v); } public static double smoothStep(double a, double b, double x) { if (x < a) return 0; if (x >= b) return 1; double xx = (x - a) / (b - a); return xx*xx * (3.0 - (xx+xx)); } public static int mod(int x, int y) { int result = x % y; return result < 0 ? result + y : result; } }