/************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ // UNO import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.XComponentContext; import com.sun.star.uno.AnyConverter; import com.sun.star.uno.IQueryInterface; import com.sun.star.lang.XInitialization; import com.sun.star.lib.uno.helper.WeakBase; // OOo AWT import com.sun.star.awt.*; // Canvas import com.sun.star.rendering.*; // Java AWT import java.awt.*; import java.awt.image.*; import java.awt.geom.*; public class CanvasTest extends CanvasBase implements com.sun.star.awt.XWindow, com.sun.star.rendering.XSpriteCanvas, com.sun.star.lang.XServiceInfo, com.sun.star.lang.XInitialization { private WindowAdapter dummyFrame; private BackBuffer backBuffer; private java.awt.image.BufferStrategy bufferStrategy; private java.awt.Font fpsFont; private long lastTime; // TEST ONLY { private static int testWidth = 1600; private static int testHeight = 1200; private BufferedImage backgroundBuffer; private BufferedImage buffer; private BufferedImage buffer2; private Graphics2D backBufGraphics; private Graphics2D bufferGraphics; private Graphics2D buffer2Graphics; private float currAlpha; // TEST ONLY } public Graphics2D getGraphics() { return backBuffer.getGraphics(); } //---------------------------------------------------------------------------------- // // XInitialization // =============== // public void initialize( java.lang.Object[] arguments ) { CanvasUtils.printLog( "CanvasTest.initialize called!" ); // Do that as the very first thing. The Java2D internal // classes choose their render path at initialization time, // thus this must happen before doing _any_ GUI. // TODO: Put those flags into javarc/java.ini, we're maybe // coming late into a running JVM! // now, we're getting slightly system dependent here. String os = (String) System.getProperty("os.name"); CanvasUtils.printLog( "System detected: " + os ); // tweak some speed knobs... if( os.startsWith("Windows") ) { System.setProperty("sun.java2d.translaccel", "true"); System.setProperty("sun.java2d.ddforcevram", "true"); //System.setProperty("sun.java2d.accthreshold", "0"); CanvasUtils.printLog( "Optimizing for Windows" ); } else { System.setProperty("sun.java2d.opengl", "true"); CanvasUtils.printLog( "Optimizing for Unix" ); } /* we're initialized with the following array of anys: arguments[0] = pointer to VCL window arguments[1] = Integer (operating system window handle) arguments[2] = com.sun.star.awt.Rectangle (position and size within that OS window) arguments[3] = boolean (fullsize window or not) We then generate a dummy Java frame with that window as the parent, to fake a root window for the Java implementation. */ try { com.sun.star.awt.Rectangle boundRect = (com.sun.star.awt.Rectangle) arguments[2]; //boolean isFullScreen = arguments[1]; boolean isFullScreen = true; //AnyConverter.toBoolean( arguments[3] ) ); // fake a root for Java in VCL window. Pass the flag // whether we shall run fullscreen, too. dummyFrame = new WindowAdapter( AnyConverter.toInt( arguments[1] ), isFullScreen ); if( isFullScreen ) { // blow window up to fullscreen. Otherwise, we cannot clear the whole screen, // which results in ugly flickering Dimension screenSize = dummyFrame.frame.getToolkit().getScreenSize(); boundRect.X = 0; boundRect.Y = 0; boundRect.Width = screenSize.width-1; boundRect.Height = screenSize.height-1; } dummyFrame.setPosSize( boundRect.X, boundRect.Y, boundRect.Width, boundRect.Height, (short)0 ); CanvasUtils.printLog( "Window size: " + boundRect.Width + ", " + boundRect.Height ); // TEST if( true ) { backBuffer = new BackBuffer( (Graphics2D) dummyFrame.frame.getGraphics(), Math.max(1,boundRect.Width), Math.max(1,boundRect.Height) ); } else { backBuffer = new BackBuffer( (Graphics2D) dummyFrame.frame.getGraphics(), 10, 10 ); } // TODO: Maybe delay double buffer init until first sprite creation dummyFrame.frame.createBufferStrategy(2); bufferStrategy = dummyFrame.frame.getBufferStrategy(); if( bufferStrategy.getCapabilities().isPageFlipping() ) CanvasUtils.printLog( "CanvasTest.initialize double buffering is using page flipping!" ); else CanvasUtils.printLog( "CanvasTest.initialize double buffering is using blitting!" ); lastTime = System.currentTimeMillis(); fpsFont = new java.awt.Font( "Times", Font.PLAIN, 20 ); if( false ) { // TEST ONLY { Graphics2D frameGraphics= (Graphics2D) dummyFrame.frame.getGraphics(); backgroundBuffer = frameGraphics.getDeviceConfiguration().createCompatibleImage(testWidth,testHeight); // TODO: size dynamic buffer = frameGraphics.getDeviceConfiguration().createCompatibleImage(testWidth,testHeight, Transparency.TRANSLUCENT); buffer2 = frameGraphics.getDeviceConfiguration().createCompatibleImage(testWidth,testHeight, Transparency.TRANSLUCENT); bufferGraphics = (Graphics2D)buffer.getGraphics(); buffer2Graphics = (Graphics2D)buffer2.getGraphics(); backBufGraphics = (Graphics2D)backgroundBuffer.getGraphics(); currAlpha = 0.1f; // init content Font font = new Font( "Times", Font.PLAIN, 100 ); bufferGraphics.setComposite( AlphaComposite.getInstance(AlphaComposite.CLEAR)); bufferGraphics.fillRect( 0,0,testWidth,testHeight ); bufferGraphics.setComposite( AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); bufferGraphics.setColor( Color.red ); bufferGraphics.fillRect( 0,0,testWidth/2,testHeight/2 ); bufferGraphics.setColor( Color.green ); bufferGraphics.fillRect( testWidth/2,0,testWidth,testHeight/2 ); bufferGraphics.setColor( Color.blue ); bufferGraphics.fillRect( 0,testHeight/2,testWidth/2,testHeight ); buffer2Graphics.setColor( Color.red ); buffer2Graphics.fillRect( 0,0,testWidth/2,testHeight/2 ); buffer2Graphics.setColor( Color.green ); buffer2Graphics.fillRect( testWidth/2,0,testWidth,testHeight/2 ); buffer2Graphics.setColor( Color.blue ); buffer2Graphics.fillRect( 0,testHeight/2,testWidth/2,testHeight ); backBufGraphics.setColor( Color.white ); backBufGraphics.fillRect(0,0,testWidth,testHeight); backBufGraphics.setColor( Color.red ); backBufGraphics.setFont( font ); int i, turns=15; for(i=0; i 1.0 ) currAlpha = 0.1f; // TEST ONLY } } if( true ) { // repaint background backBuffer.redraw( graph ); // repaint all active sprites java.util.Set entries = activeSprites.entrySet(); java.util.Iterator iter = entries.iterator(); while( iter.hasNext() ) { java.util.Map.Entry entry = (java.util.Map.Entry)iter.next(); if( entry.getValue() != null ) ((SpriteRep)entry.getValue()).redraw(graph); } } long currTime = System.currentTimeMillis(); graph.setComposite( AlphaComposite.getInstance(AlphaComposite.SRC_OVER) ); graph.setFont( fpsFont ); graph.setColor( java.awt.Color.black ); try { String fps = new String( String.valueOf(1000.0/(currTime-lastTime)) ); graph.drawString( fps.substring(0,5) + " fps", 0, 20); CanvasUtils.printLog( fps.substring(0,5) + " fps" ); } catch( Exception e ) { graph.drawString( "0 fps", 0, 20); } lastTime = currTime; } finally { if( graph != null ) graph.dispose(); } bufferStrategy.show(); } //---------------------------------------------------------------------------------- private static final String s_implName = "XCanvas.java.impl"; private static final String s_serviceName = "com.sun.star.rendering.Canvas"; //---------------------------------------------------------------------------------- // // XServiceInfo impl // ================= // public synchronized String getImplementationName() { return s_implName; } public synchronized String [] getSupportedServiceNames() { return new String [] { s_serviceName }; } public synchronized boolean supportsService( String serviceName ) { return serviceName.equals( s_serviceName ); } public static com.sun.star.lang.XSingleServiceFactory __getServiceFactory( String implName, com.sun.star.lang.XMultiServiceFactory multiFactory, com.sun.star.registry.XRegistryKey regKey ) { if (implName.equals( s_implName )) { return com.sun.star.comp.loader.FactoryHelper.getServiceFactory( CanvasTest.class, s_serviceName, multiFactory, regKey ); } return null; } public static boolean __writeRegistryServiceInfo( com.sun.star.registry.XRegistryKey regKey ) { return com.sun.star.comp.loader.FactoryHelper.writeRegistryServiceInfo( s_implName, s_serviceName, regKey ); } }