@Override
  public BufferedImage doTransform(BufferedImage src, BufferedImage dest) {
    float refraction = refractionIndex.getValueAsPercentage();
    int hRadius = radius.getValue(0);
    int vRadius = radius.getValue(1);

    if (refraction == 1.0f || hRadius == 0 || vRadius == 0) {
      return src;
    }

    if (filter == null) {
      filter = new SphereFilter();
    }

    filter.setCentreX(center.getRelativeX());
    filter.setCentreY(center.getRelativeY());

    filter.setA(hRadius);
    filter.setB(vRadius);

    filter.setRefractionIndex(refraction);

    //        filter.setEdgeAction(edgeAction.getCurrentInt());
    filter.setInterpolation(interpolation.getValue());

    dest = filter.filter(src, dest);

    super.setAffectedAreaShapes(filter.getAffectedAreaShapes());

    return dest;
  }
  @Override
  public BufferedImage doTransform(BufferedImage src, BufferedImage dest) {
    // fill with the background color
    Graphics2D g = dest.createGraphics();
    g.setRenderingHint(KEY_ANTIALIASING, VALUE_ANTIALIAS_ON);
    g.setRenderingHint(KEY_INTERPOLATION, VALUE_INTERPOLATION_BICUBIC);
    g.setColor(bgColorParam.getColor());
    g.fillRect(0, 0, dest.getWidth(), dest.getHeight());

    double theta = angleParam.getValueInRadians();

    ImageLayer layer = ImageComponents.getActiveImageLayerOrMask().get();

    float relativeX = centerParam.getRelativeX();
    float relativeY = centerParam.getRelativeY();

    double centerShiftX = (-layer.getTX() + src.getWidth()) * relativeX;
    double centerShiftY = (-layer.getTY() + src.getHeight()) * relativeY;

    AffineTransform transform =
        AffineTransform.getRotateInstance(theta, centerShiftX, centerShiftY);

    int scaleX = scaleParam.getValue(0);
    int scaleY = scaleParam.getValue(1);
    if ((scaleX != 100) || (scaleY != 100)) {
      transform.translate(centerShiftX, centerShiftY);
      transform.scale(scaleX / 100.0, scaleY / 100.0);
      transform.translate(-centerShiftX, -centerShiftY);
    }

    int shearX = shearParam.getValue(0);
    int shearY = shearParam.getValue(1);
    if ((shearX != 0) || (shearY != 0)) {
      transform.translate(centerShiftX, centerShiftY);
      transform.shear(shearX / 100.0, shearY / 100.0);
      transform.translate(-centerShiftX, -centerShiftY);
    }

    g.drawImage(src, transform, null);

    g.dispose();

    return dest;
  }