Package org.jwildfire.transform

Source Code of org.jwildfire.transform.Pixelize3DTransformer$GenlockEditor

/*
  JWildfire - an image and animation processor written in Java
  Copyright (C) 1995-2011 Andreas Maschke

  This is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser
  General Public License as published by the Free Software Foundation; either version 2.1 of the
  License, or (at your option) any later version.
  This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public License along with this software;
  if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jwildfire.transform;

import java.awt.Color;

import org.jwildfire.base.Property;
import org.jwildfire.base.PropertyMax;
import org.jwildfire.base.PropertyMin;
import org.jwildfire.base.Tools;
import org.jwildfire.base.mathlib.MathLib;
import org.jwildfire.image.Pixel;
import org.jwildfire.image.SimpleImage;
import org.jwildfire.image.WFImage;
import org.jwildfire.swing.Buffer.BufferType;

import com.l2fprod.common.beans.editor.ComboBoxPropertyEditor;

public class Pixelize3DTransformer extends Mesh3DTransformer {
  public enum Genlock {
    OFF, COLOR, IN_RANGE, OUT_RANGE
  }

  public enum BlockType {
    SIMPLE, DETAILED
  }

  @Property(description = "Seed for the random number generator")
  @PropertyMin(0)
  private int seed;

  @Property(description = "Block width")
  @PropertyMin(2)
  private int blockWidth;

  @Property(description = "Block height")
  @PropertyMin(2)
  private int blockHeight;

  @Property(description = "Block thickness")
  @PropertyMin(2)
  private int blockThickness;

  @Property(description = "Centre blocks")
  private boolean centre = true;

  @Property(description = "Block scale")
  @PropertyMin(0.0)
  private double blockScale;

  @Property(description = "Maximum block scale variance")
  @PropertyMin(0.0)
  private double blockScaleVariance;

  @Property(description = "Rotation angle alpha")
  @PropertyMin(-360)
  @PropertyMax(360)
  protected double blockAngleAlpha = 0.0;

  @Property(description = "Rotation angle beta")
  @PropertyMin(-360)
  @PropertyMax(360)
  protected double blockAngleBeta = 0.0;

  @Property(description = "Maximum block rotation variance")
  @PropertyMin(0.0)
  private double blockAngleVariance;

  @Property(description = "Genlock mode (suppress the creation of blocks)", editorClass = GenlockEditor.class)
  private Genlock genlock;
  @Property(description = "Genlock color A")
  private Color genlockColorA;
  @Property(description = "Genlock color B")
  private Color genlockColorB;

  @Property(description = "Block type", editorClass = BlockTypeEditor.class)
  private BlockType blockType;

  @Override
  protected void transformMesh(Mesh3D pMesh3D, int pImageWidth, int pImageHeight) {
  }

  @Override
  public void initDefaultParams(WFImage pImg) {
    super.initDefaultParams(pImg);
    centre = true;
    blockType = BlockType.SIMPLE;
    blockWidth = pImg.getImageWidth() / 25;
    blockHeight = pImg.getImageHeight() / 25;
    blockThickness = (int) (Math.sqrt(blockWidth * blockWidth + blockHeight * blockHeight) * 0.5 + 0.5);
    blockScale = 0.7;
    blockScaleVariance = 0.0;
    seed = 123;

    genlock = Genlock.OFF;
    genlockColorA = new Color(0, 0, 0);
    genlockColorB = new Color(0, 0, 0);

    blockScale = 0.5;
    zoom = 1.0;
    ambient = 0.7;
  }

  @Override
  public boolean acceptsInputBufferType(BufferType pBufferType) {
    return (pBufferType == BufferType.IMAGE);
  }

  @Override
  protected void createMeshFromImage(Mesh3D pMesh3D, SimpleImage pImg, double pQuant3D) {
    Tools.srand123(seed);
    int imgWidth = pImg.getImageWidth();
    int imgHeight = pImg.getImageHeight();
    double xMin = -(double) imgWidth * 0.5;
    double yMin = -(double) imgHeight * 0.5;
    double zsize2 = blockThickness * 0.5;

    // allocate structure
    Block block;
    switch (blockType) {
      case SIMPLE:
        block = new SimpleBlock(blockWidth, blockHeight);
        break;
      case DETAILED:
        block = new DetailedBlock(blockWidth, blockHeight);
        break;
      default:
        throw new IllegalStateException();
    }

    int rectXCount = imgWidth / blockWidth + (imgWidth % blockWidth > 0 ? 1 : 0);
    int rectYCount = imgHeight / blockHeight + (imgHeight % blockHeight > 0 ? 1 : 0);
    int rectCount = rectXCount * rectYCount;
    int rectPCount = block.estimatePCount();
    int rectFCount = block.estimateFCount();

    int pCount = rectCount * rectPCount;
    int currP = 0;
    int fCount = rectCount * rectFCount;
    int currF = 0;
    double x[] = new double[pCount];
    double y[] = new double[pCount];
    double z[] = new double[pCount];

    int pp1[] = new int[fCount];
    int pp2[] = new int[fCount];
    int pp3[] = new int[fCount];

    int color[] = new int[fCount];
    // create structure
    int dx = centre ? (imgWidth % blockWidth) / 2 : 0;
    int dy = centre ? (imgHeight % blockHeight) / 2 : 0;

    for (int row = 0; row < imgHeight;) {
      int y1 = row - dy;
      if (y1 < 0)
        y1 = 0;
      int y2 = row - dy + blockHeight;
      if (y2 > imgHeight - dy)
        y2 = imgHeight - dy;
      for (int col = 0; col < imgWidth;) {
        int x1 = col - dx;
        if (x1 < 0)
          x1 = 0;
        int x2 = col - dx + blockWidth;
        if (x2 > imgWidth - dx)
          x2 = imgWidth - dx;
        Pixel p = block.computeAVGColor(pImg, x1, x2, y1, y2);
        if (!filteredByGenlock(p)) {
          block.prepareTransformation(blockScale, blockScaleVariance, blockAngleAlpha, blockAngleBeta, blockAngleVariance);
          block.createBlock(pImg, x1, x2, y1, y2, zsize2, p.getARGBValue());
          block.transformBlock(x1, x2, y1, y2, xMin, yMin);
          block.addToMainStructure(x, y, z, pp1, pp2, pp3, color, currP, currF);
          currF += block.getFCount();
          currP += block.getPCount();
        }
        else
          System.out.println("GENLOCK");

        col += blockWidth;
      }
      row += blockHeight;
    }
    //
    System.out.println("FACES: " + currF + " (" + fCount + ")");
    System.out.println("POINTS: " + currP + " (" + pCount + ")");

    pMesh3D.setFCount(currF);
    pMesh3D.setPCount(currP);
    pMesh3D.setX(x);
    pMesh3D.setY(y);
    pMesh3D.setZ(z);
    pMesh3D.setPP1(pp1);
    pMesh3D.setPP2(pp2);
    pMesh3D.setPP3(pp3);
    pMesh3D.setColor(color);
    pMesh3D.setImageWidth(imgWidth);
    pMesh3D.setImageHeight(imgHeight);
  }

  private boolean filteredByGenlock(Pixel pPixel) {
    switch (this.genlock) {
      case OFF:
        return false;
      case COLOR:
        return !(pPixel.r != genlockColorA.getRed() || pPixel.g != genlockColorA.getGreen() || pPixel.b != genlockColorA.getBlue());
      case IN_RANGE:
        return (((pPixel.r >= genlockColorA.getRed() && pPixel.r <= genlockColorB.getRed()) || (pPixel.r >= genlockColorB.getRed() && pPixel.r <= genlockColorA.getRed()))
            || ((pPixel.g >= genlockColorA.getGreen() && pPixel.g <= genlockColorB.getGreen()) || (pPixel.g >= genlockColorB.getGreen() && pPixel.g <= genlockColorA.getGreen())) || ((pPixel.b >= genlockColorA.getBlue() && pPixel.b <= genlockColorB.getBlue()) || (pPixel.b >= genlockColorB.getBlue() && pPixel.b <= genlockColorA.getBlue())));
      case OUT_RANGE:
        return !(((pPixel.r >= genlockColorA.getRed() && pPixel.r <= genlockColorB.getRed()) || (pPixel.r >= genlockColorB.getRed() && pPixel.r <= genlockColorA.getRed()))
            || ((pPixel.g >= genlockColorA.getGreen() && pPixel.g <= genlockColorB.getGreen()) || (pPixel.g >= genlockColorB.getGreen() && pPixel.g <= genlockColorA.getGreen())) || ((pPixel.b >= genlockColorA.getBlue() && pPixel.b <= genlockColorB.getBlue()) || (pPixel.b >= genlockColorB.getBlue() && pPixel.b <= genlockColorA.getBlue())));
      default:
        throw new IllegalStateException();
    }
  }

  public int getSeed() {
    return seed;
  }

  public void setSeed(int seed) {
    this.seed = seed;
  }

  public boolean isCentre() {
    return centre;
  }

  public void setCentre(boolean centre) {
    this.centre = centre;
  }

  public double getBlockScale() {
    return blockScale;
  }

  public void setBlockScale(double blockScale) {
    this.blockScale = blockScale;
  }

  public double getBlockScaleVariance() {
    return blockScaleVariance;
  }

  public void setBlockScaleVariance(double blockScaleVariance) {
    this.blockScaleVariance = blockScaleVariance;
  }

  public double getBlockAngleAlpha() {
    return blockAngleAlpha;
  }

  public void setBlockAngleAlpha(double blockAngleAlpha) {
    this.blockAngleAlpha = blockAngleAlpha;
  }

  public double getBlockAngleBeta() {
    return blockAngleBeta;
  }

  public void setBlockAngleBeta(double blockAngleBeta) {
    this.blockAngleBeta = blockAngleBeta;
  }

  public double getBlockAngleVariance() {
    return blockAngleVariance;
  }

  public void setBlockAngleVariance(double blockAngleVariance) {
    this.blockAngleVariance = blockAngleVariance;
  }

  private static abstract class Block {
    protected int blockWidth;
    protected int blockHeight;
    protected int pCount;
    protected int fCount;
    protected double x[];
    protected double y[];
    protected double z[];

    protected int pp1[];
    protected int pp2[];
    protected int pp3[];

    protected int color[];

    protected double scale;
    protected double alpha;
    protected double beta;

    public abstract int estimatePCount();

    public abstract int estimateFCount();

    public abstract void createBlock(SimpleImage pImg, int pX1, int pX2, int pY1, int pY2, double pZSize2, int pAvgColor);

    protected void transformBlock(int pX1, int pX2, int pY1, int pY2, double pXMin, double pYMin) {
      double zeroX = (double) (pX2 - pX1) * 0.5 + (double) pX1;
      double zeroY = (double) (pY2 - pY1) * 0.5 + (double) pY1;
      // rotate
      Rotate doRotate = Rotate.XY;
      double sinA = Math.sin(alpha);
      double cosA = Math.cos(alpha);
      double sinB = Math.sin(beta);
      double cosB = Math.cos(beta);
      if (doRotate == Rotate.XY) {
        double sinBsinA = sinB * sinA;
        double cosBsinA = cosB * sinA;
        double sinBcosA = sinB * cosA;
        double cosBcosA = cosB * cosA;
        for (int i = 0; i < pCount; i++) {
          double dx = x[i] - zeroX;
          double dy = y[i] - zeroY;
          double dz = z[i];
          x[i] = cosA * dx - sinBsinA * dy + cosBsinA * dz + zeroX;
          y[i] = cosB * dy + sinB * dz + zeroY;
          z[i] = -sinA * dx - sinBcosA * dy + cosBcosA * dz;
        }
      }
      else if (doRotate == Rotate.YZ) {
        double cosAcosB = cosA * cosB;
        double sinAcosB = sinA * cosB;
        double cosAsinB = cosA * sinB;
        double sinAsinB = sinA * sinB;
        for (int i = 0; i < pCount; i++) {
          double dx = x[i] - zeroX;
          double dy = y[i] - zeroY;
          double dz = z[i];
          x[i] = cosAcosB * dx + sinAcosB * dy + sinB * dz + zeroX;
          y[i] = -sinA * dx + cosA * dy + zeroY;
          z[i] = -cosAsinB * dx - sinAsinB * dy + cosB * dz;
        }
      }
      else if (doRotate == Rotate.XZ) {
        double cosBsinA = cosB * sinA;
        double sinBsinA = sinB * sinA;
        double cosBcosA = cosB * cosA;
        double sinBcosA = sinB * cosA;
        for (int i = 0; i < pCount; i++) {
          double dx = x[i] - zeroX;
          double dy = y[i] - zeroY;
          double dz = z[i];
          x[i] = cosA * dx + cosBsinA * dy + sinBsinA * dz + zeroX;
          y[i] = -sinA * dx + cosBcosA * dy + sinBcosA * dz + zeroY;
          z[i] = -sinB * dy + cosB * dz;
        }
      }
      // scale
      for (int i = 0; i < pCount; i++) {
        x[i] = (x[i] - zeroX) * scale + zeroX + pXMin;
        y[i] = (y[i] - zeroY) * scale + zeroY + pYMin;
        z[i] = z[i] * scale;
      }
    }

    protected Pixel computeAVGColor(SimpleImage pImg, int pX1, int pX2, int pY1, int pY2) {
      Pixel p = new Pixel();
      double red = 0.0;
      double green = 0.0;
      double blue = 0.0;
      int count = 0;
      for (int i = pX1; i < pX2; i++) {
        for (int j = pY1; j < pY2; j++) {
          p.setARGBValue(pImg.getARGBValue(i, j));
          red += p.r;
          green += p.g;
          blue += p.b;
          count++;
        }
      }
      p.r = Tools.roundColor(red / (double) count);
      p.g = Tools.roundColor(green / (double) count);
      p.b = Tools.roundColor(blue / (double) count);
      return p;
    }

    protected void prepareTransformation(double pScale, double pScaleVariance, double pAlphaDeg, double pBetaDeg, double pAngleVarianceDeg) {
      scale = pScale;
      if (Math.abs(pScaleVariance) > MathLib.EPSILON) {
        if (Tools.drand() > 0.5) {
          scale += pScaleVariance * Tools.drand();
        }
        else {
          scale -= pScaleVariance * Tools.drand();
        }
      }

      double alphaDeg = pAlphaDeg;
      if (Math.abs(pAngleVarianceDeg) > MathLib.EPSILON) {
        if (Tools.drand() > 0.5) {
          alphaDeg += pAngleVarianceDeg * Tools.drand();
        }
        else {
          alphaDeg -= pAngleVarianceDeg * Tools.drand();
        }
      }
      alpha = alphaDeg * Math.PI / 180.0;

      double betaDeg = pBetaDeg;
      if (Math.abs(pAngleVarianceDeg) > MathLib.EPSILON) {
        if (Tools.drand() > 0.5) {
          betaDeg += pAngleVarianceDeg * Tools.drand();
        }
        else {
          betaDeg -= pAngleVarianceDeg * Tools.drand();
        }
      }
      beta = betaDeg * Math.PI / 180.0;
    }

    public void addToMainStructure(double[] pX, double[] pY, double[] pZ, int[] pPP1, int[] pPP2, int[] pPP3, int[] pColor, int pCurrP, int pCurrF) {
      for (int i = 0; i < pCount; i++) {
        pX[pCurrP + i] = x[i];
        pY[pCurrP + i] = y[i];
        pZ[pCurrP + i] = z[i];
      }
      for (int i = 0; i < fCount; i++) {
        pPP1[pCurrF + i] = pp1[i] + pCurrP;
        pPP2[pCurrF + i] = pp2[i] + pCurrP;
        pPP3[pCurrF + i] = pp3[i] + pCurrP;
        pColor[pCurrF + i] = color[i];
      }
    }

    public int getPCount() {
      return pCount;
    }

    public int getFCount() {
      return fCount;
    }
  }

  private static class SimpleBlock extends Block {
    private final static int PCOUNT = 8;
    private final static int FCOUNT = 12;

    public SimpleBlock(int pBlockWidth, int pBlockHeight) {
      blockWidth = pBlockWidth;
      blockHeight = pBlockHeight;

      x = new double[PCOUNT];
      y = new double[PCOUNT];
      z = new double[PCOUNT];

      pp1 = new int[FCOUNT];
      pp2 = new int[FCOUNT];
      pp3 = new int[FCOUNT];
      color = new int[FCOUNT];
    }

    @Override
    public int estimatePCount() {
      return PCOUNT;
    }

    @Override
    public int estimateFCount() {
      return FCOUNT;
    }

    @Override
    public void createBlock(SimpleImage pImg, int pX1, int pX2, int pY1, int pY2, double pZSize2, int pAvgColor) {
      pCount = 0;
      fCount = 0;
      int currColor = pAvgColor;

      // points
      //       7 6
      //       4 5
      //     /
      // 3 2
      // 0 1
      x[pCount] = pX1;
      y[pCount] = pY2;
      z[pCount++] = -pZSize2;

      x[pCount] = pX2;
      y[pCount] = pY2;
      z[pCount++] = -pZSize2;

      x[pCount] = pX2;
      y[pCount] = pY1;
      z[pCount++] = -pZSize2;

      x[pCount] = pX1;
      y[pCount] = pY1;
      z[pCount++] = -pZSize2;

      x[pCount] = pX1;
      y[pCount] = pY2;
      z[pCount++] = pZSize2;

      x[pCount] = pX2;
      y[pCount] = pY2;
      z[pCount++] = pZSize2;

      x[pCount] = pX2;
      y[pCount] = pY1;
      z[pCount++] = pZSize2;

      x[pCount] = pX1;
      y[pCount] = pY1;
      z[pCount++] = pZSize2;

      // faces
      // 0 1 2
      pp1[fCount] = 0;
      pp2[fCount] = 1;
      pp3[fCount] = 2;
      color[fCount++] = currColor;
      // 0 2 3
      pp1[fCount] = 0;
      pp2[fCount] = 2;
      pp3[fCount] = 3;
      color[fCount++] = currColor;
      // 1 5 6
      pp1[fCount] = 1;
      pp2[fCount] = 5;
      pp3[fCount] = 6;
      color[fCount++] = currColor;
      // 1 6 2
      pp1[fCount] = 1;
      pp2[fCount] = 6;
      pp3[fCount] = 2;
      color[fCount++] = currColor;
      // 5 4 6
      pp1[fCount] = 5;
      pp2[fCount] = 4;
      pp3[fCount] = 6;
      color[fCount++] = currColor;
      // 4 7 6
      pp1[fCount] = 4;
      pp2[fCount] = 7;
      pp3[fCount] = 6;
      color[fCount++] = currColor;
      // 4 0 3
      pp1[fCount] = 4;
      pp2[fCount] = 0;
      pp3[fCount] = 3;
      color[fCount++] = currColor;
      // 3 7 4
      pp1[fCount] = 3;
      pp2[fCount] = 7;
      pp3[fCount] = 4;
      color[fCount++] = currColor;
      // 3 2 7
      pp1[fCount] = 3;
      pp2[fCount] = 2;
      pp3[fCount] = 7;
      color[fCount++] = currColor;
      // 2 6 7
      pp1[fCount] = 2;
      pp2[fCount] = 6;
      pp3[fCount] = 7;
      color[fCount++] = currColor;
      // 0 4 5
      pp1[fCount] = 0;
      pp2[fCount] = 4;
      pp3[fCount] = 5;
      color[fCount++] = currColor;
      // 0 5 1
      pp1[fCount] = 0;
      pp2[fCount] = 5;
      pp3[fCount] = 1;
      color[fCount++] = currColor;
    }
  }

  private static class DetailedBlock extends Block {
    private final int ZSEGMENTS = 3;

    public DetailedBlock(int pBlockWidth, int pBlockHeight) {
      blockWidth = pBlockWidth;
      blockHeight = pBlockHeight;

      x = new double[estimatePCount()];
      y = new double[estimatePCount()];
      z = new double[estimatePCount()];

      pp1 = new int[estimateFCount()];
      pp2 = new int[estimateFCount()];
      pp3 = new int[estimateFCount()];
      color = new int[estimateFCount()];
    }

    @Override
    public int estimatePCount() {
      return (blockWidth + 1) * (blockHeight + 1) + // front
          ZSEGMENTS * ((blockWidth + 1) * 2 + (blockHeight + 1) * 2) + // segments
          (blockWidth + 1) * (blockHeight + 1);//   back

    }

    @Override
    public int estimateFCount() {
      return blockWidth * blockHeight * 2 + // front
          blockHeight * 2 * (ZSEGMENTS + 1) + // right side
          blockHeight * 2 * (ZSEGMENTS + 1) + // left side
          blockWidth * 2 * (ZSEGMENTS + 1) + // top side
          blockWidth * 2 * (ZSEGMENTS + 1) + // bottom side
          blockWidth * blockHeight * 2; // back
    }

    @Override
    public void createBlock(SimpleImage pImg, int pX1, int pX2, int pY1, int pY2, double pZSize2, int pAvgColor) {
      pCount = 0;
      fCount = 0;
      // point order:
      //  front:
      //    0 1 2 3
      //    4 5 6 7
      //  back:
      //   8   9 10 11
      //   12 13 14 15

      // front
      for (int i = pY1; i <= pY2; i++) {
        for (int j = pX1; j <= pX2; j++) {
          x[pCount] = j;
          y[pCount] = i;
          z[pCount++] = -pZSize2;
        }
      }
      int pBackOffSet = pCount;
      // back
      for (int i = pY1; i <= pY2; i++) {
        for (int j = pX1; j <= pX2; j++) {
          x[pCount] = j;
          y[pCount] = i;
          z[pCount++] = +pZSize2;
        }
      }
      // segments
      double segSize = (2.0 * pZSize2) / (double) (ZSEGMENTS - 1);
      for (int i = 0; i < ZSEGMENTS; i++) {
        // top
        for (int j = pX1; j <= pX2; j++) {
          x[pCount] = j;
          y[pCount] = pY1;
          z[pCount++] = -pZSize2 + i * segSize;
        }
        // bottom
        for (int j = pX1; j <= pX2; j++) {
          x[pCount] = j;
          y[pCount] = pY2;
          z[pCount++] = -pZSize2 + i * segSize;
        }
        // left
        for (int j = pY1; j <= pY2; j++) {
          x[pCount] = pX1;
          y[pCount] = j;
          z[pCount++] = -pZSize2 + i * segSize;
        }
        // right
        for (int j = pY1; j <= pY2; j++) {
          x[pCount] = pX2;
          y[pCount] = j;
          z[pCount++] = -pZSize2 + i * segSize;
        }
      }

      int horizPCount = pX2 - pX1 + 1;
      int p1, p2, p3, p4;

      // faces front side
      for (int i = 0; i < pY2 - pY1; i++) {
        for (int j = 0; j < pX2 - pX1; j++) {
          int col = pImg.getARGBValue(j + pX1, i + pY1);
          p1 = i * horizPCount + j;
          p2 = i * horizPCount + (j + 1);
          p3 = (i + 1) * horizPCount + j;
          p4 = (i + 1) * horizPCount + (j + 1);
          addRect(p1, p2, p3, p4, col);
        }
      }
      // faces right side
      for (int i = 0; i < pY2 - pY1; i++) {
        p1 = i * horizPCount + (horizPCount - 1);
        p2 = i * horizPCount + pBackOffSet + (horizPCount - 1);
        p3 = (i + 1) * horizPCount + (horizPCount - 1);
        p4 = (i + 1) * horizPCount + pBackOffSet + (horizPCount - 1);
        addRect(p1, p2, p3, p4, pAvgColor);
      }
      // faces left side
      for (int i = 0; i < pY2 - pY1; i++) {
        p1 = i * horizPCount + pBackOffSet;
        p2 = i * horizPCount;
        p3 = (i + 1) * horizPCount + pBackOffSet;
        p4 = (i + 1) * horizPCount;
        addRect(p1, p2, p3, p4, pAvgColor);
      }
      // faces top side
      for (int i = 0; i < pX2 - pX1; i++) {
        p1 = i + pBackOffSet;
        p2 = i + 1 + pBackOffSet;
        p3 = i;
        p4 = i + 1;
        addRect(p1, p2, p3, p4, pAvgColor);
      }
      // faces bottom side
      for (int i = 0; i < pX2 - pX1; i++) {
        p1 = pBackOffSet - horizPCount + i;
        p2 = pBackOffSet - horizPCount + i + 1;
        p3 = 2 * pBackOffSet - horizPCount + i;
        p4 = 2 * pBackOffSet - horizPCount + i + 1;
        addRect(p1, p2, p3, p4, pAvgColor);
      }
      // faces back side
      for (int i = 0; i < pY2 - pY1; i++) {
        for (int j = 0; j < pX2 - pX1; j++) {
          int col = pImg.getARGBValue(j + pX1, i + pY1);
          p1 = i * horizPCount + (j + 1) + pBackOffSet;
          p2 = i * horizPCount + j + pBackOffSet;
          p3 = (i + 1) * horizPCount + (j + 1) + pBackOffSet;
          p4 = (i + 1) * horizPCount + j + pBackOffSet;
          addRect(p1, p2, p3, p4, col);
        }
      }

    }

    // 1 2
    // 3 4
    private void addRect(int p1, int p2, int p3, int p4, int col) {
      pp1[fCount] = p1;
      pp2[fCount] = p3;
      pp3[fCount] = p2;
      color[fCount++] = col;

      pp1[fCount] = p2;
      pp2[fCount] = p3;
      pp3[fCount] = p4;
      color[fCount++] = col;
    }
  }

  public int getBlockWidth() {
    return blockWidth;
  }

  public void setBlockWidth(int blockWidth) {
    this.blockWidth = blockWidth;
  }

  public int getBlockHeight() {
    return blockHeight;
  }

  public void setBlockHeight(int blockHeight) {
    this.blockHeight = blockHeight;
  }

  public static class GenlockEditor extends ComboBoxPropertyEditor {
    public GenlockEditor() {
      super();
      setAvailableValues(new Genlock[] { Genlock.OFF, Genlock.COLOR, Genlock.IN_RANGE, Genlock.OUT_RANGE });
    }
  }

  public static class BlockTypeEditor extends ComboBoxPropertyEditor {
    public BlockTypeEditor() {
      super();
      setAvailableValues(new BlockType[] { BlockType.SIMPLE, BlockType.DETAILED });
    }
  }

  public int getBlockThickness() {
    return blockThickness;
  }

  public void setBlockThickness(int blockThickness) {
    this.blockThickness = blockThickness;
  }

  public Genlock getGenlock() {
    return genlock;
  }

  public void setGenlock(Genlock genlock) {
    this.genlock = genlock;
  }

  public Color getGenlockColorA() {
    return genlockColorA;
  }

  public void setGenlockColorA(Color genlockColorA) {
    this.genlockColorA = genlockColorA;
  }

  public Color getGenlockColorB() {
    return genlockColorB;
  }

  public void setGenlockColorB(Color genlockColorB) {
    this.genlockColorB = genlockColorB;
  }

  public BlockType getBlockType() {
    return blockType;
  }

  public void setBlockType(BlockType blockType) {
    this.blockType = blockType;
  }

}
TOP

Related Classes of org.jwildfire.transform.Pixelize3DTransformer$GenlockEditor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.