Home | History | Annotate | Download | only in awt
      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 Alexey A. Petrenko
     19  * @version $Revision$
     20  */
     21 
     22 package java.awt;
     23 
     24 import java.util.Collection;
     25 import java.util.HashMap;
     26 import java.util.Iterator;
     27 import java.util.Map;
     28 import java.util.Set;
     29 
     30 /**
     31  * The RenderingHints class represents preferences for the rendering algorithms.
     32  * The preferences are arbitrary and can be specified by Map objects or by
     33  * key-value pairs.
     34  *
     35  * @since Android 1.0
     36  */
     37 public class RenderingHints implements Map<Object, Object>, Cloneable {
     38 
     39     /**
     40      * The Constant KEY_ALPHA_INTERPOLATION - alpha interpolation rendering hint
     41      * key.
     42      */
     43     public static final Key KEY_ALPHA_INTERPOLATION = new KeyImpl(1);
     44 
     45     /**
     46      * The Constant VALUE_ALPHA_INTERPOLATION_DEFAULT - alpha interpolation
     47      * rendering hint value.
     48      */
     49     public static final Object VALUE_ALPHA_INTERPOLATION_DEFAULT = new KeyValue(
     50             KEY_ALPHA_INTERPOLATION);
     51 
     52     /**
     53      * The Constant VALUE_ALPHA_INTERPOLATION_SPEED - alpha interpolation
     54      * rendering hint value.
     55      */
     56     public static final Object VALUE_ALPHA_INTERPOLATION_SPEED = new KeyValue(
     57             KEY_ALPHA_INTERPOLATION);
     58 
     59     /**
     60      * The Constant VALUE_ALPHA_INTERPOLATION_QUALITY - alpha interpolation
     61      * rendering hint value.
     62      */
     63     public static final Object VALUE_ALPHA_INTERPOLATION_QUALITY = new KeyValue(
     64             KEY_ALPHA_INTERPOLATION);
     65 
     66     /**
     67      * The Constant KEY_ANTIALIASING - antialiasing rendering hint key.
     68      */
     69     public static final Key KEY_ANTIALIASING = new KeyImpl(2);
     70 
     71     /**
     72      * The Constant VALUE_ANTIALIAS_DEFAULT - antialiasing rendering hint value.
     73      */
     74     public static final Object VALUE_ANTIALIAS_DEFAULT = new KeyValue(KEY_ANTIALIASING);
     75 
     76     /**
     77      * The Constant VALUE_ANTIALIAS_ON - antialiasing rendering hint value.
     78      */
     79     public static final Object VALUE_ANTIALIAS_ON = new KeyValue(KEY_ANTIALIASING);
     80 
     81     /**
     82      * The Constant VALUE_ANTIALIAS_OFF - antialiasing rendering hint value.
     83      */
     84     public static final Object VALUE_ANTIALIAS_OFF = new KeyValue(KEY_ANTIALIASING);
     85 
     86     /**
     87      * The Constant KEY_COLOR_RENDERING - color rendering hint key.
     88      */
     89     public static final Key KEY_COLOR_RENDERING = new KeyImpl(3);
     90 
     91     /**
     92      * The Constant VALUE_COLOR_RENDER_DEFAULT - color rendering hint value.
     93      */
     94     public static final Object VALUE_COLOR_RENDER_DEFAULT = new KeyValue(KEY_COLOR_RENDERING);
     95 
     96     /**
     97      * The Constant VALUE_COLOR_RENDER_SPEED - color rendering hint value.
     98      */
     99     public static final Object VALUE_COLOR_RENDER_SPEED = new KeyValue(KEY_COLOR_RENDERING);
    100 
    101     /**
    102      * The Constant VALUE_COLOR_RENDER_QUALITY - color rendering hint value.
    103      */
    104     public static final Object VALUE_COLOR_RENDER_QUALITY = new KeyValue(KEY_COLOR_RENDERING);
    105 
    106     /**
    107      * The Constant KEY_DITHERING - dithering rendering hint key.
    108      */
    109     public static final Key KEY_DITHERING = new KeyImpl(4);
    110 
    111     /**
    112      * The Constant VALUE_DITHER_DEFAULT - dithering rendering hint value.
    113      */
    114     public static final Object VALUE_DITHER_DEFAULT = new KeyValue(KEY_DITHERING);
    115 
    116     /**
    117      * The Constant VALUE_DITHER_DISABLE - dithering rendering hint value.
    118      */
    119     public static final Object VALUE_DITHER_DISABLE = new KeyValue(KEY_DITHERING);
    120 
    121     /**
    122      * The Constant VALUE_DITHER_DISABLE - dithering rendering hint value.
    123      */
    124     public static final Object VALUE_DITHER_ENABLE = new KeyValue(KEY_DITHERING);
    125 
    126     /**
    127      * The Constant KEY_FRACTIONALMETRICS - fractional metrics rendering hint
    128      * key.
    129      */
    130     public static final Key KEY_FRACTIONALMETRICS = new KeyImpl(5);
    131 
    132     /**
    133      * The Constant VALUE_FRACTIONALMETRICS_DEFAULT - fractional metrics
    134      * rendering hint value.
    135      */
    136     public static final Object VALUE_FRACTIONALMETRICS_DEFAULT = new KeyValue(KEY_FRACTIONALMETRICS);
    137 
    138     /**
    139      * The Constant VALUE_FRACTIONALMETRICS_ON - fractional metrics rendering
    140      * hint value.
    141      */
    142     public static final Object VALUE_FRACTIONALMETRICS_ON = new KeyValue(KEY_FRACTIONALMETRICS);
    143 
    144     /**
    145      * The Constant VALUE_FRACTIONALMETRICS_OFF - fractional metrics rendering
    146      * hint value.
    147      */
    148     public static final Object VALUE_FRACTIONALMETRICS_OFF = new KeyValue(KEY_FRACTIONALMETRICS);
    149 
    150     /**
    151      * The Constant KEY_INTERPOLATION - interpolation rendering hint key.
    152      */
    153     public static final Key KEY_INTERPOLATION = new KeyImpl(6);
    154 
    155     /**
    156      * The Constant VALUE_INTERPOLATION_BICUBIC - interpolation rendering hint
    157      * value.
    158      */
    159     public static final Object VALUE_INTERPOLATION_BICUBIC = new KeyValue(KEY_INTERPOLATION);
    160 
    161     /**
    162      * The Constant VALUE_INTERPOLATION_BILINEAR - interpolation rendering hint
    163      * value.
    164      */
    165     public static final Object VALUE_INTERPOLATION_BILINEAR = new KeyValue(KEY_INTERPOLATION);
    166 
    167     /**
    168      * The Constant VALUE_INTERPOLATION_NEAREST_NEIGHBOR - interpolation
    169      * rendering hint value.
    170      */
    171     public static final Object VALUE_INTERPOLATION_NEAREST_NEIGHBOR = new KeyValue(
    172             KEY_INTERPOLATION);
    173 
    174     /**
    175      * The Constant KEY_RENDERING - rendering hint key.
    176      */
    177     public static final Key KEY_RENDERING = new KeyImpl(7);
    178 
    179     /**
    180      * The Constant VALUE_RENDER_DEFAULT - rendering hint value.
    181      */
    182     public static final Object VALUE_RENDER_DEFAULT = new KeyValue(KEY_RENDERING);
    183 
    184     /**
    185      * The Constant VALUE_RENDER_SPEED - rendering hint value.
    186      */
    187     public static final Object VALUE_RENDER_SPEED = new KeyValue(KEY_RENDERING);
    188 
    189     /**
    190      * The Constant VALUE_RENDER_QUALITY - rendering hint value.
    191      */
    192     public static final Object VALUE_RENDER_QUALITY = new KeyValue(KEY_RENDERING);
    193 
    194     /**
    195      * The Constant KEY_STROKE_CONTROL - stroke control hint key.
    196      */
    197     public static final Key KEY_STROKE_CONTROL = new KeyImpl(8);
    198 
    199     /**
    200      * The Constant VALUE_STROKE_DEFAULT - stroke hint value.
    201      */
    202     public static final Object VALUE_STROKE_DEFAULT = new KeyValue(KEY_STROKE_CONTROL);
    203 
    204     /**
    205      * The Constant VALUE_STROKE_NORMALIZE - stroke hint value.
    206      */
    207     public static final Object VALUE_STROKE_NORMALIZE = new KeyValue(KEY_STROKE_CONTROL);
    208 
    209     /**
    210      * The Constant VALUE_STROKE_PURE - stroke hint value.
    211      */
    212     public static final Object VALUE_STROKE_PURE = new KeyValue(KEY_STROKE_CONTROL);
    213 
    214     /**
    215      * The Constant KEY_TEXT_ANTIALIASING - text antialiasing hint key.
    216      */
    217     public static final Key KEY_TEXT_ANTIALIASING = new KeyImpl(9);
    218 
    219     /**
    220      * The Constant VALUE_TEXT_ANTIALIAS_DEFAULT - text antialiasing hint key.
    221      */
    222     public static final Object VALUE_TEXT_ANTIALIAS_DEFAULT = new KeyValue(KEY_TEXT_ANTIALIASING);
    223 
    224     /**
    225      * The Constant VALUE_TEXT_ANTIALIAS_ON - text antialiasing hint key.
    226      */
    227     public static final Object VALUE_TEXT_ANTIALIAS_ON = new KeyValue(KEY_TEXT_ANTIALIASING);
    228 
    229     /**
    230      * The Constant VALUE_TEXT_ANTIALIAS_OFF - text antialiasing hint key.
    231      */
    232     public static final Object VALUE_TEXT_ANTIALIAS_OFF = new KeyValue(KEY_TEXT_ANTIALIASING);
    233 
    234     /** The map. */
    235     private HashMap<Object, Object> map = new HashMap<Object, Object>();
    236 
    237     /**
    238      * Instantiates a new rendering hints object from specified Map object with
    239      * defined key/value pairs or null for empty RenderingHints.
    240      *
    241      * @param map
    242      *            the Map object with defined key/value pairs or null for empty
    243      *            RenderingHints.
    244      */
    245     public RenderingHints(Map<Key, ?> map) {
    246         super();
    247         if (map != null) {
    248             putAll(map);
    249         }
    250     }
    251 
    252     /**
    253      * Instantiates a new rendering hints object with the specified key/value
    254      * pair.
    255      *
    256      * @param key
    257      *            the key of hint property.
    258      * @param value
    259      *            the value of hint property.
    260      */
    261     public RenderingHints(Key key, Object value) {
    262         super();
    263         put(key, value);
    264     }
    265 
    266     /**
    267      * Adds the properties represented by key/value pairs from the specified
    268      * RenderingHints object to current object.
    269      *
    270      * @param hints
    271      *            the RenderingHints to be added.
    272      */
    273     public void add(RenderingHints hints) {
    274         map.putAll(hints.map);
    275     }
    276 
    277     /**
    278      * Puts the specified value to the specified key. Neither the key nor the
    279      * value can be null.
    280      *
    281      * @param key
    282      *            the rendering hint key.
    283      * @param value
    284      *            the rendering hint value.
    285      * @return the previous rendering hint value assigned to the key or null.
    286      */
    287     public Object put(Object key, Object value) {
    288         if (!((Key)key).isCompatibleValue(value)) {
    289             throw new IllegalArgumentException();
    290         }
    291 
    292         return map.put(key, value);
    293     }
    294 
    295     /**
    296      * Removes the specified key and corresponding value from the RenderingHints
    297      * object.
    298      *
    299      * @param key
    300      *            the specified hint key to be removed.
    301      * @return the object of previous rendering hint value which is assigned to
    302      *         the specified key, or null.
    303      */
    304     public Object remove(Object key) {
    305         return map.remove(key);
    306     }
    307 
    308     /**
    309      * Gets the value assigned to the specified key.
    310      *
    311      * @param key
    312      *            the rendering hint key.
    313      * @return the object assigned to the specified key.
    314      */
    315     public Object get(Object key) {
    316         return map.get(key);
    317     }
    318 
    319     /**
    320      * Returns a set of rendering hints keys for current RenderingHints object.
    321      *
    322      * @return the set of rendering hints keys.
    323      */
    324     public Set<Object> keySet() {
    325         return map.keySet();
    326     }
    327 
    328     /**
    329      * Returns a set of Map.Entry objects which contain current RenderingHint
    330      * key/value pairs.
    331      *
    332      * @return the a set of mapped RenderingHint key/value pairs.
    333      */
    334     public Set<Map.Entry<Object, Object>> entrySet() {
    335         return map.entrySet();
    336     }
    337 
    338     /**
    339      * Puts all of the preferences from the specified Map into the current
    340      * RenderingHints object. These mappings replace all existing preferences.
    341      *
    342      * @param m
    343      *            the specified Map of preferences.
    344      */
    345     public void putAll(Map<?, ?> m) {
    346         if (m instanceof RenderingHints) {
    347             map.putAll(((RenderingHints)m).map);
    348         } else {
    349             Set<?> entries = m.entrySet();
    350 
    351             if (entries != null) {
    352                 Iterator<?> it = entries.iterator();
    353                 while (it.hasNext()) {
    354                     Map.Entry<?, ?> entry = (Map.Entry<?, ?>)it.next();
    355                     Key key = (Key)entry.getKey();
    356                     Object val = entry.getValue();
    357                     put(key, val);
    358                 }
    359             }
    360         }
    361     }
    362 
    363     /**
    364      * Returns a Collection of values contained in current RenderingHints
    365      * object.
    366      *
    367      * @return the Collection of RenderingHints's values.
    368      */
    369     public Collection<Object> values() {
    370         return map.values();
    371     }
    372 
    373     /**
    374      * Checks whether or not current RenderingHints object contains at least one
    375      * the value which is equal to the specified Object.
    376      *
    377      * @param value
    378      *            the specified Object.
    379      * @return true, if the specified object is assigned to at least one
    380      *         RenderingHint's key, false otherwise.
    381      */
    382     public boolean containsValue(Object value) {
    383         return map.containsValue(value);
    384     }
    385 
    386     /**
    387      * Checks whether or not current RenderingHints object contains the key
    388      * which is equal to the specified Object.
    389      *
    390      * @param key
    391      *            the specified Object.
    392      * @return true, if the RenderingHints object contains the specified Object
    393      *         as a key, false otherwise.
    394      */
    395     public boolean containsKey(Object key) {
    396         if (key == null) {
    397             throw new NullPointerException();
    398         }
    399 
    400         return map.containsKey(key);
    401     }
    402 
    403     /**
    404      * Checks whether or not the RenderingHints object contains any key/value
    405      * pairs.
    406      *
    407      * @return true, if the RenderingHints object is empty, false otherwise.
    408      */
    409     public boolean isEmpty() {
    410         return map.isEmpty();
    411     }
    412 
    413     /**
    414      * Clears the RenderingHints of all key/value pairs.
    415      */
    416     public void clear() {
    417         map.clear();
    418     }
    419 
    420     /**
    421      * Returns the number of key/value pairs in the RenderingHints.
    422      *
    423      * @return the number of key/value pairs.
    424      */
    425     public int size() {
    426         return map.size();
    427     }
    428 
    429     /**
    430      * Compares the RenderingHints object with the specified object.
    431      *
    432      * @param o
    433      *            the specified Object to be compared.
    434      * @return true, if the Object is a Map whose key/value pairs match this
    435      *         RenderingHints' key/value pairs, false otherwise.
    436      */
    437     @Override
    438     public boolean equals(Object o) {
    439         if (!(o instanceof Map)) {
    440             return false;
    441         }
    442 
    443         Map<?, ?> m = (Map<?, ?>)o;
    444         Set<?> keys = keySet();
    445         if (!keys.equals(m.keySet())) {
    446             return false;
    447         }
    448 
    449         Iterator<?> it = keys.iterator();
    450         while (it.hasNext()) {
    451             Key key = (Key)it.next();
    452             Object v1 = get(key);
    453             Object v2 = m.get(key);
    454             if (!(v1 == null ? v2 == null : v1.equals(v2))) {
    455                 return false;
    456             }
    457         }
    458         return true;
    459     }
    460 
    461     /**
    462      * Returns the hash code for this RenderingHints object.
    463      *
    464      * @return the hash code for this RenderingHints object.
    465      */
    466     @Override
    467     public int hashCode() {
    468         return map.hashCode();
    469     }
    470 
    471     /**
    472      * Returns the clone of the RenderingHints object with the same contents.
    473      *
    474      * @return the clone of the RenderingHints instance.
    475      */
    476     @SuppressWarnings("unchecked")
    477     @Override
    478     public Object clone() {
    479         RenderingHints clone = new RenderingHints(null);
    480         clone.map = (HashMap<Object, Object>)this.map.clone();
    481         return clone;
    482     }
    483 
    484     /**
    485      * Returns the string representation of the RenderingHints object.
    486      *
    487      * @return the String object which represents RenderingHints object.
    488      */
    489     @Override
    490     public String toString() {
    491         return "RenderingHints[" + map.toString() + "]"; //$NON-NLS-1$ //$NON-NLS-2$
    492     }
    493 
    494     /**
    495      * The RenderingHints.Key class is abstract and defines a base type for all
    496      * RenderingHints keys.
    497      *
    498      * @since Android 1.0
    499      */
    500     public abstract static class Key {
    501 
    502         /** The key. */
    503         private final int key;
    504 
    505         /**
    506          * Instantiates a new key with unique integer identifier. No two objects
    507          * of the same subclass with the same integer key can be instantiated.
    508          *
    509          * @param key
    510          *            the unique key.
    511          */
    512         protected Key(int key) {
    513             this.key = key;
    514         }
    515 
    516         /**
    517          * Compares the Key object with the specified object.
    518          *
    519          * @param o
    520          *            the specified Object to be compared.
    521          * @return true, if the Key is equal to the specified object, false
    522          *         otherwise.
    523          */
    524         @Override
    525         public final boolean equals(Object o) {
    526             return this == o;
    527         }
    528 
    529         /**
    530          * Returns the hash code for this Key object.
    531          *
    532          * @return the hash code for this Key object.
    533          */
    534         @Override
    535         public final int hashCode() {
    536             return System.identityHashCode(this);
    537         }
    538 
    539         /**
    540          * Returns integer unique key with which this Key object has been
    541          * instantiated.
    542          *
    543          * @return the integer unique key with which this Key object has been
    544          *         instantiated.
    545          */
    546         protected final int intKey() {
    547             return key;
    548         }
    549 
    550         /**
    551          * Checks whether or not specified value is compatible with the Key.
    552          *
    553          * @param val
    554          *            the Object.
    555          * @return true, if the specified value is compatible with the Key,
    556          *         false otherwise.
    557          */
    558         public abstract boolean isCompatibleValue(Object val);
    559     }
    560 
    561     /**
    562      * Private implementation of Key class.
    563      */
    564     private static class KeyImpl extends Key {
    565 
    566         /**
    567          * Instantiates a new key implementation.
    568          *
    569          * @param key
    570          *            the key.
    571          */
    572         protected KeyImpl(int key) {
    573             super(key);
    574         }
    575 
    576         @Override
    577         public boolean isCompatibleValue(Object val) {
    578             if (!(val instanceof KeyValue)) {
    579                 return false;
    580             }
    581 
    582             return ((KeyValue)val).key == this;
    583         }
    584     }
    585 
    586     /**
    587      * Private class KeyValue is used as value for Key class instance.
    588      */
    589     private static class KeyValue {
    590 
    591         /**
    592          * The key.
    593          */
    594         private final Key key;
    595 
    596         /**
    597          * Instantiates a new key value.
    598          *
    599          * @param key
    600          *            the key.
    601          */
    602         protected KeyValue(Key key) {
    603             this.key = key;
    604         }
    605     }
    606 }
    607