/**
   * Setzt den Owner (Parameterdump jas wird gelesen
   *
   * @param owner
   */
  public void setOwner(JAntiCaptcha owner) {
    this.owner = owner;
    jas = owner.getJas();
    errorAWeight = jas.getDouble("errorAWeight");
    errorbWeight = jas.getDouble("errorBWeight");
    coverageFaktorAWeight = jas.getDouble("coverageFaktorAWeight");
    coverageFaktorBWeight = jas.getDouble("coverageFaktorBWeight");
    intersectionDimensionWeight = jas.getDouble("intersectionDimensionWeight");
    intersectionAHeightWeight = jas.getDouble("intersectionAHeightWeight");
    intersectionAWidthWeight = jas.getDouble("intersectionAWidthWeight");
    cleftFaktor = jas.getDouble("cleftFaktor");
    minCleftSize = jas.getInteger("minCleftSize");
    preScanFilter = jas.getInteger("preScanFilter");
    preScanFaktor = jas.getInteger("preScanFaktor");
    overlayNoiseSize = jas.getInteger("overlayNoiseSize");
    scanStepX = jas.getInteger("scanstepx");
    scanStepY = jas.getInteger("scanstepy");
    prescanDivider = jas.getDouble("prescandivider");
    divider = jas.getDouble("divider");
    extensionCodeArguments[0] = this;
    if (jas.getString("comparatorExtension").length() > 0) {
      String[] ref = jas.getString("comparatorExtension").split("\\.");
      if (ref.length != 2) {
        if (Utilities.isLoggerActive()) {
          logger.severe("comparatorExtension should have the format Class.Method");
        }
      }
      String cl = ref[0];
      String methodname = ref[1];
      Class<?> newClass;
      try {
        newClass = Class.forName("jd.captcha.specials." + cl);

        extensionCodeMethod = newClass.getMethod(methodname, extensionCodeParameterTypes);

      } catch (Exception e) {
        JDLogger.exception(e);
      }
    }
  }
  private double scanIntersection(
      int xx, int yy, int left, int top, int tmpIntersectionWidth, int tmpIntersectionHeight) {
    offset = new int[] {left, top};
    imgOffset = new int[] {xx, yy};
    intersectionDimension = new int[] {tmpIntersectionWidth, tmpIntersectionHeight};

    double tmpError;
    pixelAll = 0;
    tmpPixelBButNotA = 0;
    tmpPixelAButNotB = 0;
    tmpPixelBoth = 0;
    tmpCoverageFaktorA = 0;
    tmpCoverageFaktorB = 0;
    // long starter=Utilities.getTimer();
    bothElements.removeAllElements();
    elementGrid = new int[tmpIntersectionWidth][tmpIntersectionHeight];

    for (int x = 0; x < tmpIntersectionWidth; x += scanStepX) {
      for (int y = 0; y < tmpIntersectionHeight; y += scanStepY) {

        int pixelType = getPixelType(x, y, xx, yy, left, top);
        pixelAll++;

        switch (pixelType) {
          case 0:
            if (isCreateIntersectionLetter()) {
              intersectionGrid[x][y] = BOTHCOLOR;
            }
            if (cleftFaktor > 0) {
              getElement(
                  x, y, xx, yy, left, top, pixelType, elementGrid, element = new Vector<Integer>());
              if (element.size() > minCleftSize) {
                bothElements.add(element);
              }
            }
            tmpPixelBoth++;
            break;
          case 1:
            if (overlayNoiseSize <= 0
                || hasNeighbour(x, y, xx, yy, left, top, pixelType) > overlayNoiseSize) {
              tmpPixelBButNotA++;
              if (isCreateIntersectionLetter()) {
                intersectionGrid[x][y] = BNACOLOR;
              }
            } else {
              if (isCreateIntersectionLetter()) {
                intersectionGrid[x][y] = BNAFILTEREDCOLOR;
              }
            }
            break;
          case 2:
            if (overlayNoiseSize <= 0
                || hasNeighbour(x, y, xx, yy, left, top, pixelType) > overlayNoiseSize) {
              tmpPixelAButNotB++;
              if (isCreateIntersectionLetter()) {
                intersectionGrid[x][y] = ANBCOLOR;
              }
            } else {

              if (isCreateIntersectionLetter()) {
                intersectionGrid[x][y] = ANBFILTEREDCOLOR;
              }
            }
            break;
          default:
            if (isCreateIntersectionLetter()) {
              intersectionGrid[x][y] = 0xffffff;
            }
        }
      }
    }

    // logger.info("Scanner: "+Utilities.getTimer(starter));
    // if(getDecodedValue().equalsIgnoreCase("v")&&getBothElementsNum()==3){
    // logger.info("JJJ");
    // }
    if (pixelAll > 0 && (bothElements.size() > 0 || cleftFaktor == 0)) {
      tmpErrorA = (double) tmpPixelAButNotB / (double) (tmpPixelBoth + tmpPixelAButNotB);
      tmpErrorB = (double) tmpPixelBButNotA / (double) (tmpPixelBButNotA + tmpPixelBoth);
      tmpErrorTotal = tmpErrorA * errorAWeight + tmpErrorB * errorbWeight;

      tmpCoverageFaktorA =
          1.0 - tmpPixelBoth / ((double) a.getElementPixel() / (scanStepX * scanStepY));
      tmpCoverageFaktorB =
          1.0 - tmpPixelBoth / ((double) b.getElementPixel() / (scanStepX * scanStepY));
      setLocalHeightPercent((double) tmpIntersectionHeight / (double) b.getHeight());
      localWidthPercent = (double) tmpIntersectionWidth / (double) b.getWidth();
      double lhp = 1.0 - getLocalHeightPercent();
      double lwp = 1.0 - localWidthPercent;
      tmpHeightFaktor = lhp * lhp;
      tmpWidthFaktor = lwp * lwp;
      tmpHeightAFaktor = 1.0 - (double) tmpIntersectionHeight / (double) a.getHeight();
      tmpWidthAFaktor = 1.0 - (double) tmpIntersectionWidth / (double) a.getWidth();
      // logger.info(tmpIntersectionWidth+ "/"+a.getWidth()+" =
      // "+localWidthPercent+" --> "+tmpWidthFaktor);

      tmpError = tmpErrorTotal;
      tmpError += Math.min(1.0, tmpCoverageFaktorA) * coverageFaktorAWeight;
      tmpError += Math.min(1.0, tmpCoverageFaktorB) * coverageFaktorBWeight;
      tmpError += Math.min(1.0, tmpHeightFaktor) * intersectionDimensionWeight;
      tmpError += Math.min(1.0, tmpWidthFaktor) * intersectionDimensionWeight;
      tmpError += Math.min(1.0, tmpHeightAFaktor) * intersectionAHeightWeight;
      tmpError += Math.min(1.0, tmpWidthAFaktor) * intersectionAWidthWeight;
      if (bothElements.size() > 0) {
        tmpError += (bothElements.size() - 1) * cleftFaktor;
      }

      tmpExtensionError = 0.0;
      if (extensionCodeMethod != null) {
        try {
          extensionCodeArguments[1] = tmpError / divider;
          extensionCodeMethod.invoke(null, extensionCodeArguments);
        } catch (Exception e) {
          JDLogger.exception(e);
        }
      }

      tmpError += tmpExtensionError;
      tmpError /= divider;
      // tmpError = Math.min(1.0, tmpError);
      // logger.info(pixelBoth+"_"+(tmpIntersectionHeight *
      // tmpIntersectionWidth));
      if (tmpPixelBoth * owner.getJas().getDouble("inverseFontWeight")
          < tmpIntersectionHeight * tmpIntersectionWidth) {
        tmpError = tmpErrorA = tmpErrorB = tmpErrorTotal = 10000.0 / 100.0;
      }

      return 100.0 * tmpError;
    } else {

      return 10000.0;
    }
  }