Files
libreoffice/canvas/source/java/BufferedGraphics2D.java
Rüdiger Timm d4b2b74863 INTEGRATION: CWS changefileheader (1.3.142); FILE MERGED
2008/03/28 16:35:04 rt 1.3.142.1: #i87441# Change license header to LPGL v3.
2008-04-11 08:20:22 +00:00

604 lines
16 KiB
Java

/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: BufferedGraphics2D.java,v $
* $Revision: 1.4 $
*
* 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
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
// Java AWT
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.awt.image.renderable.*;
import java.awt.font.*;
import java.text.*;
import java.util.*;
public class BufferedGraphics2D
extends java.awt.Graphics2D
{
// TODO: Somehow, get rid of this duplicate graphics (the graphics member,
// and this object itself, extending a Graphics2D)
private Graphics2D graphics;
private BufferedImage backBuffer;
private Graphics2D backBufferGraphics;
//----------------------------------------------------------------------------------
public BufferedGraphics2D( java.awt.Graphics2D _graphics, int width, int height )
{
setGraphics( _graphics, Math.max(1,width), Math.max(1,height) );
}
public void redraw( Graphics2D graph )
{
if( graph != null &&
backBuffer != null )
{
CanvasUtils.printLog("BufferedGraphics2D.redraw: using buffer of size (" +
backBuffer.getWidth() + "," + backBuffer.getHeight() + ")" );
// set transform to identity
graph.setTransform( new AffineTransform() );
graph.drawImage(backBuffer, 0, 0, null);
CanvasUtils.postRenderImageTreatment( backBuffer );
}
}
public BufferedImage getBackBuffer()
{
return backBuffer;
}
public void setSize( int width, int height )
{
if( backBuffer != null &&
width == backBuffer.getWidth() &&
height == backBuffer.getHeight() )
{
return;
}
if( backBufferGraphics != null )
backBufferGraphics.dispose();
if( backBuffer != null )
backBuffer.flush();
// TODO: Maybe VolatileImage with another BufferedImage as a backup is
// a tad faster here.
backBuffer = graphics.getDeviceConfiguration().createCompatibleImage(width,
height);
backBufferGraphics = backBuffer.createGraphics();
CanvasUtils.initGraphics( backBufferGraphics );
// clear the buffer to white (to have a defined state here)
backBufferGraphics.setColor( java.awt.Color.white );
backBufferGraphics.fillRect( 0,0,width,height );
}
public void setGraphics( Graphics2D _graphics, int width, int height )
{
if( graphics != null )
graphics.dispose();
graphics = _graphics;
setSize(width,height);
}
//----------------------------------------------------------------------------------
//
// Graphics
// ========
//
public void clearRect(int x, int y, int width, int height)
{
graphics.clearRect(x,y,width,height);
backBufferGraphics.clearRect(x,y,width,height);
}
public void clipRect(int x, int y, int width, int height)
{
graphics.clipRect(x,y,width,height);
backBufferGraphics.clipRect(x,y,width,height);
}
public void copyArea(int x, int y, int width, int height, int dx, int dy)
{
graphics.copyArea(x,y,width,height,dx,dy);
backBufferGraphics.copyArea(x,y,width,height,dx,dy);
}
public Graphics create()
{
return null;
}
public Graphics create(int x, int y, int width, int height)
{
return null;
}
public void dispose()
{
graphics.dispose();
backBufferGraphics.dispose();
backBuffer.flush();
}
public void draw3DRect(int x, int y, int width, int height, boolean raised)
{
graphics.draw3DRect(x,y,width,height,raised);
backBufferGraphics.draw3DRect(x,y,width,height,raised);
}
public void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)
{
graphics.drawArc(x,y,width,height,startAngle,arcAngle);
backBufferGraphics.drawArc(x,y,width,height,startAngle,arcAngle);
}
public void drawBytes(byte[] data, int offset, int length, int x, int y)
{
graphics.drawBytes(data,offset,length,x,y);
backBufferGraphics.drawBytes(data,offset,length,x,y);
}
public void drawChars(char[] data, int offset, int length, int x, int y)
{
graphics.drawChars(data,offset,length,x,y);
backBufferGraphics.drawChars(data,offset,length,x,y);
}
public boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer)
{
backBufferGraphics.drawImage(img,x,y,bgcolor,observer);
return graphics.drawImage(img,x,y,bgcolor,observer);
}
public boolean drawImage(Image img, int x, int y, ImageObserver observer)
{
backBufferGraphics.drawImage(img,x,y,observer);
return graphics.drawImage(img,x,y,observer);
}
public boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer)
{
backBufferGraphics.drawImage(img,x,y,width,height,bgcolor,observer);
return graphics.drawImage(img,x,y,width,height,bgcolor,observer);
}
public boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)
{
backBufferGraphics.drawImage(img,x,y,width,height,observer);
return graphics.drawImage(img,x,y,width,height,observer);
}
public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor, ImageObserver observer)
{
backBufferGraphics.drawImage(img,dx1,dy1,dx2,dy2,sx1,sy1,sx2,sy2,bgcolor,observer);
return graphics.drawImage(img,dx1,dy1,dx2,dy2,sx1,sy1,sx2,sy2,bgcolor,observer);
}
public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer)
{
backBufferGraphics.drawImage(img,dx1,dy1,dx2,dy2,sx1,sy1,sx2,sy2,observer);
return graphics.drawImage(img,dx1,dy1,dx2,dy2,sx1,sy1,sx2,sy2,observer);
}
public void drawLine(int x1, int y1, int x2, int y2)
{
graphics.drawLine(x1,y1,x2,y2);
backBufferGraphics.drawLine(x1,y1,x2,y2);
}
public void drawOval(int x, int y, int width, int height)
{
graphics.drawOval(x,y,width,height);
backBufferGraphics.drawOval(x,y,width,height);
}
public void drawPolygon(int[] xPoints, int[] yPoints, int nPoints)
{
graphics.drawPolygon(xPoints,yPoints,nPoints);
backBufferGraphics.drawPolygon(xPoints,yPoints,nPoints);
}
public void drawPolygon(Polygon p)
{
graphics.drawPolygon(p);
backBufferGraphics.drawPolygon(p);
}
public void drawPolyline(int[] xPoints, int[] yPoints, int nPoints)
{
graphics.drawPolyline(xPoints,yPoints,nPoints);
backBufferGraphics.drawPolyline(xPoints,yPoints,nPoints);
}
public void drawRect(int x, int y, int width, int height)
{
graphics.drawRect(x,y,width,height);
backBufferGraphics.drawRect(x,y,width,height);
}
public void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)
{
graphics.drawRoundRect(x,y,width,height,arcWidth,arcHeight);
backBufferGraphics.drawRoundRect(x,y,width,height,arcWidth,arcHeight);
}
public void drawString(AttributedCharacterIterator iterator, int x, int y)
{
graphics.drawString(iterator,x,y);
backBufferGraphics.drawString(iterator,x,y);
}
public void drawString(String str, int x, int y)
{
graphics.drawString(str,x,y);
backBufferGraphics.drawString(str,x,y);
}
public void fill3DRect(int x, int y, int width, int height, boolean raised)
{
graphics.fill3DRect(x,y,width,height,raised);
backBufferGraphics.fill3DRect(x,y,width,height,raised);
}
public void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle)
{
graphics.fillArc(x,y,width,height,startAngle,arcAngle);
backBufferGraphics.fillArc(x,y,width,height,startAngle,arcAngle);
}
public void fillOval(int x, int y, int width, int height)
{
graphics.fillOval(x,y,width,height);
backBufferGraphics.fillOval(x,y,width,height);
}
public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints)
{
graphics.fillPolygon(xPoints,yPoints,nPoints);
backBufferGraphics.fillPolygon(xPoints,yPoints,nPoints);
}
public void fillPolygon(Polygon p)
{
graphics.fillPolygon(p);
backBufferGraphics.fillPolygon(p);
}
public void fillRect(int x, int y, int width, int height)
{
graphics.fillRect(x,y,width,height);
backBufferGraphics.fillRect(x,y,width,height);
}
public void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)
{
graphics.fillRoundRect(x,y,width,height,arcWidth,arcHeight);
backBufferGraphics.fillRoundRect(x,y,width,height,arcWidth,arcHeight);
}
public Shape getClip()
{
return graphics.getClip();
}
public Rectangle getClipBounds()
{
return graphics.getClipBounds();
}
public Rectangle getClipBounds(Rectangle r)
{
return graphics.getClipBounds(r);
}
public Rectangle getClipRect()
{
return graphics.getClipRect();
}
public Color getColor()
{
return getColor();
}
public Font getFont()
{
return getFont();
}
public FontMetrics getFontMetrics()
{
return getFontMetrics();
}
public FontMetrics getFontMetrics(Font f)
{
return getFontMetrics(f);
}
public boolean hitClip(int x, int y, int width, int height)
{
return graphics.hitClip(x,y,width,height);
}
public void setClip(int x, int y, int width, int height)
{
graphics.setClip(x,y,width,height);
backBufferGraphics.setClip(x,y,width,height);
}
public void setClip(Shape clip)
{
graphics.setClip(clip);
backBufferGraphics.setClip(clip);
}
public void setColor(Color c)
{
graphics.setColor(c);
backBufferGraphics.setColor(c);
}
public void setFont(Font font)
{
graphics.setFont(font);
backBufferGraphics.setFont(font);
}
public void setPaintMode()
{
graphics.setPaintMode();
backBufferGraphics.setPaintMode();
}
public void setXORMode(Color c1)
{
graphics.setXORMode(c1);
backBufferGraphics.setXORMode(c1);
}
public String toString()
{
return graphics.toString();
}
public void translate(int x, int y)
{
graphics.translate(x,y);
backBufferGraphics.translate(x,y);
}
//----------------------------------------------------------------------------------
//
// Graphics2D
// ==========
//
public void addRenderingHints(Map hints)
{
graphics.addRenderingHints(hints);
backBufferGraphics.addRenderingHints(hints);
}
public void clip(Shape s)
{
graphics.clip(s);
backBufferGraphics.clip(s);
}
public void draw(Shape s)
{
graphics.draw(s);
backBufferGraphics.draw(s);
}
public void drawGlyphVector(GlyphVector g, float x, float y)
{
graphics.drawGlyphVector(g,x,y);
backBufferGraphics.drawGlyphVector(g,x,y);
}
public void drawImage(BufferedImage img, BufferedImageOp op, int x, int y)
{
graphics.drawImage(img,op,x,y);
backBufferGraphics.drawImage(img,op,x,y);
}
public boolean drawImage(Image img, AffineTransform xform, ImageObserver obs)
{
backBufferGraphics.drawImage(img,xform,obs);
return graphics.drawImage(img,xform,obs);
}
public void drawRenderableImage(RenderableImage img, AffineTransform xform)
{
graphics.drawRenderableImage(img,xform);
backBufferGraphics.drawRenderableImage(img,xform);
}
public void drawRenderedImage(RenderedImage img, AffineTransform xform)
{
graphics.drawRenderedImage(img,xform);
backBufferGraphics.drawRenderedImage(img,xform);
}
public void drawString(AttributedCharacterIterator iterator, float x, float y)
{
graphics.drawString(iterator,x,y);
backBufferGraphics.drawString(iterator,x,y);
}
public void drawString(String s, float x, float y)
{
graphics.drawString(s,x,y);
backBufferGraphics.drawString(s,x,y);
}
public void fill(Shape s)
{
graphics.fill(s);
backBufferGraphics.fill(s);
}
public Color getBackground()
{
return graphics.getBackground();
}
public Composite getComposite()
{
return graphics.getComposite();
}
public GraphicsConfiguration getDeviceConfiguration()
{
return graphics.getDeviceConfiguration();
}
public FontRenderContext getFontRenderContext()
{
return graphics.getFontRenderContext();
}
public Paint getPaint()
{
return graphics.getPaint();
}
public Object getRenderingHint(RenderingHints.Key hintKey)
{
return graphics.getRenderingHint(hintKey);
}
public RenderingHints getRenderingHints()
{
return graphics.getRenderingHints();
}
public Stroke getStroke()
{
return graphics.getStroke();
}
public AffineTransform getTransform()
{
return graphics.getTransform();
}
public boolean hit(Rectangle rect, Shape s, boolean onStroke)
{
return graphics.hit(rect,s,onStroke);
}
public void rotate(double theta)
{
graphics.rotate(theta);
backBufferGraphics.rotate(theta);
}
public void rotate(double theta, double x, double y)
{
graphics.rotate(theta,x,y);
backBufferGraphics.rotate(theta,x,y);
}
public void scale(double sx, double sy)
{
graphics.scale(sx,sy);
backBufferGraphics.scale(sx,sy);
}
public void setBackground(Color color)
{
graphics.setBackground(color);
backBufferGraphics.setBackground(color);
}
public void setComposite(Composite comp)
{
graphics.setComposite(comp);
backBufferGraphics.setComposite(comp);
}
public void setPaint(Paint paint)
{
graphics.setPaint(paint);
backBufferGraphics.setPaint(paint);
}
public void setRenderingHint(RenderingHints.Key hintKey, Object hintValue)
{
graphics.setRenderingHint(hintKey,hintValue);
backBufferGraphics.setRenderingHint(hintKey,hintValue);
}
public void setRenderingHints(Map hints)
{
graphics.setRenderingHints(hints);
backBufferGraphics.setRenderingHints(hints);
}
public void setStroke(Stroke s)
{
graphics.setStroke(s);
backBufferGraphics.setStroke(s);
}
public void setTransform(AffineTransform Tx)
{
graphics.setTransform(Tx);
backBufferGraphics.setTransform(Tx);
}
public void shear(double shx, double shy)
{
graphics.shear(shx,shy);
backBufferGraphics.shear(shx,shy);
}
public void transform(AffineTransform Tx)
{
graphics.transform(Tx);
backBufferGraphics.transform(Tx);
}
public void translate(double tx, double ty)
{
graphics.translate(tx,ty);
backBufferGraphics.translate(tx,ty);
}
}