use of org.jwildfire.image.Pixel in project JWildfire by thargor6.
the class MotionBlurTransformer method performPixelTransformation.
@Override
protected void performPixelTransformation(WFImage pImg) {
SimpleImage bgImg = (SimpleImage) pImg;
SimpleImage fgImg = srcImg;
int bgWidth = bgImg.getImageWidth();
int bgHeight = bgImg.getImageHeight();
int x1 = 0, y1 = 0;
int x2 = this.deltaX;
int y2 = this.deltaY;
if ((x2 == 0) && (y2 == 0))
return;
int n;
if (x2 > 0)
n = x2;
else
n = 0 - x2;
if (y2 > 0)
n += y2;
else
n += 0 - y2;
n++;
n *= 2;
int[] x = new int[n];
int[] y = new int[n];
n = Tools.bresenham(x1, y1, x2, y2, x, y);
int mix = 25;
int m1 = 100 - mix;
int m2 = mix;
for (int k = 1; k < n; k++) {
int left = x[k];
int top = y[k];
/* case 1 */
int bgLeft = 0, bgTop = 0, fgLeft = 0, fgTop = 0;
int hSize = 0, vSize = 0;
if ((left >= 0) && (top >= 0)) {
if ((left >= bgWidth) || (top >= bgHeight))
return;
hSize = bgWidth - left;
if (hSize > bgWidth)
hSize = bgWidth;
vSize = bgHeight - top;
if (vSize > bgHeight)
vSize = bgHeight;
bgLeft = left;
bgTop = top;
fgLeft = 0;
fgTop = 0;
} else /* case 2 */
if ((left < 0) && (top >= 0)) {
if ((left <= (0 - bgWidth)) || (top >= bgHeight))
return;
hSize = bgWidth + left;
if (hSize > bgWidth)
hSize = bgWidth;
vSize = bgHeight - top;
if (vSize > bgHeight)
vSize = bgHeight;
bgLeft = 0;
bgTop = top;
fgLeft = 0 - left;
fgTop = 0;
} else /* case 3 */
if ((left >= 0) && (top < 0)) {
if ((left >= bgWidth) || (top <= (0 - bgHeight)))
return;
hSize = bgWidth - left;
if (hSize > bgWidth)
hSize = bgWidth;
vSize = bgHeight + top;
if (vSize > bgHeight)
vSize = bgHeight;
bgLeft = left;
bgTop = 0;
fgLeft = 0;
fgTop = 0 - top;
} else /* case 4 */
if ((left < 0) && (top < 0)) {
if ((left <= (0 - bgWidth)) || (top <= (0 - bgHeight)))
return;
hSize = bgWidth + left;
if (hSize > bgWidth)
hSize = bgWidth;
vSize = bgHeight + top;
if (vSize > bgHeight)
vSize = bgHeight;
bgLeft = 0;
bgTop = 0;
fgTop = 0 - top;
fgLeft = 0 - left;
}
Pixel bgPixel = new Pixel();
Pixel fgPixel = new Pixel();
for (int i = 0; i < vSize; i++) {
for (int j = 0; j < hSize; j++) {
bgPixel.setARGBValue(bgImg.getARGBValue(j + bgLeft, i + bgTop));
fgPixel.setARGBValue(fgImg.getARGBValue(j + fgLeft, i + fgTop));
bgPixel.r = ((int) (bgPixel.r * m1) + (int) (fgPixel.r) * m2) / (int) 100;
bgPixel.g = ((int) (bgPixel.g * m1) + (int) (fgPixel.g) * m2) / (int) 100;
bgPixel.b = ((int) (bgPixel.b * m1) + (int) (fgPixel.b) * m2) / (int) 100;
bgImg.setRGB(j + bgLeft, i + bgTop, bgPixel);
}
}
}
}
use of org.jwildfire.image.Pixel in project JWildfire by thargor6.
the class BalancingGradientTransformer method performPixelTransformation.
@Override
protected void performPixelTransformation(WFImage pImg) {
SimpleImage img = (SimpleImage) pImg;
int width = pImg.getImageWidth();
int height = pImg.getImageHeight();
int x1 = this.x1;
int y1 = this.y1;
int v1 = this.value1;
int x2 = this.x2;
int y2 = this.y2;
int v2 = this.value2;
double rx = (double) (x2 - x1);
double ry = (double) (y2 - y1);
double dv = (double) (v2 - v1);
double vlen;
if (this.transition == Transition.PARALLEL)
vlen = Math.sqrt(rx * rx + ry * ry);
else
vlen = this.radius - this.baseRadius;
if (vlen < 0.0001)
vlen = 0.0001;
double vlenq = vlen * vlen;
Pixel pixel = new Pixel();
final double brMAX = 256.0;
switch(this.mode) {
case RED:
if (this.transition == Transition.PARALLEL) {
for (int i = 0; i < height; i++) {
double ay = (double) (i - y1);
for (int j = 0; j < width; j++) {
double ax = (double) (j - x1);
double prj = (ax * rx + ay * ry) / vlenq;
if (prj < 0.0)
prj = 0.0;
else if (prj > 1.0)
prj = 1.0;
int ival = v1 + (int) (dv * prj + 0.5);
int tt = (int) ((double) ival / (double) brMAX * (double) 255.0 + 0.5);
pixel.setARGBValue(img.getARGBValue(j, i));
pixel.r += tt;
if (pixel.r < 0)
pixel.r = 0;
else if (pixel.r > 255)
pixel.r = 255;
img.setRGB(j, i, pixel);
}
}
} else {
for (int i = 0; i < height; i++) {
double ay = (double) (i - y1);
for (int j = 0; j < width; j++) {
double ax = (double) (j - x1);
double prj = (Math.sqrt(ax * ax + ay * ay) - baseRadius) / vlen;
if (prj < 0.0)
prj = 0.0;
else if (prj > 1.0)
prj = 1.0;
int ival = v1 + (int) (dv * prj + 0.5);
int tt = (int) ((double) ival / (double) brMAX * (double) 255.0 + 0.5);
pixel.setARGBValue(img.getARGBValue(j, i));
pixel.r += tt;
if (pixel.r < 0)
pixel.r = 0;
else if (pixel.r > 255)
pixel.r = 255;
img.setRGB(j, i, pixel);
}
}
}
break;
case GREEN:
if (this.transition == Transition.PARALLEL) {
for (int i = 0; i < height; i++) {
double ay = (double) (i - y1);
for (int j = 0; j < width; j++) {
double ax = (double) (j - x1);
double prj = (ax * rx + ay * ry) / vlenq;
if (prj < 0.0)
prj = 0.0;
else if (prj > 1.0)
prj = 1.0;
int ival = v1 + (int) (dv * prj + 0.5);
int tt = (int) ((double) ival / (double) brMAX * (double) 255.0 + 0.5);
pixel.setARGBValue(img.getARGBValue(j, i));
pixel.g += tt;
if (pixel.g < 0)
pixel.g = 0;
else if (pixel.g > 255)
pixel.g = 255;
img.setRGB(j, i, pixel);
}
}
} else {
for (int i = 0; i < height; i++) {
double ay = (double) (i - y1);
for (int j = 0; j < width; j++) {
double ax = (double) (j - x1);
double prj = (Math.sqrt(ax * ax + ay * ay) - baseRadius) / vlen;
if (prj < 0.0)
prj = 0.0;
else if (prj > 1.0)
prj = 1.0;
int ival = v1 + (int) (dv * prj + 0.5);
int tt = (int) ((double) ival / (double) brMAX * (double) 255.0 + 0.5);
pixel.setARGBValue(img.getARGBValue(j, i));
pixel.g += tt;
if (pixel.g < 0)
pixel.g = 0;
else if (pixel.g > 255)
pixel.g = 255;
img.setRGB(j, i, pixel);
}
}
}
break;
case BLUE:
if (this.transition == Transition.PARALLEL) {
for (int i = 0; i < height; i++) {
double ay = (double) (i - y1);
for (int j = 0; j < width; j++) {
double ax = (double) (j - x1);
double prj = (ax * rx + ay * ry) / vlenq;
if (prj < 0.0)
prj = 0.0;
else if (prj > 1.0)
prj = 1.0;
int ival = v1 + (int) (dv * prj + 0.5);
int tt = (int) ((double) ival / (double) brMAX * (double) 255.0 + 0.5);
pixel.setARGBValue(img.getARGBValue(j, i));
pixel.b += tt;
if (pixel.b < 0)
pixel.b = 0;
else if (pixel.b > 255)
pixel.b = 255;
img.setRGB(j, i, pixel);
}
}
} else {
for (int i = 0; i < height; i++) {
double ay = (double) (i - y1);
for (int j = 0; j < width; j++) {
double ax = (double) (j - x1);
double prj = (Math.sqrt(ax * ax + ay * ay) - baseRadius) / vlen;
if (prj < 0.0)
prj = 0.0;
else if (prj > 1.0)
prj = 1.0;
int ival = v1 + (int) (dv * prj + 0.5);
int tt = (int) ((double) ival / (double) brMAX * (double) 255.0 + 0.5);
pixel.setARGBValue(img.getARGBValue(j, i));
pixel.b += tt;
if (pixel.b < 0)
pixel.b = 0;
else if (pixel.b > 255)
pixel.b = 255;
img.setRGB(j, i, pixel);
}
}
}
break;
case BRIGHTNESS:
if (this.transition == Transition.PARALLEL) {
for (int i = 0; i < height; i++) {
double ay = (double) (i - y1);
for (int j = 0; j < width; j++) {
double ax = (double) (j - x1);
double prj = (ax * rx + ay * ry) / vlenq;
if (prj < 0.0)
prj = 0.0;
else if (prj > 1.0)
prj = 1.0;
int ival = v1 + (int) (dv * prj + 0.5);
int tt = (int) ((double) ival / (double) brMAX * (double) 255.0 + 0.5);
pixel.setARGBValue(img.getARGBValue(j, i));
pixel.r += tt;
if (pixel.r < 0)
pixel.r = 0;
else if (pixel.r > 255)
pixel.r = 255;
pixel.g += tt;
if (pixel.g < 0)
pixel.g = 0;
else if (pixel.g > 255)
pixel.g = 255;
pixel.b += tt;
if (pixel.b < 0)
pixel.b = 0;
else if (pixel.b > 255)
pixel.b = 255;
img.setRGB(j, i, pixel);
}
}
} else {
for (int i = 0; i < height; i++) {
double ay = (double) (i - y1);
for (int j = 0; j < width; j++) {
double ax = (double) (j - x1);
double prj = (Math.sqrt(ax * ax + ay * ay) - baseRadius) / vlen;
if (prj < 0.0)
prj = 0.0;
else if (prj > 1.0)
prj = 1.0;
int ival = v1 + (int) (dv * prj + 0.5);
int tt = (int) ((double) ival / (double) brMAX * (double) 255.0 + 0.5);
pixel.setARGBValue(img.getARGBValue(j, i));
pixel.r += tt;
if (pixel.r < 0)
pixel.r = 0;
else if (pixel.r > 255)
pixel.r = 255;
pixel.g += tt;
if (pixel.g < 0)
pixel.g = 0;
else if (pixel.g > 255)
pixel.g = 255;
pixel.b += tt;
if (pixel.b < 0)
pixel.b = 0;
else if (pixel.b > 255)
pixel.b = 255;
img.setRGB(j, i, pixel);
}
}
}
break;
case CONTRAST:
if (this.transition == Transition.PARALLEL) {
for (int i = 0; i < height; i++) {
double ay = (double) (i - y1);
for (int j = 0; j < width; j++) {
double ax = (double) (j - x1);
double prj = (ax * rx + ay * ry) / vlenq;
if (prj < 0.0)
prj = 0.0;
else if (prj > 1.0)
prj = 1.0;
int ival = v1 + (int) (dv * prj + 0.5);
double scale = (double) (ival) / brMAX;
int sc = (int) (scale * (double) Tools.VPREC + 0.5);
int dc;
pixel.setARGBValue(img.getARGBValue(j, i));
if (ival > 0) {
dc = (int) (((int) (pixel.r - (int) 127) * sc) >> Tools.SPREC);
if (dc < (-255))
dc = (-255);
else if (dc > 255)
dc = 255;
dc = pixel.r + dc;
if (dc < 0)
dc = 0;
else if (dc > 255)
dc = 255;
pixel.r = dc;
dc = (int) (((int) (pixel.g - (int) 127) * sc) >> Tools.SPREC);
if (dc < (-255))
dc = (-255);
else if (dc > 255)
dc = 255;
dc = pixel.g + dc;
if (dc < 0)
dc = 0;
else if (dc > 255)
dc = 255;
pixel.g = dc;
dc = (int) ((int) ((pixel.b - (int) 127) * sc) >> Tools.SPREC);
if (dc < (-255))
dc = (-255);
else if (dc > 255)
dc = 255;
dc = pixel.b + dc;
if (dc < 0)
dc = 0;
else if (dc > 255)
dc = 255;
pixel.b = dc;
} else {
int val;
dc = (int) (((int) (pixel.r - (int) 127) * sc) >> Tools.SPREC);
if (dc < (-255))
dc = (-255);
else if (dc > 255)
dc = 255;
val = pixel.r + dc;
if (pixel.r < 127) {
if (val > 127)
val = 127;
} else {
if (val < 127)
val = 127;
}
pixel.r = val;
dc = (int) ((int) ((pixel.g - (int) 127) * sc) >> Tools.SPREC);
if (dc < (-255))
dc = (-255);
else if (dc > 255)
dc = 255;
val = pixel.g + dc;
if (pixel.g < 127) {
if (val > 127)
val = 127;
} else {
if (val < 127)
val = 127;
}
pixel.g = val;
dc = (int) ((int) ((pixel.b - (int) 127) * sc) >> Tools.SPREC);
if (dc < (-255))
dc = (-255);
else if (dc > 255)
dc = 255;
val = pixel.b + dc;
if (pixel.b < 127) {
if (val > 127)
val = 127;
} else {
if (val < 127)
val = 127;
}
pixel.b = val;
}
img.setRGB(j, i, pixel);
}
}
} else {
for (int i = 0; i < height; i++) {
double ay = (double) (i - y1);
for (int j = 0; j < width; j++) {
double ax = (double) (j - x1);
double prj = (Math.sqrt(ax * ax + ay * ay) - baseRadius) / vlen;
if (prj < 0.0)
prj = 0.0;
else if (prj > 1.0)
prj = 1.0;
int ival = v1 + (int) (dv * prj + 0.5);
double scale = (double) (ival) / brMAX;
int sc = (int) (scale * (double) Tools.VPREC + 0.5);
int dc;
pixel.setARGBValue(img.getARGBValue(j, i));
if (ival > 0) {
dc = (int) (((int) (pixel.r - (int) 127) * sc) >> Tools.SPREC);
if (dc < (-255))
dc = (-255);
else if (dc > 255)
dc = 255;
dc = pixel.r + dc;
if (dc < 0)
dc = 0;
else if (dc > 255)
dc = 255;
pixel.r = dc;
dc = (int) (((int) (pixel.g - (int) 127) * sc) >> Tools.SPREC);
if (dc < (-255))
dc = (-255);
else if (dc > 255)
dc = 255;
dc = pixel.g + dc;
if (dc < 0)
dc = 0;
else if (dc > 255)
dc = 255;
pixel.g = dc;
dc = (int) ((int) ((pixel.b - (int) 127) * sc) >> Tools.SPREC);
if (dc < (-255))
dc = (-255);
else if (dc > 255)
dc = 255;
dc = pixel.b + dc;
if (dc < 0)
dc = 0;
else if (dc > 255)
dc = 255;
pixel.b = dc;
} else {
int val;
dc = (int) (((int) (pixel.r - (int) 127) * sc) >> Tools.SPREC);
if (dc < (-255))
dc = (-255);
else if (dc > 255)
dc = 255;
val = pixel.r + dc;
if (pixel.r < 127) {
if (val > 127)
val = 127;
} else {
if (val < 127)
val = 127;
}
pixel.r = val;
dc = (int) ((int) ((pixel.g - (int) 127) * sc) >> Tools.SPREC);
if (dc < (-255))
dc = (-255);
else if (dc > 255)
dc = 255;
val = pixel.g + dc;
if (pixel.g < 127) {
if (val > 127)
val = 127;
} else {
if (val < 127)
val = 127;
}
pixel.g = val;
dc = (int) ((int) ((pixel.b - (int) 127) * sc) >> Tools.SPREC);
if (dc < (-255))
dc = (-255);
else if (dc > 255)
dc = 255;
val = pixel.b + dc;
if (pixel.b < 127) {
if (val > 127)
val = 127;
} else {
if (val < 127)
val = 127;
}
pixel.b = val;
}
img.setRGB(j, i, pixel);
}
}
}
break;
case GAMMA:
{
final double max = 255.0;
if (this.transition == Transition.PARALLEL) {
for (int i = 0; i < height; i++) {
double ay = (double) (i - y1);
for (int j = 0; j < width; j++) {
double ax = (double) (j - x1);
double prj = (ax * rx + ay * ry) / vlenq;
if (prj < 0.0)
prj = 0.0;
else if (prj > 1.0)
prj = 1.0;
int ival = v1 + (int) (dv * prj + 0.5);
double g = (double) 512.0 / (512.0 + (double) ival);
pixel.setARGBValue(img.getARGBValue(j, i));
int val;
val = pixel.r;
if (val == 0)
val = 0;
else
val = (int) (max * Math.pow((double) val / 255.0, g) + 0.5);
pixel.r = val;
val = pixel.g;
if (val == 0)
val = 0;
else
val = (int) (max * Math.pow((double) val / 255.0, g) + 0.5);
pixel.g = val;
val = pixel.b;
if (val == 0)
val = 0;
else
val = (int) (max * Math.pow((double) val / 255.0, g) + 0.5);
pixel.b = val;
img.setRGB(j, i, pixel);
}
}
} else {
for (int i = 0; i < height; i++) {
double ay = (double) (i - y1);
for (int j = 0; j < width; j++) {
double ax = (double) (j - x1);
double prj = (Math.sqrt(ax * ax + ay * ay) - baseRadius) / vlen;
if (prj < 0.0)
prj = 0.0;
else if (prj > 1.0)
prj = 1.0;
int ival = v1 + (int) (dv * prj + 0.5);
double g = (double) 512.0 / (512.0 + (double) ival);
pixel.setARGBValue(img.getARGBValue(j, i));
int val;
val = pixel.r;
if (val == 0)
val = 0;
else
val = (int) (max * Math.pow((double) val / 255.0, g) + 0.5);
pixel.r = val;
val = pixel.g;
if (val == 0)
val = 0;
else
val = (int) (max * Math.pow((double) val / 255.0, g) + 0.5);
pixel.g = val;
val = pixel.b;
if (val == 0)
val = 0;
else
val = (int) (max * Math.pow((double) val / 255.0, g) + 0.5);
pixel.b = val;
img.setRGB(j, i, pixel);
}
}
}
}
break;
case SATURATION:
{
int rs = 2990;
int gs = 5880;
int bs = 1130;
rs = (rs * Tools.VPREC) / 10000;
gs = (gs * Tools.VPREC) / 10000;
bs = (bs * Tools.VPREC) / 10000;
if (this.transition == Transition.PARALLEL) {
for (int i = 0; i < height; i++) {
double ay = (double) (i - y1);
for (int j = 0; j < width; j++) {
double ax = (double) (j - x1);
double prj = (ax * rx + ay * ry) / vlenq;
if (prj < 0.0)
prj = 0.0;
else if (prj > 1.0)
prj = 1.0;
int ival = v1 + (int) (dv * prj + 0.5);
int scl = (int) ((double) ival / 255.0 * 1024.0 + 0.5);
pixel.setARGBValue(img.getARGBValue(j, i));
int rv = pixel.r;
int gv = pixel.g;
int bv = pixel.b;
int avg = (rs * rv + gs * gv + bs * bv) >> Tools.SPREC;
rv += ((rv - avg) * scl) >> Tools.SPREC;
if (rv < 0)
rv = 0;
else if (rv > 255)
rv = 255;
pixel.r = rv;
gv += ((gv - avg) * scl) >> Tools.SPREC;
if (gv < 0)
gv = 0;
else if (gv > 255)
gv = 255;
pixel.g = gv;
bv += ((bv - avg) * scl) >> Tools.SPREC;
if (bv < 0)
bv = 0;
else if (bv > 255)
bv = 255;
pixel.b = bv;
img.setRGB(j, i, pixel);
}
}
} else {
for (int i = 0; i < height; i++) {
double ay = (double) (i - y1);
for (int j = 0; j < width; j++) {
double ax = (double) (j - x1);
double prj = (Math.sqrt(ax * ax + ay * ay) - baseRadius) / vlen;
if (prj < 0.0)
prj = 0.0;
else if (prj > 1.0)
prj = 1.0;
int ival = v1 + (int) (dv * prj + 0.5);
int scl = (int) ((double) ival / 255.0 * 1024.0 + 0.5);
pixel.setARGBValue(img.getARGBValue(j, i));
int rv = pixel.r;
int gv = pixel.g;
int bv = pixel.b;
int avg = (rs * rv + gs * gv + bs * bv) >> Tools.SPREC;
rv += ((rv - avg) * scl) >> Tools.SPREC;
if (rv < 0)
rv = 0;
else if (rv > 255)
rv = 255;
pixel.r = rv;
gv += ((gv - avg) * scl) >> Tools.SPREC;
if (gv < 0)
gv = 0;
else if (gv > 255)
gv = 255;
pixel.g = gv;
bv += ((bv - avg) * scl) >> Tools.SPREC;
if (bv < 0)
bv = 0;
else if (bv > 255)
bv = 255;
pixel.b = bv;
img.setRGB(j, i, pixel);
}
}
}
}
break;
}
}
use of org.jwildfire.image.Pixel in project JWildfire by thargor6.
the class BlackholeTransformer method performPixelTransformation.
@Override
protected void performPixelTransformation(WFImage pImg) {
SimpleImage img = (SimpleImage) pImg;
double cx = centreX - 0.5;
double cy = centreY - 0.5;
double rZoom = 1.0 / zoom;
int width = pImg.getImageWidth();
int height = pImg.getImageHeight();
double w1 = (double) width - 1.0;
double h1 = (double) height - 1.0;
Pixel pPixel = new Pixel();
for (int pY = 0; pY < height; pY++) {
for (int pX = 0; pX < width; pX++) {
/* transform the point */
double x0 = pX - cx;
double y0 = pY - cy;
double rr = Math.sqrt(x0 * x0 + y0 * y0);
x0 *= rZoom;
y0 *= rZoom;
double scl;
if (rr != 0.0)
scl = (rr + amount) / rr;
else
scl = 0.0;
double x = x0 * scl + cx;
double y = y0 * scl + cy;
/* render it */
double xi = Tools.fmod33(x);
double yi = Tools.fmod33(y);
if ((x < 0.0) || (x > w1) || (y < 0.0) || (y > h1)) {
pPixel.r = pPixel.g = pPixel.b = 0;
} else {
readSrcPixels(x, y);
pPixel.r = roundColor(((1.0 - yi) * ((1.0 - xi) * (srcP.r) + xi * (srcQ.r)) + yi * ((1.0 - xi) * (srcR.r) + xi * (srcS.r))));
pPixel.g = roundColor(((1.0 - yi) * ((1.0 - xi) * (srcP.g) + xi * (srcQ.g)) + yi * ((1.0 - xi) * (srcR.g) + xi * (srcS.g))));
pPixel.b = roundColor(((1.0 - yi) * ((1.0 - xi) * (srcP.b) + xi * (srcQ.b)) + yi * ((1.0 - xi) * (srcR.b) + xi * (srcS.b))));
}
img.setRGB(pX, pY, pPixel.r, pPixel.g, pPixel.b);
}
}
}
use of org.jwildfire.image.Pixel in project JWildfire by thargor6.
the class WaveTransformer method waveX_damp.
private void waveX_damp(SimpleImage pImg) {
double damping = this.damping;
double cx = this.centreX - 0.5;
double cy = this.centreY - 0.5;
double zoom = 1.0 / this.zoom;
int width = pImg.getImageWidth();
int height = pImg.getImageHeight();
double PI2 = 2.0 * Math.PI;
double shift = this.shift;
double wavelength = this.wavelength * this.zoom;
double amplitude = 0.0 - this.amplitude * this.zoom;
double phase = this.phase;
double amp = amplitude;
double t = this.frames != 0 ? (double) this.frame / (double) this.frames : 0.0;
shift = 2.0 * shift / (double) (height - 1);
double w1 = (double) width - 1.0;
double h1 = (double) height - 1.0;
Pixel pPixel = new Pixel();
for (int pY = 0; pY < height; pY++) {
for (int pX = 0; pX < width; pX++) {
pPixel.setARGBValue(pImg.getARGBValue(pX, pY));
/* transform the point */
double x0 = (double) pX - cx;
double y0 = (double) pY - cy;
double sangle = shift * pY;
double dl = (x0 - sangle) / wavelength;
double dl2 = dl - sangle;
if (dl2 < 0)
dl2 = 0.0 - dl2;
amp = amplitude * Math.exp(dl2 * damping);
double zz = amp * Math.sin((PI2 * (t - dl)) + phase);
y0 += zz;
double x = x0 * zoom + cx;
double y = y0 * zoom + cy;
/* color-wrapping */
if (this.wrap) {
while (x >= ((double) width - 0.5)) x -= (double) (width - 1);
while ((int) x < 0.5) x += (double) (width - 1);
while (y >= ((double) height - 0.5)) y -= (double) (height - 1);
while ((int) y < 0.5) y += (double) (height - 1);
}
/* render it */
double xi = Tools.fmod33(x);
double yi = Tools.fmod33(y);
if ((x < 0.0) || (x > w1) || (y < 0.0) || (y > h1)) {
pPixel.r = pPixel.g = pPixel.b = 0;
} else {
readSrcPixels(x, y);
pPixel.r = roundColor(((1.0 - yi) * ((1.0 - xi) * (srcP.r) + xi * (srcQ.r)) + yi * ((1.0 - xi) * (srcR.r) + xi * (srcS.r))));
pPixel.g = roundColor(((1.0 - yi) * ((1.0 - xi) * (srcP.g) + xi * (srcQ.g)) + yi * ((1.0 - xi) * (srcR.g) + xi * (srcS.g))));
pPixel.b = roundColor(((1.0 - yi) * ((1.0 - xi) * (srcP.b) + xi * (srcQ.b)) + yi * ((1.0 - xi) * (srcR.b) + xi * (srcS.b))));
}
pImg.setRGB(pX, pY, pPixel.r, pPixel.g, pPixel.b);
}
}
}
use of org.jwildfire.image.Pixel in project JWildfire by thargor6.
the class WaveTransformer method waveY.
private void waveY(SimpleImage pImg) {
double cx = this.centreX - 0.5;
double cy = this.centreY - 0.5;
double zoom = 1.0 / this.zoom;
int width = pImg.getImageWidth();
int height = pImg.getImageHeight();
double PI2 = 2.0 * Math.PI;
double shift = this.shift;
double wavelength = this.wavelength * this.zoom;
double amplitude = 0.0 - this.amplitude * this.zoom;
double phase = this.phase;
shift = 2.0 * shift / (double) (width - 1);
double amp = amplitude;
double t = this.frames != 0 ? (double) this.frame / (double) this.frames : 0.0;
double w1 = (double) width - 1.0;
double h1 = (double) height - 1.0;
Pixel pPixel = new Pixel();
for (int pY = 0; pY < height; pY++) {
for (int pX = 0; pX < width; pX++) {
pPixel.setARGBValue(pImg.getARGBValue(pX, pY));
/* transform the point */
double x0 = (double) pX - cx;
double y0 = (double) pY - cy;
double dl = (y0 - shift * pX) / wavelength;
double zz = amp * Math.sin((PI2 * (t - dl)) + phase);
x0 += zz;
double x = x0 * zoom + cx;
double y = y0 * zoom + cy;
/* color-wrapping */
if (this.wrap) {
while (x >= ((double) width - 0.5)) x -= (double) (width - 1);
while ((int) x < 0.5) x += (double) (width - 1);
while (y >= ((double) height - 0.5)) y -= (double) (height - 1);
while ((int) y < 0.5) y += (double) (height - 1);
}
/* render it */
double xi = Tools.fmod33(x);
double yi = Tools.fmod33(y);
if ((x < 0.0) || (x > w1) || (y < 0.0) || (y > h1)) {
pPixel.r = pPixel.g = pPixel.b = 0;
} else {
readSrcPixels(x, y);
pPixel.r = roundColor(((1.0 - yi) * ((1.0 - xi) * (srcP.r) + xi * (srcQ.r)) + yi * ((1.0 - xi) * (srcR.r) + xi * (srcS.r))));
pPixel.g = roundColor(((1.0 - yi) * ((1.0 - xi) * (srcP.g) + xi * (srcQ.g)) + yi * ((1.0 - xi) * (srcR.g) + xi * (srcS.g))));
pPixel.b = roundColor(((1.0 - yi) * ((1.0 - xi) * (srcP.b) + xi * (srcQ.b)) + yi * ((1.0 - xi) * (srcR.b) + xi * (srcS.b))));
}
pImg.setRGB(pX, pY, pPixel.r, pPixel.g, pPixel.b);
}
}
}
Aggregations