private void sendPixels(ImageConsumer ic, int x, int y, int w, int h) {
   int off = pixeloffset + pixelscan * y + x;
   if (isConsumer(ic)) {
     if (pixels instanceof byte[]) {
       ic.setPixels(x, y, w, h, model, ((byte[]) pixels), off, pixelscan);
     } else {
       ic.setPixels(x, y, w, h, model, ((int[]) pixels), off, pixelscan);
     }
   }
 }
 private void produce() {
   if (consumer != null) {
     consumer.setDimensions(width, height);
   }
   if (consumer != null) {
     consumer.setProperties(new Hashtable());
   }
   sendPixels();
   if (consumer != null) {
     consumer.imageComplete(ImageConsumer.SINGLEFRAMEDONE);
   }
 }
 /**
  * Changes this memory image into a multi-frame animation or a single-frame static image depending
  * on the animated parameter.
  *
  * <p>This method should be called immediately after the MemoryImageSource is constructed and
  * before an image is created with it to ensure that all ImageConsumers will receive the correct
  * multi-frame data. If an ImageConsumer is added to this ImageProducer before this flag is set
  * then that ImageConsumer will see only a snapshot of the pixel data that was available when it
  * connected.
  *
  * @param animated <code>true</code> if the image is a multi-frame animation
  */
 public synchronized void setAnimated(boolean animated) {
   this.animating = animated;
   if (!animating) {
     Enumeration enum_ = theConsumers.elements();
     while (enum_.hasMoreElements()) {
       ImageConsumer ic = (ImageConsumer) enum_.nextElement();
       ic.imageComplete(ImageConsumer.STATICIMAGEDONE);
       if (isConsumer(ic)) {
         ic.imageComplete(ImageConsumer.IMAGEERROR);
       }
     }
     theConsumers.removeAllElements();
   }
 }
 /**
  * Specifies whether this animated memory image should always be updated by sending the complete
  * buffer of pixels whenever there is a change. This flag is ignored if the animation flag is not
  * turned on through the setAnimated() method.
  *
  * <p>This method should be called immediately after the MemoryImageSource is constructed and
  * before an image is created with it to ensure that all ImageConsumers will receive the correct
  * pixel delivery hints.
  *
  * @param fullbuffers <code>true</code> if the complete pixel buffer should always be sent
  * @see #setAnimated
  */
 public synchronized void setFullBufferUpdates(boolean fullbuffers) {
   if (this.fullbuffers == fullbuffers) {
     return;
   }
   this.fullbuffers = fullbuffers;
   if (animating) {
     Enumeration enum_ = theConsumers.elements();
     while (enum_.hasMoreElements()) {
       ImageConsumer ic = (ImageConsumer) enum_.nextElement();
       ic.setHints(
           fullbuffers
               ? (ImageConsumer.TOPDOWNLEFTRIGHT | ImageConsumer.COMPLETESCANLINES)
               : ImageConsumer.RANDOMPIXELORDER);
     }
   }
 }
 /**
  * Adds an ImageConsumer to the list of consumers interested in data for this image.
  *
  * @param ic the specified <code>ImageConsumer</code>
  * @throws NullPointerException if the specified <code>ImageConsumer</code> is null
  * @see ImageConsumer
  */
 public synchronized void addConsumer(ImageConsumer ic) {
   if (theConsumers.contains(ic)) {
     return;
   }
   theConsumers.addElement(ic);
   try {
     initConsumer(ic);
     sendPixels(ic, 0, 0, width, height);
     if (isConsumer(ic)) {
       ic.imageComplete(animating ? ImageConsumer.SINGLEFRAMEDONE : ImageConsumer.STATICIMAGEDONE);
       if (!animating && isConsumer(ic)) {
         ic.imageComplete(ImageConsumer.IMAGEERROR);
         removeConsumer(ic);
       }
     }
   } catch (Exception e) {
     if (isConsumer(ic)) {
       ic.imageComplete(ImageConsumer.IMAGEERROR);
     }
   }
 }
 private void initConsumer(ImageConsumer ic) {
   if (isConsumer(ic)) {
     ic.setDimensions(width, height);
   }
   if (isConsumer(ic)) {
     ic.setProperties(properties);
   }
   if (isConsumer(ic)) {
     ic.setColorModel(model);
   }
   if (isConsumer(ic)) {
     ic.setHints(
         animating
             ? (fullbuffers
                 ? (ImageConsumer.TOPDOWNLEFTRIGHT | ImageConsumer.COMPLETESCANLINES)
                 : ImageConsumer.RANDOMPIXELORDER)
             : (ImageConsumer.TOPDOWNLEFTRIGHT
                 | ImageConsumer.COMPLETESCANLINES
                 | ImageConsumer.SINGLEPASS
                 | ImageConsumer.SINGLEFRAME));
   }
 }
 /**
  * Sends a rectangular region of the buffer of pixels to any ImageConsumers that are currently
  * interested in the data for this image. If the framenotify parameter is true then the consumers
  * are also notified that an animation frame is complete. This method only has effect if the
  * animation flag has been turned on through the setAnimated() method. If the full buffer update
  * flag was turned on with the setFullBufferUpdates() method then the rectangle parameters will be
  * ignored and the entire buffer will always be sent.
  *
  * @param x the x coordinate of the upper left corner of the rectangle of pixels to be sent
  * @param y the y coordinate of the upper left corner of the rectangle of pixels to be sent
  * @param w the width of the rectangle of pixels to be sent
  * @param h the height of the rectangle of pixels to be sent
  * @param framenotify <code>true</code> if the consumers should be sent a {@link
  *     ImageConsumer#SINGLEFRAMEDONE SINGLEFRAMEDONE} notification
  * @see ImageConsumer
  * @see #setAnimated
  * @see #setFullBufferUpdates
  */
 public synchronized void newPixels(int x, int y, int w, int h, boolean framenotify) {
   if (animating) {
     if (fullbuffers) {
       x = y = 0;
       w = width;
       h = height;
     } else {
       if (x < 0) {
         w += x;
         x = 0;
       }
       if (x + w > width) {
         w = width - x;
       }
       if (y < 0) {
         h += y;
         y = 0;
       }
       if (y + h > height) {
         h = height - y;
       }
     }
     if ((w <= 0 || h <= 0) && !framenotify) {
       return;
     }
     Enumeration enum_ = theConsumers.elements();
     while (enum_.hasMoreElements()) {
       ImageConsumer ic = (ImageConsumer) enum_.nextElement();
       if (w > 0 && h > 0) {
         sendPixels(ic, x, y, w, h);
       }
       if (framenotify && isConsumer(ic)) {
         ic.imageComplete(ImageConsumer.SINGLEFRAMEDONE);
       }
     }
   }
 }
 private void sendPixels() {
   if (consumer != null) {
     consumer.setPixels(0, 0, width, height, getColorModel(), buffer, 0, width);
   }
 }