/**
   * @param s
   * @param fill
   * @return
   */
  public Bitmap getImage(String s, int fill) {
    // check image has for image
    Bitmap image = images.get(s);
    if (image != null) {
      return image;
    }
    // check xobjects for stream
    Stream st = (Stream) library.getObject(xobjects, s);
    if (st == null) {
      return null;
    }
    // return null if the xobject is not an image
    if (!st.isImageSubtype()) {
      return null;
    }
    // lastly return the images.
    try {
      image = st.getImage(fill, this, true);
    } catch (Exception e) {
      logger.log(Level.FINE, "Error getting image by name: " + s, e);
    }

    if (image != null && !st.isImageMask()) {
      images.put(s, image);
    }
    return image;
  }
  public void dispose(boolean cache) {
    /*
    System.out.println("Resources.dispose()  cache: " + cache);
    try { throw new RuntimeException("MARK"); } catch(Exception e) {
        StackTraceElement[] ste = e.getStackTrace();
        for(int i = 1; i < Math.min(20,ste.length); i++)
            System.out.println("  " + ste[i].getClassName() + "." + ste[i].getMethodName() + " : " + ste[i].getLineNumber());
    }
    */
    // remove all images.
    if (images != null) {
      Enumeration shapeContent = images.elements();
      // find all shapes that are images
      while (shapeContent.hasMoreElements()) {
        Object image = shapeContent.nextElement();
        if (image instanceof Bitmap) {
          Bitmap tmp = (Bitmap) image;
          tmp.recycle();
        }
      }
      // clear hash to free max memory
      images.clear();
    }
    // NOTE: Make sure not to clear fonts, color spaces, pattern,
    // or extGStat's as this hold reverences to object not the actual
    // object. The only images contain object with a lot of memory

    if (xobjects != null) {
      Enumeration xobjectContent = xobjects.elements();
      while (xobjectContent.hasMoreElements()) {
        Object tmp = xobjectContent.nextElement();
        if (tmp instanceof Stream) {
          Stream stream = (Stream) tmp;
          stream.dispose(cache);
        }
        if (tmp instanceof Reference) {
          Object reference = library.getObject((Reference) tmp);
          if (reference instanceof Form) {
            Form form = (Form) reference;
            form.dispose(cache);
          }
          if (reference instanceof Stream) {
            Stream stream = (Stream) reference;
            stream.dispose(cache);
          }
        }
      }
    }
  }