1 /* RenderingHints.java --
2    Copyright (C) 2000, 2001, 2002, 2004, 2005  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., 51 Franklin Street, Fifth Floor, Boston, MA
19 02110-1301 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.Iterator;
45 import java.util.Map;
46 import java.util.Set;
47 
48 /**
49  * A collection of (key, value) items that provide 'hints' for the
50  * {@link java.awt.Graphics2D} rendering pipeline.  Because these
51  * items are hints only, they may be ignored by a particular
52  * {@link java.awt.Graphics2D} implementation.
53  *
54  * @author Rolf W. Rasmussen (rolfwr@ii.uib.no)
55  * @author Eric Blake (ebb9@email.byu.edu)
56  */
57 public class RenderingHints
58   implements Map<Object,Object>, Cloneable
59 {
60   /**
61    * The base class used to represent keys.
62    */
63   public abstract static class Key
64   {
65     private final int key;
66 
67     /**
68      * Creates a new key.
69      *
70      * @param privateKey  the private key.
71      */
Key(int privateKey)72     protected Key(int privateKey)
73     {
74       key = privateKey;
75     }
76 
77     /**
78      * Returns <code>true</code> if the specified value is compatible with
79      * this key, and <code>false</code> otherwise.
80      *
81      * @param value  the value (<code>null</code> permitted).
82      *
83      * @return A boolean.
84      */
isCompatibleValue(Object value)85     public abstract boolean isCompatibleValue(Object value);
86 
87     /**
88      * Returns the private key for this instance.
89      *
90      * @return The private key.
91      */
intKey()92     protected final int intKey()
93     {
94       return key;
95     }
96 
97     /**
98      * Returns a hash code for the key.
99      *
100      * @return A hash code.
101      */
hashCode()102     public final int hashCode()
103     {
104       return System.identityHashCode(this);
105     }
106 
107     /**
108      * Checks this key for equality with an arbitrary object.
109      *
110      * @param other  the object (<code>null</code> permitted)
111      *
112      * @return A boolean.
113      */
equals(Object other)114     public final boolean equals(Object other)
115     {
116       return this == other;
117     }
118   } // class Key
119 
120   private static final class KeyImpl extends Key
121   {
122     final String description;
123     final Object v1;
124     final Object v2;
125     final Object v3;
126 
KeyImpl(int privateKey, String description, Object v1, Object v2, Object v3)127     KeyImpl(int privateKey, String description,
128             Object v1, Object v2, Object v3)
129     {
130       super(privateKey);
131       this.description = description;
132       this.v1 = v1;
133       this.v2 = v2;
134       this.v3 = v3;
135     }
136 
137     /**
138      * Returns <code>true</code> if the specified value is compatible with
139      * this key, and <code>false</code> otherwise.
140      *
141      * @param value  the value (<code>null</code> permitted).
142      *
143      * @return A boolean.
144      */
isCompatibleValue(Object value)145     public boolean isCompatibleValue(Object value)
146     {
147       return value == v1 || value == v2 || value == v3;
148     }
149 
150     /**
151      * Returns a string representation of the key.
152      *
153      * @return A string.
154      */
toString()155     public String toString()
156     {
157       return description;
158     }
159   } // class KeyImpl
160 
161   private HashMap<Object,Object> hintMap = new HashMap<Object,Object>();
162 
163   /**
164    * A key for the 'antialiasing' hint.  Permitted values are:
165    * <p>
166    * <table>
167    * <tr>
168    *   <td>{@link #VALUE_ANTIALIAS_OFF}</td>
169    *   <td>Render without antialiasing (better speed).</td>
170    * </tr>
171    * <tr>
172    *   <td>{@link #VALUE_ANTIALIAS_ON}</td>
173    *   <td>Render with antialiasing (better quality).</td>
174    * </tr>
175    * <tr>
176    *   <td>{@link #VALUE_ANTIALIAS_DEFAULT}</td>
177    *   <td>Use the default value for antialiasing.</td>
178    * </tr>
179    * </table>
180    */
181   public static final Key KEY_ANTIALIASING;
182 
183   /**
184    * This value is for use with the {@link #KEY_ANTIALIASING} key.
185    */
186   public static final Object VALUE_ANTIALIAS_ON
187     = "Antialiased rendering mode";
188 
189   /**
190    * This value is for use with the {@link #KEY_ANTIALIASING} key.
191    */
192   public static final Object VALUE_ANTIALIAS_OFF
193     = "Nonantialiased rendering mode";
194 
195   /**
196    * This value is for use with the {@link #KEY_ANTIALIASING} key.
197    */
198   public static final Object VALUE_ANTIALIAS_DEFAULT
199     = "Default antialiasing rendering mode";
200 
201   /**
202    * A key for the 'rendering' hint.  Permitted values are:
203    * <p>
204    * <table>
205    * <tr>
206    *   <td>{@link #VALUE_RENDER_SPEED}</td>
207    *   <td>Prefer speed over quality when rendering.</td>
208    * </tr>
209    * <tr>
210    *   <td>{@link #VALUE_RENDER_QUALITY}</td>
211    *   <td>Prefer quality over speed when rendering.</td>
212    * </tr>
213    * <tr>
214    *   <td>{@link #VALUE_RENDER_DEFAULT}</td>
215    *   <td>Use the default value for quality vs. speed when rendering.</td>
216    * </tr>
217    * </table>
218    */
219   public static final Key KEY_RENDERING;
220 
221   /**
222    * This value is for use with the {@link #KEY_RENDERING} key.
223    */
224   public static final Object VALUE_RENDER_SPEED
225     = "Fastest rendering methods";
226 
227   /**
228    * This value is for use with the {@link #KEY_RENDERING} key.
229    */
230   public static final Object VALUE_RENDER_QUALITY
231     = "Highest quality rendering methods";
232 
233   /**
234    * This value is for use with the {@link #KEY_RENDERING} key.
235    */
236   public static final Object VALUE_RENDER_DEFAULT
237     = "Default rendering methods";
238 
239   /**
240    * A key for the 'dithering' hint.  Permitted values are:
241    * <p>
242    * <table>
243    * <tr>
244    *   <td>{@link #VALUE_DITHER_DISABLE}</td>
245    *   <td>Disable dithering.</td>
246    * </tr>
247    * <tr>
248    *   <td>{@link #VALUE_DITHER_ENABLE}</td>
249    *   <td>Enable dithering.</td>
250    * </tr>
251    * <tr>
252    *   <td>{@link #VALUE_DITHER_DEFAULT}</td>
253    *   <td>Use the default value for dithering.</td>
254    * </tr>
255    * </table>
256    */
257   public static final Key KEY_DITHERING;
258 
259   /**
260    * This value is for use with the {@link #KEY_DITHERING} key.
261    */
262   public static final Object VALUE_DITHER_DISABLE
263     = "Nondithered rendering mode";
264 
265   /**
266    * This value is for use with the {@link #KEY_DITHERING} key.
267    */
268   public static final Object VALUE_DITHER_ENABLE
269     = "Dithered rendering mode";
270 
271   /**
272    * This value is for use with the {@link #KEY_DITHERING} key.
273    */
274   public static final Object VALUE_DITHER_DEFAULT
275     = "Default dithering mode";
276 
277   /**
278    * A key for the 'text antialiasing' hint.  Permitted values are:
279    * <p>
280    * <table>
281    * <tr>
282    *   <td>{@link #VALUE_TEXT_ANTIALIAS_ON}</td>
283    *   <td>Render text with antialiasing (better quality usually).</td>
284    * </tr>
285    * <tr>
286    *   <td>{@link #VALUE_TEXT_ANTIALIAS_OFF}</td>
287    *   <td>Render test without antialiasing (better speed).</td>
288    * </tr>
289    * <tr>
290    *   <td>{@link #VALUE_TEXT_ANTIALIAS_DEFAULT}</td>
291    *   <td>Use the default value for text antialiasing.</td>
292    * </tr>
293    * </table>
294    */
295   public static final Key KEY_TEXT_ANTIALIASING;
296 
297   /**
298    * This value is for use with the {@link #KEY_TEXT_ANTIALIASING} key.
299    */
300   public static final Object VALUE_TEXT_ANTIALIAS_ON
301     = "Antialiased text mode";
302 
303   /**
304    * This value is for use with the {@link #KEY_TEXT_ANTIALIASING} key.
305    */
306   public static final Object VALUE_TEXT_ANTIALIAS_OFF
307     = "Nonantialiased text mode";
308 
309   /**
310    * This value is for use with the {@link #KEY_TEXT_ANTIALIASING} key.
311    */
312   public static final Object VALUE_TEXT_ANTIALIAS_DEFAULT
313     = "Default antialiasing text mode";
314 
315   /**
316    * A key for the 'fractional metrics' hint.  Permitted values are:
317    * <p>
318    * <table>
319    * <tr>
320    *   <td>{@link #VALUE_FRACTIONALMETRICS_OFF}</td>
321    *   <td>Render text with fractional metrics off.</td>
322    * </tr>
323    * <tr>
324    *   <td>{@link #VALUE_FRACTIONALMETRICS_ON}</td>
325    *   <td>Render text with fractional metrics on.</td>
326    * </tr>
327    * <tr>
328    *   <td>{@link #VALUE_FRACTIONALMETRICS_DEFAULT}</td>
329    *   <td>Use the default value for fractional metrics.</td>
330    * </tr>
331    * </table>
332    */
333   public static final Key KEY_FRACTIONALMETRICS;
334 
335   /**
336    * This value is for use with the {@link #KEY_FRACTIONALMETRICS} key.
337    */
338   public static final Object VALUE_FRACTIONALMETRICS_OFF
339     = "Integer text metrics mode";
340 
341   /**
342    * This value is for use with the {@link #KEY_FRACTIONALMETRICS} key.
343    */
344   public static final Object VALUE_FRACTIONALMETRICS_ON
345     = "Fractional text metrics mode";
346 
347   /**
348    * This value is for use with the {@link #KEY_FRACTIONALMETRICS} key.
349    */
350   public static final Object VALUE_FRACTIONALMETRICS_DEFAULT
351     = "Default fractional text metrics mode";
352 
353   /**
354    * A key for the 'interpolation' hint.  Permitted values are:
355    * <p>
356    * <table>
357    * <tr>
358    *   <td>{@link #VALUE_INTERPOLATION_NEAREST_NEIGHBOR}</td>
359    *   <td>Use nearest neighbour interpolation.</td>
360    * </tr>
361    * <tr>
362    *   <td>{@link #VALUE_INTERPOLATION_BILINEAR}</td>
363    *   <td>Use bilinear interpolation.</td>
364    * </tr>
365    * <tr>
366    *   <td>{@link #VALUE_INTERPOLATION_BICUBIC}</td>
367    *   <td>Use bicubic interpolation.</td>
368    * </tr>
369    * </table>
370    */
371   public static final Key KEY_INTERPOLATION;
372 
373   /**
374    * This value is for use with the {@link #KEY_INTERPOLATION} key.
375    */
376   public static final Object VALUE_INTERPOLATION_NEAREST_NEIGHBOR
377     = "Nearest Neighbor image interpolation mode";
378 
379   /**
380    * This value is for use with the {@link #KEY_INTERPOLATION} key.
381    */
382   public static final Object VALUE_INTERPOLATION_BILINEAR
383     = "Bilinear image interpolation mode";
384 
385   /**
386    * This value is for use with the {@link #KEY_INTERPOLATION} key.
387    */
388   public static final Object VALUE_INTERPOLATION_BICUBIC
389     = "Bicubic image interpolation mode";
390 
391   /**
392    * A key for the 'alpha interpolation' hint.  Permitted values are:
393    * <p>
394    * <table>
395    * <tr>
396    *   <td>{@link #VALUE_ALPHA_INTERPOLATION_SPEED}</td>
397    *   <td>Prefer speed over quality.</td>
398    * </tr>
399    * <tr>
400    *   <td>{@link #VALUE_ALPHA_INTERPOLATION_QUALITY}</td>
401    *   <td>Prefer quality over speed.</td>
402    * </tr>
403    * <tr>
404    *   <td>{@link #VALUE_ALPHA_INTERPOLATION_DEFAULT}</td>
405    *   <td>Use the default setting.</td>
406    * </tr>
407    * </table>
408    */
409   public static final Key KEY_ALPHA_INTERPOLATION;
410 
411   /**
412    * This value is for use with the {@link #KEY_ALPHA_INTERPOLATION} key.
413    */
414   public static final Object VALUE_ALPHA_INTERPOLATION_SPEED
415     = "Fastest alpha blending methods";
416 
417   /**
418    * This value is for use with the {@link #KEY_ALPHA_INTERPOLATION} key.
419    */
420   public static final Object VALUE_ALPHA_INTERPOLATION_QUALITY
421     = "Highest quality alpha blending methods";
422 
423   /**
424    * This value is for use with the {@link #KEY_ALPHA_INTERPOLATION} key.
425    */
426   public static final Object VALUE_ALPHA_INTERPOLATION_DEFAULT
427     = "Default alpha blending methods";
428 
429   /**
430    * A key for the 'color rendering' hint.  Permitted values are:
431    * <p>
432    * <table>
433    * <tr>
434    *   <td>{@link #VALUE_COLOR_RENDER_SPEED}</td>
435    *   <td>Prefer speed over quality.</td>
436    * </tr>
437    * <tr>
438    *   <td>{@link #VALUE_COLOR_RENDER_QUALITY}</td>
439    *   <td>Prefer quality over speed.</td>
440    * </tr>
441    * <tr>
442    *   <td>{@link #VALUE_COLOR_RENDER_DEFAULT}</td>
443    *   <td>Use the default setting.</td>
444    * </tr>
445    * </table>
446    */
447   public static final Key KEY_COLOR_RENDERING;
448 
449   /**
450    * This value is for use with the {@link #KEY_COLOR_RENDERING} key.
451    */
452   public static final Object VALUE_COLOR_RENDER_SPEED
453     = "Fastest color rendering mode";
454 
455   /**
456    * This value is for use with the {@link #KEY_COLOR_RENDERING} key.
457    */
458   public static final Object VALUE_COLOR_RENDER_QUALITY
459     = "Highest quality color rendering mode";
460 
461   /**
462    * This value is for use with the {@link #KEY_COLOR_RENDERING} key.
463    */
464   public static final Object VALUE_COLOR_RENDER_DEFAULT
465     = "Default color rendering mode";
466 
467   /**
468    * A key for the 'stroke control' hint.  Permitted values are:
469    * <p>
470    * <table>
471    * <tr>
472    *   <td>{@link #VALUE_STROKE_DEFAULT}</td>
473    *   <td>Use the default setting.</td>
474    * </tr>
475    * <tr>
476    *   <td>{@link #VALUE_STROKE_NORMALIZE}</td>
477    *   <td>XXX</td>
478    * </tr>
479    * <tr>
480    *   <td>{@link #VALUE_STROKE_PURE}</td>
481    *   <td>XXX</td>
482    * </tr>
483    * </table>
484    */
485   public static final Key KEY_STROKE_CONTROL;
486 
487   /**
488    * This value is for use with the {@link #KEY_STROKE_CONTROL} key.
489    */
490   public static final Object VALUE_STROKE_DEFAULT
491     = "Default stroke normalization";
492 
493   /**
494    * This value is for use with the {@link #KEY_STROKE_CONTROL} key.
495    */
496   public static final Object VALUE_STROKE_NORMALIZE
497     = "Normalize strokes for consistent rendering";
498 
499   /**
500    * This value is for use with the {@link #KEY_STROKE_CONTROL} key.
501    */
502   public static final Object VALUE_STROKE_PURE
503     = "Pure stroke conversion for accurate paths";
504 
505   static
506   {
507     KEY_ANTIALIASING = new KeyImpl(1, "Global antialiasing enable key",
508                                    VALUE_ANTIALIAS_ON,
509                                    VALUE_ANTIALIAS_OFF,
510                                    VALUE_ANTIALIAS_DEFAULT);
511     KEY_RENDERING = new KeyImpl(2, "Global rendering quality key",
512                                 VALUE_RENDER_SPEED,
513                                 VALUE_RENDER_QUALITY,
514                                 VALUE_RENDER_DEFAULT);
515     KEY_DITHERING = new KeyImpl(3, "Dithering quality key",
516                                 VALUE_DITHER_DISABLE,
517                                 VALUE_DITHER_ENABLE,
518                                 VALUE_DITHER_DEFAULT);
519     KEY_TEXT_ANTIALIASING
520       = new KeyImpl(4, "Text-specific antialiasing enable key",
521                     VALUE_TEXT_ANTIALIAS_ON,
522                     VALUE_TEXT_ANTIALIAS_OFF,
523                     VALUE_TEXT_ANTIALIAS_DEFAULT);
524     KEY_FRACTIONALMETRICS = new KeyImpl(5, "Fractional metrics enable key",
525                                         VALUE_FRACTIONALMETRICS_OFF,
526                                         VALUE_FRACTIONALMETRICS_ON,
527                                         VALUE_FRACTIONALMETRICS_DEFAULT);
528     KEY_INTERPOLATION = new KeyImpl(6, "Image interpolation method key",
529                                     VALUE_INTERPOLATION_NEAREST_NEIGHBOR,
530                                     VALUE_INTERPOLATION_BILINEAR,
531                                     VALUE_INTERPOLATION_BICUBIC);
532     KEY_ALPHA_INTERPOLATION
533       = new KeyImpl(7, "Alpha blending interpolation method key",
534                     VALUE_ALPHA_INTERPOLATION_SPEED,
535                     VALUE_ALPHA_INTERPOLATION_QUALITY,
536                     VALUE_ALPHA_INTERPOLATION_DEFAULT);
537     KEY_COLOR_RENDERING = new KeyImpl(8, "Color rendering quality key",
538                                       VALUE_COLOR_RENDER_SPEED,
539                                       VALUE_COLOR_RENDER_QUALITY,
540                                       VALUE_COLOR_RENDER_DEFAULT);
541     KEY_STROKE_CONTROL = new KeyImpl(9, "Stroke normalization control key",
542                                      VALUE_STROKE_DEFAULT,
543                                      VALUE_STROKE_NORMALIZE,
544                                      VALUE_STROKE_PURE);
545   }
546 
547   /**
548    * Creates a new collection of hints containing all the (key, value) pairs
549    * in the specified map.
550    *
551    * @param init  a map containing a collection of hints (<code>null</code>
552    *              permitted).
553    */
RenderingHints(Map<Key,?> init)554   public RenderingHints(Map<Key,?> init)
555   {
556     if (init != null)
557       putAll(init);
558   }
559 
560   /**
561    * Creates a new collection containing a single (key, value) pair.
562    *
563    * @param key  the key.
564    * @param value  the value.
565    */
RenderingHints(Key key, Object value)566   public RenderingHints(Key key, Object value)
567   {
568     put(key, value);
569   }
570 
571   /**
572    * Returns the number of hints in the collection.
573    *
574    * @return The number of hints.
575    */
size()576   public int size()
577   {
578     return hintMap.size();
579   }
580 
581   /**
582    * Returns <code>true</code> if there are no hints in the collection,
583    * and <code>false</code> otherwise.
584    *
585    * @return A boolean.
586    */
isEmpty()587   public boolean isEmpty()
588   {
589     return hintMap.isEmpty();
590   }
591 
592   /**
593    * Returns <code>true</code> if the collection of hints contains the
594    * specified key, and <code>false</code> otherwise.
595    *
596    * @param key  the key (<code>null</code> not permitted).
597    *
598    * @return A boolean.
599    *
600    * @throws NullPointerException if <code>key</code> is <code>null</code>.
601    * @throws ClassCastException if <code>key</code> is not a {@link Key}.
602    */
containsKey(Object key)603   public boolean containsKey(Object key)
604   {
605     if (key == null)
606       throw new NullPointerException();
607     // don't remove the cast, it is necessary to throw the required exception
608     return hintMap.containsKey((Key) key);
609   }
610 
611   /**
612    * Returns <code>true</code> if the collection of hints contains the
613    * specified value, and <code>false</code> otherwise.
614    *
615    * @param value  the value.
616    *
617    * @return A boolean.
618    */
containsValue(Object value)619   public boolean containsValue(Object value)
620   {
621     return hintMap.containsValue(value);
622   }
623 
624   /**
625    * Returns the value associated with the specified key, or <code>null</code>
626    * if there is no value defined for the key.
627    *
628    * @param key  the key (<code>null</code> permitted).
629    *
630    * @return The value (possibly <code>null</code>).
631    *
632    * @throws ClassCastException if <code>key</code> is not a {@link Key}.
633    *
634    * @see #containsKey(Object)
635    */
get(Object key)636   public Object get(Object key)
637   {
638     // don't remove the cast, it is necessary to throw the required exception
639     return hintMap.get((Key) key);
640   }
641 
642   /**
643    * Adds a (key, value) pair to the collection of hints (if the
644    * collection already contains the specified key, then the
645    * value is updated).
646    *
647    * @param key  the key.
648    * @param value  the value.
649    *
650    * @return  the previous value of the key or <code>null</code> if the key
651    * didn't have a value yet.
652    */
put(Object key, Object value)653   public Object put(Object key, Object value)
654   {
655     if (key == null || value == null)
656       throw new NullPointerException();
657     if (! ((Key) key).isCompatibleValue(value))
658       throw new IllegalArgumentException();
659     return hintMap.put(key, value);
660   }
661 
662   /**
663    * Adds all the hints from a collection to this collection.
664    *
665    * @param hints  the hint collection.
666    */
add(RenderingHints hints)667   public void add(RenderingHints hints)
668   {
669     hintMap.putAll(hints);
670   }
671 
672   /**
673    * Clears all the hints from this collection.
674    */
clear()675   public void clear()
676   {
677     hintMap.clear();
678   }
679 
680   /**
681    * Removes a hint from the collection.
682    *
683    * @param key  the key.
684    *
685    * @return The value that was associated with the key, or <code>null</code> if
686    *         the key was not part of the collection
687    *
688    * @throws ClassCastException if the key is not a subclass of
689    *         {@link RenderingHints.Key}.
690    */
remove(Object key)691   public Object remove(Object key)
692   {
693     // don't remove the (Key) cast, it is necessary to throw the exception
694     // required by the spec
695     return hintMap.remove((Key) key);
696   }
697 
698   /**
699    * Adds a collection of (key, value) pairs to the collection.
700    *
701    * @param m  a map containing (key, value) items.
702    *
703    * @throws ClassCastException if the map contains a key that is not
704    *         a subclass of {@link RenderingHints.Key}.
705    * @throws IllegalArgumentException if the map contains a value that is
706    *         not compatible with its key.
707    */
putAll(Map<?,?> m)708   public void putAll(Map<?,?> m)
709   {
710     // preprocess map to generate appropriate exceptions
711     Iterator iterator = m.keySet().iterator();
712     while (iterator.hasNext())
713       {
714         Key key = (Key) iterator.next();
715         if (!key.isCompatibleValue(m.get(key)))
716           throw new IllegalArgumentException();
717       }
718     // map is OK, update
719     hintMap.putAll(m);
720   }
721 
722   /**
723    * Returns a set containing the keys from this collection.
724    *
725    * @return A set of keys.
726    */
keySet()727   public Set<Object> keySet()
728   {
729     return hintMap.keySet();
730   }
731 
732   /**
733    * Returns a collection of the values from this hint collection.  The
734    * collection is backed by the <code>RenderingHints</code> instance,
735    * so updates to one will affect the other.
736    *
737    * @return A collection of values.
738    */
values()739   public Collection<Object> values()
740   {
741     return hintMap.values();
742   }
743 
744   /**
745    * Returns a set of entries from the collection.
746    *
747    * @return A set of entries.
748    */
entrySet()749   public Set<Map.Entry<Object,Object>> entrySet()
750   {
751     return Collections.unmodifiableSet(hintMap.entrySet());
752   }
753 
754   /**
755    * Checks this collection for equality with an arbitrary object.
756    *
757    * @param o  the object (<code>null</code> permitted)
758    *
759    * @return A boolean.
760    */
equals(Object o)761   public boolean equals(Object o)
762   {
763     return hintMap.equals(o);
764   }
765 
766   /**
767    * Returns a hash code for the collection of hints.
768    *
769    * @return A hash code.
770    */
hashCode()771   public int hashCode()
772   {
773     return hintMap.hashCode();
774   }
775 
776   /**
777    * Creates a clone of this instance.
778    *
779    * @return A clone.
780    */
clone()781   public Object clone()
782   {
783     try
784       {
785         RenderingHints copy = (RenderingHints) super.clone();
786         copy.hintMap = new HashMap<Object,Object>(hintMap);
787         return copy;
788       }
789     catch (CloneNotSupportedException e)
790       {
791         throw (Error) new InternalError().initCause(e); // Impossible
792       }
793   }
794 
795   /**
796    * Returns a string representation of this instance.
797    *
798    * @return A string.
799    */
toString()800   public String toString()
801   {
802     return hintMap.toString();
803   }
804 } // class RenderingHints
805