Package org.jwildfire.transform

Source Code of org.jwildfire.transform.Genlock3DTransformer$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.PropertyCategory;
import org.jwildfire.image.Pixel;
import org.jwildfire.image.SimpleImage;
import org.jwildfire.image.WFImage;

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

public class Genlock3DTransformer extends Mesh3DTransformer {

  public enum Genlock {
    COLOR, IN_RANGE, OUT_RANGE
  }

  @Property(category = PropertyCategory.PRIMARY, description = "Genlock mode", editorClass = GenlockEditor.class)
  private Genlock genlock = Genlock.COLOR;
  @Property(category = PropertyCategory.PRIMARY, description = "Genlock color A")
  protected Color colorA = new Color(0, 0, 0);
  @Property(category = PropertyCategory.PRIMARY, description = "Genlock color B")
  protected Color colorB = new Color(0, 0, 0);

  @Override
  protected void transformMesh(Mesh3D pMesh3D, int pImageWidth, int pImageHeight) {
    int fCount = pMesh3D.getFCount();
    /* 3-point-polygons */
    if (fCount > 0) {
      Pixel pixel = new Pixel();
      int fLst[] = new int[fCount];
      int color[] = pMesh3D.getColor();
      double u[] = pMesh3D.getU();
      double v[] = pMesh3D.getV();
      int p1[] = pMesh3D.getPP1();
      SimpleImage texture = pMesh3D.getTexture();

      int valid = 0;
      int r1 = this.colorA.getRed();
      int g1 = this.colorA.getGreen();
      int b1 = this.colorA.getBlue();
      int r2 = this.colorB.getRed();
      int g2 = this.colorB.getGreen();
      int b2 = this.colorB.getBlue();
      if (this.genlock == Genlock.COLOR) {
        for (int i = 0; i < fCount; i++) {
          if (color != null) {
            pixel.setARGBValue(color[i]);
          }
          else {
            int px = (int) (u[p1[i]] * texture.getImageWidth() + 0.5);
            int py = (int) (v[p1[i]] * texture.getImageHeight() + 0.5);
            pixel.setARGBValue(texture.getARGBValueIgnoreBounds(px, py));
          }
          if ((pixel.r != r1) || (pixel.g != g1) || (pixel.b != b1)) {
            fLst[i] = 1;
            valid++;
          }
        }
      }
      else if (this.genlock == Genlock.IN_RANGE) {
        for (int i = 0; i < fCount; i++) {
          if (color != null) {
            pixel.setARGBValue(color[i]);
          }
          else {
            int px = (int) (u[p1[i]] * texture.getImageWidth() + 0.5);
            int py = (int) (v[p1[i]] * texture.getImageHeight() + 0.5);
            pixel.setARGBValue(texture.getARGBValueIgnoreBounds(px, py));
          }
          if ((((pixel.r >= r1) && (pixel.r <= r2)) || ((pixel.r >= r2) && (pixel.r <= r1)))
              || (((pixel.g >= g1) && (pixel.g <= g2)) || ((pixel.g >= g2) && (pixel.g <= g1)))
              || (((pixel.b >= b1) && (pixel.b <= b2)) || ((pixel.b >= b2) && (pixel.b <= b1)))) {

          }
          else {
            fLst[i] = 1;
            valid++;
          }
        }
      }
      else if (this.genlock == Genlock.OUT_RANGE) {
        for (int i = 0; i < fCount; i++) {
          if (color != null) {
            pixel.setARGBValue(color[i]);
          }
          else {
            int px = (int) (u[p1[i]] * texture.getImageWidth() + 0.5);
            int py = (int) (v[p1[i]] * texture.getImageHeight() + 0.5);
            pixel.setARGBValue(texture.getARGBValueIgnoreBounds(px, py));
          }
          if ((((pixel.r >= r1) && (pixel.r <= r2)) || ((pixel.r >= r2) && (pixel.r <= r1)))
              || (((pixel.g >= g1) && (pixel.g <= g2)) || ((pixel.g >= g2) && (pixel.g <= g1)))
              || (((pixel.b >= b1) && (pixel.b <= b2)) || ((pixel.b >= b2) && (pixel.b <= b1)))) {
            fLst[i] = 1;
            valid++;
          }
        }
      }

      if (valid < fCount) {
        if (valid > 0) {
          pMesh3D.setFCount(valid);
          {
            int pp[] = new int[valid];
            int curr = 0;
            int ps[] = pMesh3D.getPP1();
            for (int i = 0; i < fCount; i++) {
              if (fLst[i] != 0)
                pp[curr++] = ps[i];
            }
            pMesh3D.setPP1(pp);
          }
          {
            int pp[] = new int[valid];
            int curr = 0;
            int ps[] = pMesh3D.getPP2();
            for (int i = 0; i < fCount; i++) {
              if (fLst[i] != 0)
                pp[curr++] = ps[i];
            }
            pMesh3D.setPP2(pp);
          }
          {
            int pp[] = new int[valid];
            int curr = 0;
            int ps[] = pMesh3D.getPP3();
            for (int i = 0; i < fCount; i++) {
              if (fLst[i] != 0)
                pp[curr++] = ps[i];
            }
            pMesh3D.setPP3(pp);
          }

          if (pMesh3D.getColor() != null) {
            int rr[] = new int[valid];
            int curr = 0;
            int rs[] = pMesh3D.getColor();
            for (int i = 0; i < fCount; i++) {
              if (fLst[i] != 0)
                rr[curr++] = rs[i];
            }
            pMesh3D.setColor(rr);
          }
        }
        else {
          pMesh3D.setFCount(0);
          pMesh3D.setPP1(null);
          pMesh3D.setPP2(null);
          pMesh3D.setPP3(null);
          pMesh3D.setColor(null);
        }
      }
    }
  }

  @Override
  public void initDefaultParams(WFImage pImg) {
    super.initDefaultParams(pImg);
    genlock = Genlock.COLOR;
    colorA = new Color(0, 0, 0);
    colorB = new Color(0, 0, 0);
  }

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

  public Genlock getGenlock() {
    return genlock;
  }

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

  public Color getColorA() {
    return colorA;
  }

  public void setColorA(Color colorA) {
    this.colorA = colorA;
  }

  public Color getColorB() {
    return colorB;
  }

  public void setColorB(Color colorB) {
    this.colorB = colorB;
  }

}
TOP

Related Classes of org.jwildfire.transform.Genlock3DTransformer$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.