1/*
2 *  Licensed to the Apache Software Foundation (ASF) under one or more
3 *  contributor license agreements.  See the NOTICE file distributed with
4 *  this work for additional information regarding copyright ownership.
5 *  The ASF licenses this file to You under the Apache License, Version 2.0
6 *  (the "License"); you may not use this file except in compliance with
7 *  the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 */
17/**
18 * @author Igor V. Stolyarov
19 * @version $Revision$
20 */
21
22package java.awt.image.renderable;
23
24import java.awt.RenderingHints;
25import java.awt.Shape;
26import java.awt.geom.AffineTransform;
27
28/**
29 * The Class RenderContext stores data on how an image is to be rendered: the
30 * affine transform, the area of interest, and the rendering hints.
31 *
32 * @since Android 1.0
33 */
34public class RenderContext implements Cloneable {
35
36    /**
37     * The affine transform.
38     */
39    AffineTransform transform;
40
41    /**
42     * The area of interest.
43     */
44    Shape aoi;
45
46    /**
47     * The rendering hints.
48     */
49    RenderingHints hints;
50
51    /**
52     * Instantiates a new render context.
53     *
54     * @param usr2dev
55     *            the affine transform.
56     * @param aoi
57     *            the area of interest.
58     * @param hints
59     *            the rendering hints.
60     */
61    public RenderContext(AffineTransform usr2dev, Shape aoi, RenderingHints hints) {
62        this.transform = (AffineTransform)usr2dev.clone();
63        this.aoi = aoi;
64        this.hints = hints;
65    }
66
67    /**
68     * Instantiates a new render context with no specified hints.
69     *
70     * @param usr2dev
71     *            the affine transform.
72     * @param aoi
73     *            the area of interest.
74     */
75    public RenderContext(AffineTransform usr2dev, Shape aoi) {
76        this(usr2dev, aoi, null);
77    }
78
79    /**
80     * Instantiates a new render context with no specified area of interest.
81     *
82     * @param usr2dev
83     *            the affine transform.
84     * @param hints
85     *            the rendering hints.
86     */
87    public RenderContext(AffineTransform usr2dev, RenderingHints hints) {
88        this(usr2dev, null, hints);
89    }
90
91    /**
92     * Instantiates a new render context with no rendering hints or area of
93     * interest.
94     *
95     * @param usr2dev
96     *            the affine transform.
97     */
98    public RenderContext(AffineTransform usr2dev) {
99        this(usr2dev, null, null);
100    }
101
102    @Override
103    public Object clone() {
104        return new RenderContext(transform, aoi, hints);
105    }
106
107    /**
108     * Sets the affine transform for this render context.
109     *
110     * @param newTransform
111     *            the new affine transform.
112     */
113    public void setTransform(AffineTransform newTransform) {
114        transform = (AffineTransform)newTransform.clone();
115    }
116
117    /**
118     * Concatenates the current transform with the specified transform (so they
119     * are applied with the specified transform acting first) and sets the
120     * resulting transform as the affine transform of this rendering context.
121     *
122     * @param modTransform
123     *            the new transform which modifies the current transform.
124     * @deprecated use
125     *             {@link RenderContext#preConcatenateTransform(AffineTransform)}
126     *             .
127     */
128    @Deprecated
129    public void preConcetenateTransform(AffineTransform modTransform) {
130        preConcatenateTransform(modTransform);
131    }
132
133    /**
134     * Concatenates the current transform with the specified transform (so they
135     * are applied with the specified transform acting first) and sets the
136     * resulting transform as the affine transform of this rendering context.
137     *
138     * @param modTransform
139     *            the new transform which modifies the current transform.
140     */
141    public void preConcatenateTransform(AffineTransform modTransform) {
142        transform.preConcatenate(modTransform);
143    }
144
145    /**
146     * Concatenate the specified transform with the current transform.
147     *
148     * @param modTransform
149     *            the new transform which modifies the current transform.
150     * @deprecated use
151     *             {@link RenderContext#concatenateTransform(AffineTransform)}.
152     */
153    @Deprecated
154    public void concetenateTransform(AffineTransform modTransform) {
155        concatenateTransform(modTransform);
156    }
157
158    /**
159     * Concatenate the specified transform with the current transform.
160     *
161     * @param modTransform
162     *            the new transform which modifies the current transform.
163     */
164    public void concatenateTransform(AffineTransform modTransform) {
165        transform.concatenate(modTransform);
166    }
167
168    /**
169     * Gets the transform.
170     *
171     * @return the transform.
172     */
173    public AffineTransform getTransform() {
174        return (AffineTransform)transform.clone();
175    }
176
177    /**
178     * Sets the area of interest.
179     *
180     * @param newAoi
181     *            the new area of interest.
182     */
183    public void setAreaOfInterest(Shape newAoi) {
184        aoi = newAoi;
185    }
186
187    /**
188     * Gets the area of interest.
189     *
190     * @return the area of interest.
191     */
192    public Shape getAreaOfInterest() {
193        return aoi;
194    }
195
196    /**
197     * Sets the rendering hints.
198     *
199     * @param hints
200     *            the new rendering hints.
201     */
202    public void setRenderingHints(RenderingHints hints) {
203        this.hints = hints;
204    }
205
206    /**
207     * Gets the rendering hints.
208     *
209     * @return the rendering hints.
210     */
211    public RenderingHints getRenderingHints() {
212        return hints;
213    }
214}
215