/*
* This program 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.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program 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.
*
* Copyright (c) 2001 - 2013 Object Refinery Ltd, Pentaho Corporation and Contributors.. All rights reserved.
*/
package org.pentaho.reporting.libraries.pixie.wmf;
import java.awt.*;
/**
* Track the state of the DeviceContext of a Windows metafile.
*/
public class MfDcState implements Cloneable {
public static class MfScale {
private int yNum;
private int xNum;
private int yDenom;
private int xDenom;
public MfScale( final int xNum, final int xDenom, final int yNum, final int yDenom ) {
if ( xNum == 0 || yNum == 0 || xDenom == 0 || yDenom == 0 ) {
throw new IllegalArgumentException( "Illegal Scaling" );
}
this.xNum = xNum;
this.yNum = yNum;
this.xDenom = xDenom;
this.yDenom = yDenom;
}
public int scaleX( final int coord ) {
return ( ( coord * xNum ) / xDenom );
}
public int scaleY( final int coord ) {
return ( ( coord * yNum ) / yDenom );
}
}
private int viewportOrgX;
private int viewportOrgY;
private int viewportExtX = 1;
private int viewportExtY = 1;
private int windowExtX = 1;
private int windowExtY = 1;
private MfScale viewportScale;
private MfScale windowScale;
private int curPosX;
private int curPosY;
private Color fgColor;
private Color bkColor;
private Color textColor;
private int textAlign;
private int textCharExtra;
private int breakCount;
private int extraSpaceLength;
private int bkmode;
private MfLogBrush logBrush;
private MfLogPen logPen;
private MfLogFont logFont;
private MfLogRegion logRegion;
private MfLogPalette logPalette;
private int polyFillMode;
private int rop;
private int mapMode;
private int mapperFlag;
private int stretchBltMode;
private Rectangle clipRegion;
private WmfFile parent;
public MfDcState( final WmfFile parent ) {
fgColor = Color.black;
bkColor = Color.white;
textColor = Color.black;
this.logBrush = new MfLogBrush();
this.logPen = new MfLogPen();
this.parent = parent;
}
public MfDcState( final MfDcState copy ) {
this.parent = copy.parent;
this.windowExtX = copy.windowExtX;
this.windowExtY = copy.windowExtY;
this.viewportOrgX = copy.viewportOrgX;
this.viewportOrgY = copy.viewportOrgY;
this.viewportExtX = copy.viewportExtX;
this.viewportExtY = copy.viewportExtY;
this.curPosX = copy.curPosX;
this.curPosY = copy.curPosY;
this.fgColor = copy.fgColor;
this.bkColor = copy.bkColor;
this.textAlign = copy.textAlign;
this.textCharExtra = copy.textCharExtra;
this.textColor = copy.textColor;
this.logBrush = copy.logBrush;
this.logPen = copy.logPen;
this.logFont = copy.logFont;
this.mapMode = copy.mapMode;
this.mapperFlag = copy.mapperFlag;
this.stretchBltMode = copy.stretchBltMode;
this.viewportScale = copy.viewportScale;
this.windowScale = copy.windowScale;
this.polyFillMode = copy.polyFillMode;
this.rop = copy.rop;
this.bkmode = copy.bkmode;
this.breakCount = copy.breakCount;
this.extraSpaceLength = copy.extraSpaceLength;
if ( copy.clipRegion != null ) {
this.clipRegion = new Rectangle( copy.clipRegion );
}
}
public void restoredState() {
final Graphics2D graphic = parent.getGraphics2D();
if ( logBrush != null ) {
updateBrushBackground();
graphic.setPaint( logBrush.getPaint() );
}
if ( logPen != null ) {
graphic.setStroke( logPen.getStroke() );
}
if ( logFont != null ) {
graphic.setFont( logFont.createFont() );
}
}
// if no clipping region is set and the default clipping region
// is not modified, return the current viewport
//
// btw. i dont have a clue, whether this is the correct implementation :)
public Rectangle getClipRegion() {
if ( clipRegion == null ) {
return new Rectangle( viewportOrgX, viewportOrgY, viewportExtX, viewportExtY );
}
return clipRegion;
}
public void setClipRegion( final Rectangle clipRegion ) {
this.clipRegion = clipRegion;
}
public int getBkMode() {
return bkmode;
}
public void setBkMode( final int bkmode ) {
if ( this.bkmode != bkmode ) {
this.bkmode = bkmode;
updateBrushBackground();
}
}
private void updateBrushBackground() {
if ( bkmode == BrushConstants.TRANSPARENT ) {
logBrush.setBackgroundColor( new Color( MfLogBrush.COLOR_FULL_ALPHA, true ) );
} else {
logBrush.setBackgroundColor( getBkColor() );
}
}
public int getBreakCount() {
return breakCount;
}
public int getExtraSpaceLength() {
return extraSpaceLength;
}
public void setTextJustification( final int breakCount, final int extraSpaceLength ) {
this.breakCount = breakCount;
this.extraSpaceLength = extraSpaceLength;
}
public int getStretchBltMode() {
return stretchBltMode;
}
public void setStretchBltMode( final int stretchBltMode ) {
this.stretchBltMode = stretchBltMode;
}
public Color getTextColor() {
return textColor;
}
public void setTextColor( final Color textColor ) {
this.textColor = textColor;
}
public int getTextCharExtra() {
return textCharExtra;
}
public void setTextCharExtra( final int textCharExtra ) {
this.textCharExtra = textCharExtra;
}
public int getMapMode() {
return mapMode;
}
public void setMapMode( final int mapMode ) {
this.mapMode = mapMode;
}
public int getMapperFlag() {
return mapperFlag;
}
public void setMapperFlag( final int mapperFlag ) {
this.mapperFlag = mapperFlag;
}
public int getROP() {
return rop;
}
public void setROP( final int rop ) {
this.rop = rop;
}
public int getPolyFillMode() {
return polyFillMode;
}
public void setPolyFillMode( final int mode ) {
this.polyFillMode = mode;
}
public void setWindowOrg( final int windowOrgX, final int windowOrgY ) {
this.viewportOrgY = -windowOrgY;
this.viewportOrgX = -windowOrgX;
}
public int getWindowOrgX() {
return viewportOrgX;
}
public int getWindowOrgY() {
return viewportOrgY;
}
public void setWindowExt( final int windowExtX, final int windowExtY ) {
this.windowExtY = windowExtY;
this.windowExtX = windowExtX;
}
public int getWindowExtX() {
return windowExtX;
}
public int getWindowExtY() {
return windowExtY;
}
public void setViewportOrg( final int viewportOrgX, final int viewportOrgY ) {
this.viewportOrgX = viewportOrgX;
this.viewportOrgY = viewportOrgY;
}
public int getViewportOrgX() {
return viewportOrgX;
}
public int getViewportOrgY() {
return viewportOrgY;
}
public void setViewportExt( final int viewportExtX, final int viewportExtY ) {
this.viewportExtY = viewportExtY;
this.viewportExtX = viewportExtX;
}
public int getViewportExtX() {
return viewportExtX;
}
public int getViewportExtY() {
return viewportExtY;
}
public void setCurPos( final int _curPosX, final int _curPosY ) {
this.curPosY = _curPosY;
this.curPosX = _curPosX;
}
public int getCurPosX() {
return curPosX;
}
public int getCurPosY() {
return curPosY;
}
public int getTextAlign() {
return textAlign;
}
public void setTextAlign( final int textAlign ) {
this.textAlign = textAlign;
}
public void setFgColor( final Color fgColor ) {
if ( fgColor == null ) {
throw new NullPointerException();
}
this.fgColor = fgColor;
logBrush.setColor( fgColor );
logPen.setColor( fgColor );
}
public void setBkColor( final Color bkColor ) {
if ( bkColor == null ) {
throw new NullPointerException();
}
this.bkColor = bkColor;
logBrush.setBackgroundColor( bkColor );
}
public Color getFgColor() {
return fgColor;
}
public Color getBkColor() {
return bkColor;
}
public MfLogFont getLogFont() {
return logFont;
}
public MfLogBrush getLogBrush() {
return logBrush;
}
public MfLogPen getLogPen() {
return logPen;
}
public void setLogFont( final MfLogFont logFont ) {
if ( logFont == null ) {
throw new NullPointerException();
}
this.logFont = logFont;
}
public void setLogBrush( final MfLogBrush logBrush ) {
if ( logBrush == null ) {
throw new NullPointerException();
}
this.logBrush = logBrush;
updateBrushBackground();
parent.getGraphics2D().setPaint( logBrush.getPaint() );
}
public void setLogPen( final MfLogPen logPen ) {
if ( logPen == null ) {
throw new NullPointerException();
}
this.logPen = logPen;
parent.getGraphics2D().setStroke( logPen.getStroke() );
}
public void setLogPalette( final MfLogPalette logPalette ) {
if ( logPalette == null ) {
throw new NullPointerException();
}
this.logPalette = logPalette;
}
public void setLogRegion( final MfLogRegion logRegion ) {
if ( logRegion == null ) {
throw new NullPointerException();
}
this.logRegion = logRegion;
}
// No scaling yet?
public int getPhysicalX( final int logPointX ) {
return logPointX + viewportOrgX;
}
// No scaling yet?
public int getPhysicalY( final int logPointY ) {
return logPointY + viewportOrgY;
}
public void prepareDraw() {
parent.getGraphics2D().setPaint( logPen.getColor() );
}
public void postDraw() {
parent.getGraphics2D().setPaint( logBrush.getPaint() );
}
public void prepareDrawText() {
parent.getGraphics2D().setPaint( textColor );
parent.getGraphics2D().setFont( logFont.createFont() );
}
public void postDrawText() {
parent.getGraphics2D().setPaint( logBrush.getPaint() );
}
public void preparePaint() {
parent.getGraphics2D().setPaint( logBrush.getPaint() );
}
public void postPaint() {
}
public int getVerticalTextAlignment() {
return ( textAlign & TextConstants.TA_CENTER );
}
public int getHorizontalTextAlignment() {
return ( textAlign & TextConstants.TA_BASELINE );
}
public MfLogRegion getLogRegion() {
return logRegion;
}
public MfLogPalette getLogPalette() {
return logPalette;
}
public Object clone()
throws CloneNotSupportedException {
return super.clone();
}
}