001: /*
002:
003: Licensed to the Apache Software Foundation (ASF) under one or more
004: contributor license agreements. See the NOTICE file distributed with
005: this work for additional information regarding copyright ownership.
006: The ASF licenses this file to You under the Apache License, Version 2.0
007: (the "License"); you may not use this file except in compliance with
008: the License. You may obtain a copy of the License at
009:
010: http://www.apache.org/licenses/LICENSE-2.0
011:
012: Unless required by applicable law or agreed to in writing, software
013: distributed under the License is distributed on an "AS IS" BASIS,
014: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015: See the License for the specific language governing permissions and
016: limitations under the License.
017:
018: */
019: package org.apache.batik.gvt;
020:
021: import java.awt.Graphics2D;
022: import java.awt.Paint;
023: import java.awt.geom.AffineTransform;
024: import java.awt.geom.NoninvertibleTransformException;
025:
026: /**
027: * The graphics node container with a background color.
028: *
029: * @author <a href="mailto:Thierry.Kormann@sophia.inria.fr">Thierry Kormann</a>
030: * @version $Id: CanvasGraphicsNode.java 504084 2007-02-06 11:24:46Z dvholten $
031: */
032: public class CanvasGraphicsNode extends CompositeGraphicsNode {
033:
034: /**
035: * This is the position transform for this graphics node.
036: * This is needed because getCTM returns the transform
037: * to the viewport coordinate system which is after viewing but
038: * before positioning.
039: */
040: protected AffineTransform positionTransform;
041: /**
042: * This is the viewing transform for this graphics node.
043: * This is needed because getCTM returns the transform
044: * to the viewport coordinate system which is after viewing but
045: * before positioning.
046: */
047: protected AffineTransform viewingTransform;
048:
049: /**
050: * The background of this canvas graphics node.
051: */
052: protected Paint backgroundPaint;
053:
054: /**
055: * Constructs a new empty <tt>CanvasGraphicsNode</tt>.
056: */
057: public CanvasGraphicsNode() {
058: }
059:
060: //
061: // Properties methods
062: //
063:
064: /**
065: * Sets the background paint of this canvas graphics node.
066: *
067: * @param newBackgroundPaint the new background paint
068: */
069: public void setBackgroundPaint(Paint newBackgroundPaint) {
070: this .backgroundPaint = newBackgroundPaint;
071: }
072:
073: /**
074: * Returns the background paint of this canvas graphics node.
075: */
076: public Paint getBackgroundPaint() {
077: return backgroundPaint;
078: }
079:
080: public void setPositionTransform(AffineTransform at) {
081: fireGraphicsNodeChangeStarted();
082: invalidateGeometryCache();
083: this .positionTransform = at;
084: if (positionTransform != null) {
085: transform = new AffineTransform(positionTransform);
086: if (viewingTransform != null)
087: transform.concatenate(viewingTransform);
088: } else if (viewingTransform != null)
089: transform = new AffineTransform(viewingTransform);
090: else
091: transform = new AffineTransform();
092:
093: if (transform.getDeterminant() != 0) {
094: try {
095: inverseTransform = transform.createInverse();
096: } catch (NoninvertibleTransformException e) {
097: // Should never happen.
098: throw new Error(e.getMessage());
099: }
100: } else {
101: // The transform is not invertible. Use the same
102: // transform.
103: inverseTransform = transform;
104: }
105: fireGraphicsNodeChangeCompleted();
106: }
107:
108: public AffineTransform getPositionTransform() {
109: return positionTransform;
110: }
111:
112: public void setViewingTransform(AffineTransform at) {
113: fireGraphicsNodeChangeStarted();
114: invalidateGeometryCache();
115: this .viewingTransform = at;
116: if (positionTransform != null) {
117: transform = new AffineTransform(positionTransform);
118: if (viewingTransform != null)
119: transform.concatenate(viewingTransform);
120: } else if (viewingTransform != null)
121: transform = new AffineTransform(viewingTransform);
122: else
123: transform = new AffineTransform();
124:
125: if (transform.getDeterminant() != 0) {
126: try {
127: inverseTransform = transform.createInverse();
128: } catch (NoninvertibleTransformException e) {
129: // Should never happen.
130: throw new Error(e.getMessage());
131: }
132: } else {
133: // The transform is not invertible. Use the same
134: // transform.
135: inverseTransform = transform;
136: }
137: fireGraphicsNodeChangeCompleted();
138: }
139:
140: public AffineTransform getViewingTransform() {
141: return viewingTransform;
142: }
143:
144: //
145: // Drawing methods
146: //
147:
148: /**
149: * Paints this node without applying Filter, Mask, Composite, and clip.
150: *
151: * @param g2d the Graphics2D to use
152: */
153: public void primitivePaint(Graphics2D g2d) {
154: if (backgroundPaint != null) {
155: g2d.setPaint(backgroundPaint);
156: g2d.fill(g2d.getClip()); // Fast paint for huge background area
157: }
158: super.primitivePaint(g2d);
159: }
160: }
|