GNU Classpath (0.95) | |
Frames | No Frames |
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: */ 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: */ 85: public abstract boolean isCompatibleValue(Object value); 86: 87: /** 88: * Returns the private key for this instance. 89: * 90: * @return The private key. 91: */ 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: */ 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: */ 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: 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: */ 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: */ 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: */ 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: */ 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: */ 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: */ 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: */ 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: */ 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: */ 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: */ 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: */ 667: public void add(RenderingHints hints) 668: { 669: hintMap.putAll(hints); 670: } 671: 672: /** 673: * Clears all the hints from this collection. 674: */ 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: */ 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: */ 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: */ 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: */ 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: */ 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: */ 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: */ 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: */ 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: */ 800: public String toString() 801: { 802: return hintMap.toString(); 803: } 804: } // class RenderingHints
GNU Classpath (0.95) |