<test title="LookupOp Testing">
	<description>
		This test validates the convertion of Java 2D LookupOp
		into an SVG filter.
	</description>
	<description>
		It uses a simple inverter lookup.
	</description>
	<javaCode>
		<![CDATA[
		g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
											 RenderingHints.VALUE_ANTIALIAS_ON);	
	
		AffineTransform defaultTransform = g.getTransform();

		// 
		// Load Image
		//
		Image image = Toolkit.getDefaultToolkit().createImage("/work/doc/svg/src/usecases/html/images/vangogh.jpg");
		MediaTracker tracker = new MediaTracker(new Button(""));
		tracker.addImage(image, 0);
		try{
			tracker.waitForAll();
		}catch(InterruptedException e){
			tracker.removeImage(image);
			image = null;
		}finally {
			if(image != null)
				tracker.removeImage(image);
			if(tracker.isErrorAny())
				image = null;
			if(image != null){
				if(image.getWidth(null)<0 ||
					 image.getHeight(null)<0)
					image = null;
			}
		}

		if(image == null){
			throw new Error("Could not load image");
		}

		BufferedImage bi = new BufferedImage(image.getWidth(null),
																				 image.getHeight(null), BufferedImage.TYPE_INT_RGB);
		Graphics2D ig = bi.createGraphics();
		ig.drawImage(image, 0, 0, null);
		
    byte lookup[] = new byte[256];
    for(int i=0; i<256; i++)
      lookup[i] = (byte)(255 - i);
      
    LookupTable table = new ByteLookupTable(0, lookup);
    LookupOp inverter = new LookupOp(table, null);

		// Simply paint the image without and with the lookup filter
		g.setPaint(Color.black);
		g.drawString("Normal / Inverted", 10, 20);
		g.drawImage(image, 10, 30, null);
		g.drawImage(bi, inverter, 10 + bi.getWidth() + 10, 30);

    ]]>
  </javaCode>
</test>
