/**
  * Accepts a new MaskedGray8Image and initializes all the generator indices.
  *
  * @param image The input MaskedGray8Image.
  * @throws jjil.core.Error if the input is not of type MaskedGray8Image or is smaller than the
  *     subimages to be generated.
  */
 public void push(Image image) throws jjil.core.Error {
   if (!(image instanceof Gray8MaskedImage)) {
     throw new Error(
         Error.PACKAGE.ALGORITHM,
         ErrorCodes.OBJECT_NOT_EXPECTED_TYPE,
         image.toString(),
         "Gray8MaskedImage",
         null);
   }
   if (image.getWidth() < this.nWidth || image.getHeight() < this.nHeight) {
     throw new Error(
         Error.PACKAGE.ALGORITHM,
         ErrorCodes.IMAGE_TOO_SMALL,
         image.toString(),
         new Integer(this.nWidth).toString(),
         new Integer(this.nHeight).toString());
   }
   this.imageInput = (Gray8MaskedImage) image;
   // we want to find the largest integer l such that
   // (l-1) * w + w  <= iw
   // where l = computed limit on index
   // w = subimage width or height
   // iw = image width or height
   // or l = (iw - w) / w  + 1 (truncated)
   // Java division truncates
   this.nHorizLimit = (image.getWidth() - this.nWidth) / this.nXOffset;
   this.nVertLimit = (image.getHeight() - this.nHeight) / this.nYOffset;
   this.nHorizIndex = -1; // first time through increments
   this.nVertIndex = 0;
   this.oSubImageReady = false;
 }
 /**
  * Assigns a constant rectangle to the input Gray8Image, replacing values in the image.
  *
  * @param image the input image (output replaces input).
  * @throws Error if the input is not a Gray8Image.
  */
 public void push(Image image) throws Error {
   if (!(image instanceof Gray8Image)) {
     throw new Error(
         Error.PACKAGE.ALGORITHM, ErrorCodes.IMAGE_NOT_GRAY8IMAGE, image.toString(), null, null);
   }
   Gray8Image input = (Gray8Image) image;
   byte[] data = input.getData();
   int nLimitY = Math.min(input.getHeight(), this.cY + this.nHeight);
   int nLimitX = Math.min(input.getWidth(), this.cX + this.nWidth);
   for (int i = this.cY; i < nLimitY; i++) {
     int nStart = i * image.getWidth();
     for (int j = this.cX; j < nLimitX; j++) {
       data[nStart + j] = this.bValue;
     }
   }
   super.setOutput(input);
 }