Package org.newdawn.slick.opengl

Source Code of org.newdawn.slick.opengl.CompositeImageData

package org.newdawn.slick.opengl;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.util.ArrayList;

import org.newdawn.slick.util.Log;

/**
* A composite data source that checks multiple loaders in order of
* preference
*
* @author kevin
*/
public class CompositeImageData implements LoadableImageData  {
  /** The list of images sources in order of preference to try loading the data with */
  private ArrayList sources = new ArrayList();
  /** The data source that worked and was used - or null if no luck */
  private LoadableImageData picked;
 
  /**
   * Add a potentional source of image data
   *
   * @param data The data source to try
   */
  public void add(LoadableImageData data) {
    sources.add(data);
  }
 
  /**
   * @see org.newdawn.slick.opengl.LoadableImageData#loadImage(java.io.InputStream)
   */
  public ByteBuffer loadImage(InputStream fis) throws IOException {
    return loadImage(fis, false, null);
  }

  /**
   * @see org.newdawn.slick.opengl.LoadableImageData#loadImage(java.io.InputStream, boolean, int[])
   */
  public ByteBuffer loadImage(InputStream fis, boolean flipped, int[] transparent) throws IOException {
    return loadImage(fis, flipped, false, transparent);
  }

  /**
   * @see org.newdawn.slick.opengl.LoadableImageData#loadImage(java.io.InputStream, boolean, boolean, int[])
   */
  public ByteBuffer loadImage(InputStream is, boolean flipped, boolean forceAlpha, int[] transparent) throws IOException {
    CompositeIOException exception = new CompositeIOException();
    ByteBuffer buffer = null;
   
    BufferedInputStream in = new BufferedInputStream(is, is.available());
    in.mark(is.available());
   
    // cycle through our source until one of them works
    for (int i=0;i<sources.size();i++) {
      in.reset();
      try {
        LoadableImageData data = (LoadableImageData) sources.get(i);
       
        buffer = data.loadImage(in, flipped, forceAlpha, transparent);
        picked = data;
        break;
      } catch (Exception e) {
        Log.warn(sources.get(i).getClass()+" failed to read the data");
        exception.addException(e);
      }
    }
   
    if (picked == null) {
      throw exception;
    }
   
    return buffer;
  }

  /**
   * Check the state of the image data and throw a
   * runtime exception if theres a problem
   */
  private void checkPicked() {
    if (picked == null) {
      throw new RuntimeException("Attempt to make use of uninitialised or invalid composite image data");
    }
  }
 
  /**
   * @see org.newdawn.slick.opengl.ImageData#getDepth()
   */
  public int getDepth() {
    checkPicked();
   
    return picked.getDepth();
  }

  /**
   * @see org.newdawn.slick.opengl.ImageData#getHeight()
   */
  public int getHeight() {
    checkPicked();
   
    return picked.getHeight();
  }

  /**
   * @see org.newdawn.slick.opengl.ImageData#getImageBufferData()
   */
  public ByteBuffer getImageBufferData() {
    checkPicked();
   
    return picked.getImageBufferData();
  }

  /**
   * @see org.newdawn.slick.opengl.ImageData#getTexHeight()
   */
  public int getTexHeight() {
    checkPicked();
   
    return picked.getTexHeight();
  }

  /**
   * @see org.newdawn.slick.opengl.ImageData#getTexWidth()
   */
  public int getTexWidth() {
    checkPicked();
   
    return picked.getTexWidth();
  }

  /**
   * @see org.newdawn.slick.opengl.ImageData#getWidth()
   */
  public int getWidth() {
    checkPicked();
   
    return picked.getWidth();
  }

}
TOP

Related Classes of org.newdawn.slick.opengl.CompositeImageData

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.