PrintFromButton.java Source code

Java tutorial

Introduction

Here is the source code for PrintFromButton.java

Source

/*
 *   @(#)PrintFromButton.java 1.12 02/10/21 13:46:53
 *
 * Copyright (c) 1996-2002 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * - Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 *
 * - Redistribution in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in
 *   the documentation and/or other materials provided with the
 *   distribution.
 *
 * Neither the name of Sun Microsystems, Inc. or the names of
 * contributors may be used to endorse or promote products derived
 * from this software without specific prior written permission.
 *
 * This software is provided "AS IS," without a warranty of any
 * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
 * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
 * EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES
 * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
 * DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN
 * OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
 * FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
 * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
 * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE,
 * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 *
 * You acknowledge that Software is not designed,licensed or intended
 * for use in the design, construction, operation or maintenance of
 * any nuclear facility.
 */

import com.sun.j3d.utils.geometry.ColorCube;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;

/**
 * PrintFromButton tests renderOffScreenBuffer from a button
 */
public class PrintFromButton extends Applet implements ActionListener {

    OffScreenCanvas3D c;

    private SimpleUniverse u = null;

    public BranchGroup createSceneGraph(Raster drawRaster) {
        // Create the root of the branch graph
        BranchGroup objRoot = new BranchGroup();

        // spin object has composited transformation matrix
        Transform3D spin = new Transform3D();
        Transform3D tempspin = new Transform3D();

        spin.rotX(Math.PI / 4.0d);
        tempspin.rotY(Math.PI / 5.0d);
        spin.mul(tempspin);
        spin.setScale(0.7);
        spin.setTranslation(new Vector3d(-0.4, 0.3, 0.0));

        TransformGroup objTrans = new TransformGroup(spin);
        objRoot.addChild(objTrans);

        // Create a simple shape leaf node, add it to the scene graph.
        // ColorCube is a Convenience Utility class
        objTrans.addChild(new ColorCube(0.4));

        //Create a raster obj
        Shape3D shape = new Shape3D(drawRaster);
        objRoot.addChild(shape);

        // Let Java 3D perform optimizations on this scene graph.
        objRoot.compile();

        return objRoot;
    }

    public PrintFromButton() {
    }

    public void init() {
        setLayout(new BorderLayout());
        GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();

        BufferedImage bImage = new BufferedImage(200, 200, BufferedImage.TYPE_INT_ARGB);

        ImageComponent2D buffer = new ImageComponent2D(ImageComponent.FORMAT_RGBA, bImage);
        buffer.setCapability(ImageComponent2D.ALLOW_IMAGE_READ);

        Raster drawRaster = new Raster(new Point3f(0.0f, 0.0f, 0.0f), Raster.RASTER_COLOR, 0, 0, 200, 200, buffer,
                null);

        drawRaster.setCapability(Raster.ALLOW_IMAGE_WRITE);

        // create the main scene graph
        BranchGroup scene = createSceneGraph(drawRaster);

        // create the on-screen canvas
        Canvas3D d = new Canvas3D(config, false);
        add("Center", d);

        // create a simple universe
        u = new SimpleUniverse(d);

        // This will move the ViewPlatform back a bit so the
        // objects in the scene can be viewed.
        u.getViewingPlatform().setNominalViewingTransform();

        // create an off Screen Buffer

        c = new OffScreenCanvas3D(config, true, drawRaster);

        // set the offscreen to match the onscreen
        Screen3D sOn = d.getScreen3D();
        Screen3D sOff = c.getScreen3D();
        sOff.setSize(sOn.getSize());
        sOff.setPhysicalScreenWidth(sOn.getPhysicalScreenWidth());
        sOff.setPhysicalScreenHeight(sOn.getPhysicalScreenHeight());

        // attach the same view to the offscreen canvas
        u.getViewer().getView().addCanvas3D(c);

        // create the gui
        Button b = new Button("Print");
        b.addActionListener(this);
        Panel p = new Panel();
        p.add(b);
        add("North", p);

        u.addBranchGraph(scene);
    }

    public void destroy() {
        u.cleanup();
    }

    public void actionPerformed(ActionEvent e) {
        // perform the print action
        c.print(false);
    }

    public static void main(String argv[]) {
        new MainFrame(new PrintFromButton(), 500, 500);
    }
}

class OffScreenCanvas3D extends Canvas3D {

    Raster drawRaster;

    boolean printing = false;

    public OffScreenCanvas3D(GraphicsConfiguration gconfig, boolean offscreenflag, Raster drawRaster) {

        super(gconfig, offscreenflag);
        this.drawRaster = drawRaster;
    }

    public void print(boolean toWait) {

        if (!toWait)
            printing = true;

        BufferedImage bImage = new BufferedImage(200, 200, BufferedImage.TYPE_INT_ARGB);

        ImageComponent2D buffer = new ImageComponent2D(ImageComponent.FORMAT_RGBA, bImage);
        buffer.setCapability(ImageComponent2D.ALLOW_IMAGE_READ);

        this.setOffScreenBuffer(buffer);
        this.renderOffScreenBuffer();

        if (toWait) {
            this.waitForOffScreenRendering();
            drawOffScreenBuffer();
        }
    }

    public void postSwap() {

        if (printing) {
            super.postSwap();
            drawOffScreenBuffer();
            printing = false;
        }
    }

    void drawOffScreenBuffer() {

        BufferedImage bImage = this.getOffScreenBuffer().getImage();
        ImageComponent2D newImageComponent = new ImageComponent2D(ImageComponent.FORMAT_RGBA, bImage);

        drawRaster.setImage(newImageComponent);
    }
}

class OnScreenCanvas3D extends Canvas3D {

    OffScreenCanvas3D c;

    boolean print = false;

    boolean imageReady = false;

    public OnScreenCanvas3D(GraphicsConfiguration gconfig, boolean offscreenflag) {
        super(gconfig, offscreenflag);
    }

    public void setOffScreenCanvas(OffScreenCanvas3D c) {
        this.c = c;
    }

    public void setImageReady() {
        imageReady = true;
    }

    public void postSwap() {
        if (imageReady && !print) {
            c.print(false);
            print = true;
        }
    }
}