/* * @(#)Java2DRenderer.java 1.12 02/08/21 * * Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved. */ package com.sun.media.renderer.video; import javax.media.*; import javax.media.renderer.VideoRenderer; import javax.media.Format; import javax.media.format.*; import java.awt.*; import java.awt.image.*; import java.awt.event.*; import java.util.Vector; import java.awt.color.ColorSpace; import java.awt.geom.*; import com.sun.media.*; import com.sun.media.util.Arch; /** * Renderer for RGB images using BufferedImage */ public class Java2DRenderer implements Blitter { /************************************************************************* * Variables and Constants *************************************************************************/ private transient AffineTransformOp savedATO = null; private transient DirectColorModel dcm = null; private transient Image destImage = null; /************************************************************************* * Constructor *************************************************************************/ public Java2DRenderer() { try { Class.forName("java.awt.Graphics2D"); } catch (ClassNotFoundException e) { throw new RuntimeException("No Java2D"); } } /** * Processes the data and creates an image to be rendered */ public Image process(Buffer buffer, Object cacheInputImage, Object cacheOutputImage, Dimension size) { return (Image) cacheInputImage; } public synchronized void draw(Graphics g, Component component, Image lastImage, int dx, int dy, int dw, int dh, int sx, int sy, int sw, int sh) { if (lastImage == null || dw < 1 || dh < 1) return; if (savedATO == null) { AffineTransform at = new AffineTransform((float)dw / sw, 0, 0, (float)dh / sh, 0, 0); AffineTransformOp ato = new AffineTransformOp(at, null); savedATO = ato; destImage = ato.createCompatibleDestImage((BufferedImage)lastImage, (ColorModel)dcm); } ((AffineTransformOp)savedATO).filter((BufferedImage)lastImage, (BufferedImage)destImage); if (g != null && lastImage != null && g instanceof Graphics2D) { ((Graphics2D)g).drawImage(destImage, 0, 0, component); } } public int newData(Buffer buffer, Vector cacheInputImage, Vector cacheOutputImage, Vector cacheInputData) { Object data = buffer.getData(); if (!(data instanceof int[])) return -1; RGBFormat format = (RGBFormat) buffer.getFormat(); int rMask, gMask, bMask; /* rMask = 0x000000FF; gMask = 0x0000FF00; bMask = 0x00FF0000; */ rMask = format.getRedMask(); gMask = format.getGreenMask(); bMask = format.getBlueMask(); int [] masks = new int[3]; masks[0] = rMask; masks[1] = gMask; masks[2] = bMask; DataBuffer db = new DataBufferInt((int[])data, format.getLineStride() * format.getSize().height); SampleModel sm = new SinglePixelPackedSampleModel(DataBuffer.TYPE_INT, format.getLineStride(), format.getSize().height, masks); WritableRaster wr = Raster.createWritableRaster(sm, db, new Point(0, 0)); dcm = new DirectColorModel(24, rMask, gMask, bMask); BufferedImage sourceImage = new BufferedImage((ColorModel)dcm, wr, true, null); cacheInputData.addElement(data); cacheInputImage.addElement(sourceImage); cacheOutputImage.addElement(sourceImage); // dummy synchronized (this) { savedATO = null; } return cacheInputImage.size() - 1; } public void resized(Component c) { savedATO = null; } }