summaryrefslogtreecommitdiff
path: root/canvas/source/java/CanvasBase.java
diff options
context:
space:
mode:
authorThorsten Behrens <thb@openoffice.org>2004-03-18 09:38:44 +0000
committerThorsten Behrens <thb@openoffice.org>2004-03-18 09:38:44 +0000
commit6e89341b5045a01e823364633ef0fbfd44ebdfd5 (patch)
treee8bfc629f55ce0e0d31befb0b5c02233ef935705 /canvas/source/java/CanvasBase.java
parentaac18e0575873e71532ce77e4c2e4083e4c71b9a (diff)
#110496# Merge from cws_srx645_canvas01: first working version of XCanvas UNO components, for now consisting of javacanvas.uno.jar, vclcanvas.uno and directxcanvas.uno (windows only)
Diffstat (limited to 'canvas/source/java/CanvasBase.java')
-rw-r--r--canvas/source/java/CanvasBase.java379
1 files changed, 379 insertions, 0 deletions
diff --git a/canvas/source/java/CanvasBase.java b/canvas/source/java/CanvasBase.java
new file mode 100644
index 000000000000..b57430d5b329
--- /dev/null
+++ b/canvas/source/java/CanvasBase.java
@@ -0,0 +1,379 @@
+/*************************************************************************
+ *
+ * $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 queryFont( drafts.com.sun.star.rendering.FontRequest fontRequest ) throws com.sun.star.lang.IllegalArgumentException
+ {
+ return new CanvasFont( fontRequest, this );
+ }
+
+ public synchronized XCachedPrimitive drawText( drafts.com.sun.star.rendering.StringContext text,
+ drafts.com.sun.star.rendering.XCanvasFont xFont,
+ drafts.com.sun.star.rendering.ViewState viewState,
+ drafts.com.sun.star.rendering.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 synchronized XCachedPrimitive drawOffsettedText( drafts.com.sun.star.rendering.StringContext text,
+ drafts.com.sun.star.rendering.XCanvasFont xFont,
+ double [] offsets,
+ drafts.com.sun.star.rendering.ViewState viewState,
+ drafts.com.sun.star.rendering.RenderState renderState,
+ byte textDirection ) throws com.sun.star.lang.IllegalArgumentException
+ {
+ CanvasUtils.printLog( "CanvasBase.drawOffsettedText() called" );
+
+ CanvasUtils.preCondition( text.Length == text.Text.length() &&
+ text.Length == offsets.length, "CanvasBase.drawOffsettedText" );
+
+ if( text.Length > 0 )
+ {
+ // cache
+ Graphics2D graphics = getGraphics();
+
+ CanvasUtils.printLog( "XCanvas: drawOffsettedText called" );
+
+ CanvasUtils.setupGraphicsState( graphics, viewState, renderState, CanvasUtils.alsoSetupPaint );
+ CanvasUtils.setupGraphicsFont( graphics, viewState, renderState, xFont );
+
+ CanvasUtils.printLog( "XCanvas: drawOffsettedText canvas setup done" );
+
+ // TODO: use proper advancement. Text direction need not be horizontal!
+ // TODO: given text string need not have a one-to-one relationship between code point and glyph (offset)!
+ graphics.drawString( text.Text.substring(text.StartPosition, text.StartPosition + 1), (float)0.0, (float)0.0 );
+ for( int i=1; i<offsets.length && i<text.Length; ++i )
+ {
+ CanvasUtils.printLog( "XCanvas: drawOffsettedText rendering a \"" +
+ text.Text.substring(text.StartPosition + i,
+ text.StartPosition + i + 1) +
+ "\" (position " + (text.StartPosition + i) +
+ " of " + text.Text + ", offset " + offsets[i] + ")" );
+
+ graphics.drawString( text.Text.substring(text.StartPosition + i, text.StartPosition + i + 1), (float)offsets[i-1], (float)0.0 );
+ }
+ }
+
+ 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 XGraphicDevice getDevice()
+ {
+ CanvasUtils.printLog( "CanvasBase.getDevice() called" );
+ return new CanvasGraphicDevice( getGraphics() );
+ }
+}