/************************************************************************* * * $RCSfile: CanvasBase.java,v $ * * The Contents of this file are made available subject to the terms of * either of the following licenses * * - GNU Lesser General Public License Version 2.1 * - Sun Industry Standards Source License Version 1.1 * * Sun Microsystems Inc., October, 2000 * * GNU Lesser General Public License Version 2.1 * ============================================= * Copyright 2000 by Sun Microsystems, Inc. * 901 San Antonio Road, Palo Alto, CA 94303, USA * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library 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 for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * * Sun Industry Standards Source License Version 1.1 * ================================================= * The contents of this file are subject to the Sun Industry Standards * Source License Version 1.1 (the "License"); You may not use this file * except in compliance with the License. You may obtain a copy of the * License at http://www.openoffice.org/license.html. * * Software provided under this License is provided on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. * See the License for the specific provisions governing your rights and * obligations concerning the Software. * * The Initial Developer of the Original Code is: Sun Microsystems, Inc. * * Copyright: 2000 by Sun Microsystems, Inc. * * All Rights Reserved. * * Contributor(s): _______________________________________ * * ************************************************************************/ // 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 drafts.com.sun.star.rendering.*; import drafts.com.sun.star.geometry.*; // Java AWT import java.awt.*; import java.awt.geom.*; // system-dependent stuff import sun.awt.*; public abstract class CanvasBase extends com.sun.star.lib.uno.helper.ComponentBase implements drafts.com.sun.star.rendering.XCanvas { // to be overridden public abstract Graphics2D getGraphics(); //---------------------------------------------------------------------------------- // // XCanvas interface // ================= // public synchronized void drawPoint( RealPoint2D aPoint, ViewState viewState, RenderState renderState ) throws com.sun.star.lang.IllegalArgumentException { // cache Graphics2D graphics = getGraphics(); // initialize the Graphics2D CanvasUtils.setupGraphicsState( graphics, viewState, renderState, CanvasUtils.alsoSetupPaint ); // calculate the domain value for a single device pixel. we're // using delta mapping here, to avoid later subtraction of two // mapped values (as we really only need a transformed size, // not a transformed point). AffineTransform transform = graphics.getTransform(); AffineTransform inverse; try { inverse = transform.createInverse(); } catch( NoninvertibleTransformException e ) { // transformation not invertible. Nothing to render then. return; } java.awt.geom.Point2D.Double pointSize = new java.awt.geom.Point2D.Double(1.0,1.0); java.awt.geom.Point2D.Double domainPointSize = new java.awt.geom.Point2D.Double(); inverse.deltaTransform( pointSize, domainPointSize ); // render a circle one device pixel wide Ellipse2D.Double ellipse = new Ellipse2D.Double(aPoint.X, aPoint.Y, domainPointSize.x, domainPointSize.y); // render, at last graphics.fill( ellipse ); CanvasUtils.printLog( "XCanvas: drawPoint called" ); } public synchronized void drawLine( RealPoint2D aStartPoint, RealPoint2D aEndPoint, ViewState viewState, RenderState renderState ) throws com.sun.star.lang.IllegalArgumentException { // cache Graphics2D graphics = getGraphics(); // initialize the Graphics2D CanvasUtils.setupGraphicsState( graphics, viewState, renderState, CanvasUtils.alsoSetupPaint ); graphics.setStroke( new BasicStroke() ); // setup line object Line2D.Double line = new Line2D.Double(aStartPoint.X, aStartPoint.Y, aEndPoint.X, aEndPoint.Y); // render, at last graphics.draw( line ); CanvasUtils.printLog( "XCanvas: drawLine called" ); } public synchronized void drawBezier( RealBezierSegment2D aBezierSegment, RealPoint2D aEndPoint, ViewState viewState, RenderState renderState ) throws com.sun.star.lang.IllegalArgumentException { // cache Graphics2D graphics = getGraphics(); // initialize the Graphics2D CanvasUtils.setupGraphicsState( graphics, viewState, renderState, CanvasUtils.alsoSetupPaint ); graphics.setStroke( new BasicStroke() ); // setup bezier object CubicCurve2D.Double curve = new CubicCurve2D.Double(aBezierSegment.Px, aBezierSegment.Py, aBezierSegment.C1x, aBezierSegment.C1y, aBezierSegment.C2x, aBezierSegment.C2y, aEndPoint.X, aEndPoint.Y); // render, at last graphics.draw( curve ); CanvasUtils.printLog( "XCanvas: drawbezier called" ); } public synchronized XCachedPrimitive drawPolyPolygon( XPolyPolygon2D xPolyPolygon, ViewState viewState, RenderState renderState ) throws com.sun.star.lang.IllegalArgumentException { CanvasUtils.printLog( "CanvasBase.drawPolyPolygon() called" ); // cache Graphics2D graphics = getGraphics(); // initialize the Graphics2D CanvasUtils.setupGraphicsState( graphics, viewState, renderState, CanvasUtils.alsoSetupPaint ); graphics.setStroke( new BasicStroke() ); // render the polygon // TODO: maybe use Graphics.drawPolyline here! graphics.draw( CanvasUtils.makeGeneralPath(xPolyPolygon) ); CanvasUtils.printLog( "XCanvas: drawPolyPolygon called" ); return null; } public synchronized XCachedPrimitive strokePolyPolygon( XPolyPolygon2D xPolyPolygon, ViewState viewState, RenderState renderState, StrokeAttributes strokeAttributes ) throws com.sun.star.lang.IllegalArgumentException { // cache Graphics2D graphics = getGraphics(); // initialize the Graphics2D CanvasUtils.setupGraphicsState( graphics, viewState, renderState, CanvasUtils.alsoSetupPaint ); CanvasUtils.applyStrokeAttributes( graphics, strokeAttributes ); // stroke the polygon graphics.draw( CanvasUtils.makeGeneralPath(xPolyPolygon) ); CanvasUtils.printLog( "XCanvas: strokePolyPolygon called" ); return null; } public synchronized XCachedPrimitive strokeTexturedPolyPolygon( XPolyPolygon2D xPolyPolygon, ViewState viewState, RenderState renderState, Texture[] textures, StrokeAttributes strokeAttributes ) throws com.sun.star.lang.IllegalArgumentException, VolatileContentDestroyedException { return null; } public synchronized XCachedPrimitive strokeTextureMappedPolyPolygon( XPolyPolygon2D xPolyPolygon, ViewState viewState, RenderState renderState, Texture[] textures, drafts.com.sun.star.geometry.XMapping2D xMapping, StrokeAttributes strokeAttributes ) throws com.sun.star.lang.IllegalArgumentException, VolatileContentDestroyedException { return null; } public synchronized XPolyPolygon2D queryStrokeShapes( drafts.com.sun.star.rendering.XPolyPolygon2D xPolyPolygon, drafts.com.sun.star.rendering.ViewState viewState, drafts.com.sun.star.rendering.RenderState renderState, drafts.com.sun.star.rendering.StrokeAttributes strokeAttributes ) throws com.sun.star.lang.IllegalArgumentException { return null; } public synchronized XCachedPrimitive fillPolyPolygon( drafts.com.sun.star.rendering.XPolyPolygon2D xPolyPolygon, drafts.com.sun.star.rendering.ViewState viewState, drafts.com.sun.star.rendering.RenderState renderState ) throws com.sun.star.lang.IllegalArgumentException { CanvasUtils.printLog( "CanvasBase.fillPolyPolygon() called" ); // cache Graphics2D graphics = getGraphics(); // initialize the Graphics2D CanvasUtils.setupGraphicsState( graphics, viewState, renderState, CanvasUtils.alsoSetupPaint ); // fill the polygon graphics.fill( CanvasUtils.makeGeneralPath(xPolyPolygon) ); CanvasUtils.printLog( "XCanvas: fillPolyPolygon called" ); return null; } public synchronized XCachedPrimitive fillTexturedPolyPolygon( drafts.com.sun.star.rendering.XPolyPolygon2D xPolyPolygon, drafts.com.sun.star.rendering.ViewState viewState, drafts.com.sun.star.rendering.RenderState renderState, drafts.com.sun.star.rendering.Texture [] textures ) throws com.sun.star.lang.IllegalArgumentException { return null; } public synchronized XCachedPrimitive fillTextureMappedPolyPolygon( XPolyPolygon2D xPolyPolygon, ViewState viewState, RenderState renderState, Texture[] textures, drafts.com.sun.star.geometry.XMapping2D xMapping ) throws com.sun.star.lang.IllegalArgumentException, VolatileContentDestroyedException { return null; } public synchronized XCanvasFont createFont( FontRequest fontRequest, com.sun.star.beans.PropertyValue[] extraFontProperties, drafts.com.sun.star.geometry.Matrix2D fontMatrix ) throws com.sun.star.lang.IllegalArgumentException { // TODO: support extra arguments return new CanvasFont( fontRequest, this ); } public FontInfo[] queryAvailableFonts( FontInfo aFilter, com.sun.star.beans.PropertyValue[] aFontProperties ) throws com.sun.star.lang.IllegalArgumentException { // TODO return null; } public XCachedPrimitive drawText( StringContext text, XCanvasFont xFont, ViewState viewState, RenderState renderState, byte textDirection ) throws com.sun.star.lang.IllegalArgumentException { CanvasUtils.printLog( "CanvasBase.drawText() called" ); // cache Graphics2D graphics = getGraphics(); CanvasUtils.printLog( "XCanvas: drawText called" ); CanvasUtils.setupGraphicsState( graphics, viewState, renderState, CanvasUtils.alsoSetupPaint ); CanvasUtils.setupGraphicsFont( graphics, viewState, renderState, xFont ); CanvasUtils.printLog( "XCanvas: drawText rendering \""+ text.Text.substring(text.StartPosition, text.StartPosition+text.Length) + "\"" ); graphics.drawString( text.Text.substring(text.StartPosition, text.StartPosition+text.Length), (float)0.0, (float)0.0 ); return null; } public XCachedPrimitive drawTextLayout( XTextLayout layoutetText, ViewState viewState, RenderState renderState ) throws com.sun.star.lang.IllegalArgumentException { CanvasUtils.printLog( "CanvasBase.drawOffsettedText() called" ); // cache Graphics2D graphics = getGraphics(); CanvasUtils.printLog( "XCanvas: drawOffsettedText called" ); CanvasUtils.setupGraphicsState( graphics, viewState, renderState, CanvasUtils.alsoSetupPaint ); CanvasUtils.setupGraphicsFont( graphics, viewState, renderState, layoutetText.getFont() ); CanvasUtils.printLog( "XCanvas: drawOffsettedText canvas setup done" ); if( layoutetText instanceof TextLayout ) { ((TextLayout)layoutetText).draw( graphics ); } else { CanvasUtils.printLog( "drawTextLayout: mismatching TextLayout object." ); throw new com.sun.star.lang.IllegalArgumentException(); } return null; } public synchronized XCachedPrimitive drawBitmap( drafts.com.sun.star.rendering.XBitmap xBitmap, drafts.com.sun.star.rendering.ViewState viewState, drafts.com.sun.star.rendering.RenderState renderState ) throws com.sun.star.lang.IllegalArgumentException { CanvasUtils.printLog( "CanvasBase.drawBitmap() called" ); // cache Graphics2D graphics = getGraphics(); CanvasUtils.setupGraphicsState( graphics, viewState, renderState, CanvasUtils.alsoSetupPaint ); java.awt.image.BufferedImage bitmap = CanvasUtils.getBufferedImage( xBitmap ); if( !graphics.drawImage(bitmap, 0, 0, null) ) CanvasUtils.printLog( "CanvasBase.drawBitmap: image paint incomplete" ); CanvasUtils.postRenderImageTreatment( bitmap ); return null; } public synchronized XCachedPrimitive drawBitmapModulated( drafts.com.sun.star.rendering.XBitmap xBitmap, drafts.com.sun.star.rendering.ViewState viewState, drafts.com.sun.star.rendering.RenderState renderState ) throws com.sun.star.lang.IllegalArgumentException { CanvasUtils.printLog( "CanvasBase.drawBitmapModulated() called" ); // TODO(F3): Implement channel modulation return drawBitmap(xBitmap, viewState, renderState); } public synchronized XGraphicDevice getDevice() { CanvasUtils.printLog( "CanvasBase.getDevice() called" ); return new CanvasGraphicDevice( getGraphics() ); } }