Ejemplo n.º 1
0
  public int process(Buffer in, Buffer out) {
    out.setMetaTo(in);
    if (in.isFlag(DISCARD)) {
      return CODEC_OK;
    }
    out.format = outputFormat;

    SeekableByteArrayOutputStream tmp;
    if (out.data instanceof byte[]) {
      tmp = new SeekableByteArrayOutputStream((byte[]) out.data);
    } else {
      tmp = new SeekableByteArrayOutputStream();
    }
    Format vf = outputFormat;

    // Handle sub-image
    Rectangle r;
    int scanlineStride;
    if (in.data instanceof BufferedImage) {
      BufferedImage image = (BufferedImage) in.data;
      WritableRaster raster = image.getRaster();
      scanlineStride = raster.getSampleModel().getWidth();
      r = raster.getBounds();
      r.x -= raster.getSampleModelTranslateX();
      r.y -= raster.getSampleModelTranslateY();
    } else {
      r = new Rectangle(0, 0, vf.get(WidthKey), vf.get(HeightKey));
      scanlineStride = vf.get(WidthKey);
    }

    try {
      switch (vf.get(DepthKey)) {
        case 8:
          {
            writeKey8(
                tmp,
                getIndexed8(in),
                r.width,
                r.height,
                r.x + r.y * scanlineStride,
                scanlineStride);
            break;
          }
        case 16:
          {
            writeKey16(
                tmp, getRGB15(in), r.width, r.height, r.x + r.y * scanlineStride, scanlineStride);
            break;
          }
        case 24:
          {
            writeKey24(
                tmp, getRGB24(in), r.width, r.height, r.x + r.y * scanlineStride, scanlineStride);
            break;
          }
        case 32:
          {
            writeKey24(
                tmp, getARGB32(in), r.width, r.height, r.x + r.y * scanlineStride, scanlineStride);
            break;
          }
        default:
          {
            out.setFlag(DISCARD);
            return CODEC_FAILED;
          }
      }

      out.format = outputFormat;
      out.sampleCount = 1;
      out.setFlag(KEYFRAME);
      out.data = tmp.getBuffer();
      out.offset = 0;
      out.length = (int) tmp.getStreamPosition();
      return CODEC_OK;
    } catch (IOException ex) {
      ex.printStackTrace();
      out.setFlag(DISCARD);
      return CODEC_FAILED;
    }
  }