docs: @Override
      public BufferedImage read(final int pIndex, final ImageReadParam pParam) throws IOException {
          init();
          checkBounds(pIndex);
  
          // Quick look-up
          BufferedImage image = null;
          if (pIndex < thumbnails.length) {
              image = thumbnails[pIndex];
          }
  
          if (image == null) {
              // Read the image, it's a JFIF stream, inside the OLE 2 CompoundDocument
              init(pIndex);
  
              image = reader.read(0, pParam);
              reader.reset();
  
              if (pParam == null) {
                  thumbnails[pIndex] = image; // TODO: Caching is not kosher, as images are mutable!!
              }
          }
          else {
              // Keep progress listeners happy
              processImageStarted(pIndex);
              processImageProgress(100);
              processImageComplete();
          }
  
          // Fake destination support
          if (pParam != null && (pParam.getDestination() != null && pParam.getDestination() != image ||
                  pParam.getDestinationType() != null && pParam.getDestinationType().getBufferedImageType() != image.getType())) {
              BufferedImage destination = getDestination(pParam, getImageTypes(pIndex), getWidth(pIndex), getHeight(pIndex));
  
              Graphics2D g = destination.createGraphics();
              try {
                  g.setComposite(AlphaComposite.Src);
                  g.drawImage(image, 0, 0, null);
              }
              finally {
                  g.dispose();
              }
  
              image = destination;
          }
  
          return image;
      }