1 /* RenderingHints.java --
2    Copyright (C) 2000, 2001, 2002  Free Software Foundation
3 
4 This file is part of GNU Classpath.
5 
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10 
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING.  If not, write to the
18 Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19 02111-1307 USA.
20 
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library.  Thus, the terms and
23 conditions of the GNU General Public License cover the whole
24 combination.
25 
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module.  An independent module is a module which is not derived from
33 or based on this library.  If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so.  If you do not wish to do so, delete this
36 exception statement from your version. */
37 
38 
39 package java.awt;
40 
41 import java.util.Collection;
42 import java.util.Collections;
43 import java.util.HashMap;
44 import java.util.Map;
45 import java.util.Set;
46 
47 /**
48  * NEEDS DOCUMENTATION
49  *
50  * @author Rolf W. Rasmussen <rolfwr@ii.uib.no>
51  * @author Eric Blake <ebb9@email.byu.edu>
52  */
53 public class RenderingHints implements Map, Cloneable
54 {
55   public abstract static class Key
56   {
57     private final int key;
58 
Key(int privateKey)59     protected Key(int privateKey)
60     {
61       key = privateKey;
62     }
63 
isCompatibleValue(Object value)64     public abstract boolean isCompatibleValue(Object value);
65 
intKey()66     protected final int intKey()
67     {
68       return key;
69     }
70 
hashCode()71     public final int hashCode()
72     {
73       return System.identityHashCode(this);
74     }
75 
equals(Object other)76     public final boolean equals(Object other)
77     {
78       return this == other;
79     }
80   } // class Key
81 
82   private static final class KeyImpl extends Key
83   {
84     final String description;
85     final Object v1;
86     final Object v2;
87     final Object v3;
88 
KeyImpl(int privateKey, String description, Object v1, Object v2, Object v3)89     KeyImpl(int privateKey, String description,
90             Object v1, Object v2, Object v3)
91     {
92       super(privateKey);
93       this.description = description;
94       this.v1 = v1;
95       this.v2 = v2;
96       this.v3 = v3;
97     }
98 
isCompatibleValue(Object value)99     public boolean isCompatibleValue(Object value)
100     {
101       return value == v1 || value == v2 || value == v3;
102     }
103 
toString()104     public String toString()
105     {
106       return description;
107     }
108   } // class KeyImpl
109 
110   private HashMap hintMap = new HashMap();
111 
112   public static final Key KEY_ANTIALIASING;
113 
114   public static final Object VALUE_ANTIALIAS_ON
115     = "Antialiased rendering mode";
116 
117   public static final Object VALUE_ANTIALIAS_OFF
118     = "Nonantialiased rendering mode";
119 
120   public static final Object VALUE_ANTIALIAS_DEFAULT
121     = "Default antialiasing rendering mode";
122 
123   public static final Key KEY_RENDERING;
124 
125   public static final Object VALUE_RENDER_SPEED
126     = "Fastest rendering methods";
127 
128   public static final Object VALUE_RENDER_QUALITY
129     = "Highest quality rendering methods";
130 
131   public static final Object VALUE_RENDER_DEFAULT
132     = "Default rendering methods";
133 
134   public static final Key KEY_DITHERING;
135 
136   public static final Object VALUE_DITHER_DISABLE
137     = "Nondithered rendering mode";
138 
139   public static final Object VALUE_DITHER_ENABLE
140     = "Dithered rendering mode";
141 
142   public static final Object VALUE_DITHER_DEFAULT
143     = "Default dithering mode";
144 
145   public static final Key KEY_TEXT_ANTIALIASING;
146 
147   public static final Object VALUE_TEXT_ANTIALIAS_ON
148     = "Antialiased text mode";
149 
150   public static final Object VALUE_TEXT_ANTIALIAS_OFF
151     = "Nonantialiased text mode";
152 
153   public static final Object VALUE_TEXT_ANTIALIAS_DEFAULT
154     = "Default antialiasing text mode";
155 
156   public static final Key KEY_FRACTIONALMETRICS;
157 
158   public static final Object VALUE_FRACTIONALMETRICS_OFF
159     = "Integer text metrics mode";
160 
161   public static final Object VALUE_FRACTIONALMETRICS_ON
162     = "Fractional text metrics mode";
163 
164   public static final Object VALUE_FRACTIONALMETRICS_DEFAULT
165     = "Default fractional text metrics mode";
166 
167   public static final Key KEY_INTERPOLATION;
168 
169   public static final Object VALUE_INTERPOLATION_NEAREST_NEIGHBOR
170     = "Nearest Neighbor image interpolation mode";
171 
172   public static final Object VALUE_INTERPOLATION_BILINEAR
173     = "Bilinear image interpolation mode";
174 
175   public static final Object VALUE_INTERPOLATION_BICUBIC
176     = "Bicubic image interpolation mode";
177 
178   public static final Key KEY_ALPHA_INTERPOLATION;
179 
180   public static final Object VALUE_ALPHA_INTERPOLATION_SPEED
181     = "Fastest alpha blending methods";
182 
183   public static final Object VALUE_ALPHA_INTERPOLATION_QUALITY
184     = "Highest quality alpha blending methods";
185 
186   public static final Object VALUE_ALPHA_INTERPOLATION_DEFAULT
187     = "Default alpha blending methods";
188 
189   public static final Key KEY_COLOR_RENDERING;
190 
191   public static final Object VALUE_COLOR_RENDER_SPEED
192     = "Fastest color rendering mode";
193 
194   public static final Object VALUE_COLOR_RENDER_QUALITY
195     = "Highest quality color rendering mode";
196 
197   public static final Object VALUE_COLOR_RENDER_DEFAULT
198     = "Default color rendering mode";
199 
200   public static final Key KEY_STROKE_CONTROL;
201 
202   public static final Object VALUE_STROKE_DEFAULT
203     = "Default stroke normalization";
204 
205   public static final Object VALUE_STROKE_NORMALIZE
206     = "Normalize strokes for consistent rendering";
207 
208   public static final Object VALUE_STROKE_PURE
209     = "Pure stroke conversion for accurate paths";
210 
211   static
212   {
213     KEY_ANTIALIASING = new KeyImpl(1, "Global antialiasing enable key",
214                                    VALUE_ANTIALIAS_ON,
215                                    VALUE_ANTIALIAS_OFF,
216                                    VALUE_ANTIALIAS_DEFAULT);
217     KEY_RENDERING = new KeyImpl(2, "Global rendering quality key",
218                                 VALUE_RENDER_SPEED,
219                                 VALUE_RENDER_QUALITY,
220                                 VALUE_RENDER_DEFAULT);
221     KEY_DITHERING = new KeyImpl(3, "Dithering quality key",
222                                 VALUE_DITHER_DISABLE,
223                                 VALUE_DITHER_ENABLE,
224                                 VALUE_DITHER_DEFAULT);
225     KEY_TEXT_ANTIALIASING
226       = new KeyImpl(4, "Text-specific antialiasing enable key",
227                     VALUE_TEXT_ANTIALIAS_ON,
228                     VALUE_TEXT_ANTIALIAS_OFF,
229                     VALUE_TEXT_ANTIALIAS_DEFAULT);
230     KEY_FRACTIONALMETRICS = new KeyImpl(5, "Fractional metrics enable key",
231                                         VALUE_FRACTIONALMETRICS_OFF,
232                                         VALUE_FRACTIONALMETRICS_ON,
233                                         VALUE_FRACTIONALMETRICS_DEFAULT);
234     KEY_INTERPOLATION = new KeyImpl(6, "Image interpolation method key",
235                                     VALUE_INTERPOLATION_NEAREST_NEIGHBOR,
236                                     VALUE_INTERPOLATION_BILINEAR,
237                                     VALUE_INTERPOLATION_BICUBIC);
238     KEY_ALPHA_INTERPOLATION
239       = new KeyImpl(7, "Alpha blending interpolation method key",
240                     VALUE_ALPHA_INTERPOLATION_SPEED,
241                     VALUE_ALPHA_INTERPOLATION_QUALITY,
242                     VALUE_ALPHA_INTERPOLATION_DEFAULT);
243     KEY_COLOR_RENDERING = new KeyImpl(8, "Color rendering quality key",
244                                       VALUE_COLOR_RENDER_SPEED,
245                                       VALUE_COLOR_RENDER_QUALITY,
246                                       VALUE_COLOR_RENDER_DEFAULT);
247     KEY_STROKE_CONTROL = new KeyImpl(9, "Stroke normalization control key",
248                                      VALUE_STROKE_DEFAULT,
249                                      VALUE_STROKE_NORMALIZE,
250                                      VALUE_STROKE_PURE);
251   }
252 
RenderingHints(Map init)253   public RenderingHints(Map init)
254   {
255     putAll(init);
256   }
257 
RenderingHints(Key key, Object value)258   public RenderingHints(Key key, Object value)
259   {
260     put(key, value);
261   }
262 
size()263   public int size()
264   {
265     return hintMap.size();
266   }
267 
isEmpty()268   public boolean isEmpty()
269   {
270     return hintMap.isEmpty();
271   }
272 
containsKey(Object key)273   public boolean containsKey(Object key)
274   {
275     if (key == null)
276       throw new NullPointerException();
277     return hintMap.containsKey((Key) key);
278   }
279 
containsValue(Object value)280   public boolean containsValue(Object value)
281   {
282     return hintMap.containsValue(value);
283   }
284 
get(Object key)285   public Object get(Object key)
286   {
287     return hintMap.get((Key) key);
288   }
289 
put(Object key, Object value)290   public Object put(Object key, Object value)
291   {
292     if (key == null || value == null)
293       throw new NullPointerException();
294     if (! ((Key) key).isCompatibleValue(value))
295       throw new IllegalArgumentException();
296     return hintMap.put(key, value);
297   }
298 
add(RenderingHints hints)299   public void add(RenderingHints hints)
300   {
301     hintMap.putAll(hints);
302   }
303 
clear()304   public void clear()
305   {
306     hintMap.clear();
307   }
308 
remove(Object key)309   public Object remove(Object key)
310   {
311     return remove((Key) key);
312   }
313 
putAll(Map m)314   public void putAll(Map m)
315   {
316     hintMap.putAll(m);
317   }
318 
keySet()319   public Set keySet()
320   {
321     return hintMap.keySet();
322   }
323 
values()324   public Collection values()
325   {
326     return hintMap.values();
327   }
328 
entrySet()329   public Set entrySet()
330   {
331     return Collections.unmodifiableSet(hintMap.entrySet());
332   }
333 
equals(Object o)334   public boolean equals(Object o)
335   {
336     return hintMap.equals(o);
337   }
338 
hashCode()339   public int hashCode()
340   {
341     return hintMap.hashCode();
342   }
343 
clone()344   public Object clone()
345   {
346     try
347       {
348         RenderingHints copy = (RenderingHints) super.clone();
349         copy.hintMap = (HashMap) hintMap.clone();
350         return copy;
351       }
352     catch (CloneNotSupportedException e)
353       {
354         throw (Error) new InternalError().initCause(e); // Impossible
355       }
356   }
357 
toString()358   public String toString()
359   {
360     return hintMap.toString();
361   }
362 } // class RenderingHints
363