1 /* 2 * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package sun.awt; 27 28 import java.awt.RenderingHints; 29 import java.lang.annotation.Native; 30 31 /** 32 * This class contains rendering hints that can be used by the 33 * {@link java.awt.Graphics2D} class, and classes that implement 34 * {@link java.awt.image.BufferedImageOp} and 35 * {@link java.awt.image.Raster}. 36 */ 37 public class SunHints { 38 /** 39 * Defines the type of all keys used to control various 40 * aspects of the rendering and imaging pipelines. Instances 41 * of this class are immutable and unique which means that 42 * tests for matches can be made using the == operator instead 43 * of the more expensive equals() method. 44 */ 45 public static class Key extends RenderingHints.Key { 46 String description; 47 48 /** 49 * Construct a key using the indicated private key. Each 50 * subclass of Key maintains its own unique domain of integer 51 * keys. No two objects with the same integer key and of the 52 * same specific subclass can be constructed. An exception 53 * will be thrown if an attempt is made to construct another 54 * object of a given class with the same integer key as a 55 * pre-existing instance of that subclass of Key. 56 */ 57 public Key(int privatekey, String description) { 58 super(privatekey); 59 this.description = description; 60 } 61 62 /** 63 * Returns the numeric index associated with this Key. This 64 * is useful for use in switch statements and quick lookups 65 * of the setting of a particular key. 66 */ 67 public final int getIndex() { 68 return intKey(); 69 } 70 71 /** 72 * Returns a string representation of the Key. 73 */ 74 public final String toString() { 75 return description; 76 } 77 78 /** 79 * Returns true if the specified object is a valid value 80 * for this Key. 81 */ 82 public boolean isCompatibleValue(Object val) { 83 if (val instanceof Value) { 84 return ((Value)val).isCompatibleKey(this); 85 } 86 return false; 87 } 88 } 89 90 /** 91 * Defines the type of all "enumerative" values used to control 92 * various aspects of the rendering and imaging pipelines. Instances 93 * of this class are immutable and unique which means that 94 * tests for matches can be made using the == operator instead 95 * of the more expensive equals() method. 96 */ 97 public static class Value { 98 private SunHints.Key myKey; 99 private int index; 100 private String description; 101 102 private static Value[][] ValueObjects = 103 new Value[NUM_KEYS][VALS_PER_KEY]; 104 105 private synchronized static void register(SunHints.Key key, 106 Value value) { 107 int kindex = key.getIndex(); 108 int vindex = value.getIndex(); 109 if (ValueObjects[kindex][vindex] != null) { 110 throw new InternalError("duplicate index: "+vindex); 111 } 112 ValueObjects[kindex][vindex] = value; 113 } 114 115 public static Value get(int keyindex, int valueindex) { 116 return ValueObjects[keyindex][valueindex]; 117 } 118 119 /** 120 * Construct a value using the indicated private index. Each 121 * subclass of Value maintains its own unique domain of integer 122 * indices. Enforcing the uniqueness of the integer indices 123 * is left to the subclass. 124 */ 125 public Value(SunHints.Key key, int index, String description) { 126 this.myKey = key; 127 this.index = index; 128 this.description = description; 129 130 register(key, this); 131 } 132 133 /** 134 * Returns the numeric index associated with this Key. This 135 * is useful for use in switch statements and quick lookups 136 * of the setting of a particular key. 137 */ 138 public final int getIndex() { 139 return index; 140 } 141 142 /** 143 * Returns a string representation of this Value. 144 */ 145 public final String toString() { 146 return description; 147 } 148 149 /** 150 * Returns true if the specified object is a valid Key 151 * for this Value. 152 */ 153 public final boolean isCompatibleKey(Key k) { 154 return myKey == k; 155 } 156 157 /** 158 * The hash code for all SunHints.Value objects will be the same 159 * as the system identity code of the object as defined by the 160 * System.identityHashCode() method. 161 */ 162 public final int hashCode() { 163 return System.identityHashCode(this); 164 } 165 166 /** 167 * The equals method for all SunHints.Value objects will return 168 * the same result as the equality operator '=='. 169 */ 170 public final boolean equals(Object o) { 171 return this == o; 172 } 173 } 174 175 private static final int NUM_KEYS = 9; 176 private static final int VALS_PER_KEY = 8; 177 178 /** 179 * Rendering hint key and values 180 */ 181 @Native public static final int INTKEY_RENDERING = 0; 182 @Native public static final int INTVAL_RENDER_DEFAULT = 0; 183 @Native public static final int INTVAL_RENDER_SPEED = 1; 184 @Native public static final int INTVAL_RENDER_QUALITY = 2; 185 186 /** 187 * Antialiasing hint key and values 188 */ 189 @Native public static final int INTKEY_ANTIALIASING = 1; 190 @Native public static final int INTVAL_ANTIALIAS_DEFAULT = 0; 191 @Native public static final int INTVAL_ANTIALIAS_OFF = 1; 192 @Native public static final int INTVAL_ANTIALIAS_ON = 2; 193 194 /** 195 * Text antialiasing hint key and values 196 */ 197 @Native public static final int INTKEY_TEXT_ANTIALIASING = 2; 198 @Native public static final int INTVAL_TEXT_ANTIALIAS_DEFAULT = 0; 199 @Native public static final int INTVAL_TEXT_ANTIALIAS_OFF = 1; 200 @Native public static final int INTVAL_TEXT_ANTIALIAS_ON = 2; 201 @Native public static final int INTVAL_TEXT_ANTIALIAS_GASP = 3; 202 @Native public static final int INTVAL_TEXT_ANTIALIAS_LCD_HRGB = 4; 203 @Native public static final int INTVAL_TEXT_ANTIALIAS_LCD_HBGR = 5; 204 @Native public static final int INTVAL_TEXT_ANTIALIAS_LCD_VRGB = 6; 205 @Native public static final int INTVAL_TEXT_ANTIALIAS_LCD_VBGR = 7; 206 207 /** 208 * Font fractional metrics hint key and values 209 */ 210 @Native public static final int INTKEY_FRACTIONALMETRICS = 3; 211 @Native public static final int INTVAL_FRACTIONALMETRICS_DEFAULT = 0; 212 @Native public static final int INTVAL_FRACTIONALMETRICS_OFF = 1; 213 @Native public static final int INTVAL_FRACTIONALMETRICS_ON = 2; 214 215 /** 216 * Dithering hint key and values 217 */ 218 @Native public static final int INTKEY_DITHERING = 4; 219 @Native public static final int INTVAL_DITHER_DEFAULT = 0; 220 @Native public static final int INTVAL_DITHER_DISABLE = 1; 221 @Native public static final int INTVAL_DITHER_ENABLE = 2; 222 223 /** 224 * Interpolation hint key and values 225 */ 226 @Native public static final int INTKEY_INTERPOLATION = 5; 227 @Native public static final int INTVAL_INTERPOLATION_NEAREST_NEIGHBOR = 0; 228 @Native public static final int INTVAL_INTERPOLATION_BILINEAR = 1; 229 @Native public static final int INTVAL_INTERPOLATION_BICUBIC = 2; 230 231 /** 232 * Alpha interpolation hint key and values 233 */ 234 @Native public static final int INTKEY_ALPHA_INTERPOLATION = 6; 235 @Native public static final int INTVAL_ALPHA_INTERPOLATION_DEFAULT = 0; 236 @Native public static final int INTVAL_ALPHA_INTERPOLATION_SPEED = 1; 237 @Native public static final int INTVAL_ALPHA_INTERPOLATION_QUALITY = 2; 238 239 /** 240 * Color rendering hint key and values 241 */ 242 @Native public static final int INTKEY_COLOR_RENDERING = 7; 243 @Native public static final int INTVAL_COLOR_RENDER_DEFAULT = 0; 244 @Native public static final int INTVAL_COLOR_RENDER_SPEED = 1; 245 @Native public static final int INTVAL_COLOR_RENDER_QUALITY = 2; 246 247 /** 248 * Stroke normalization control hint key and values 249 */ 250 @Native public static final int INTKEY_STROKE_CONTROL = 8; 251 @Native public static final int INTVAL_STROKE_DEFAULT = 0; 252 @Native public static final int INTVAL_STROKE_NORMALIZE = 1; 253 @Native public static final int INTVAL_STROKE_PURE = 2; 254 255 /** 256 * LCD text contrast control hint key. 257 * Value is "100" to make discontiguous with the others which 258 * are all enumerative and are of a different class. 259 */ 260 @Native public static final int INTKEY_AATEXT_LCD_CONTRAST = 100; 261 262 /** 263 * Rendering hint key and value objects 264 */ 265 public static final Key KEY_RENDERING = 266 new SunHints.Key(SunHints.INTKEY_RENDERING, 267 "Global rendering quality key"); 268 public static final Object VALUE_RENDER_SPEED = 269 new SunHints.Value(KEY_RENDERING, 270 SunHints.INTVAL_RENDER_SPEED, 271 "Fastest rendering methods"); 272 public static final Object VALUE_RENDER_QUALITY = 273 new SunHints.Value(KEY_RENDERING, 274 SunHints.INTVAL_RENDER_QUALITY, 275 "Highest quality rendering methods"); 276 public static final Object VALUE_RENDER_DEFAULT = 277 new SunHints.Value(KEY_RENDERING, 278 SunHints.INTVAL_RENDER_DEFAULT, 279 "Default rendering methods"); 280 281 /** 282 * Antialiasing hint key and value objects 283 */ 284 public static final Key KEY_ANTIALIASING = 285 new SunHints.Key(SunHints.INTKEY_ANTIALIASING, 286 "Global antialiasing enable key"); 287 public static final Object VALUE_ANTIALIAS_ON = 288 new SunHints.Value(KEY_ANTIALIASING, 289 SunHints.INTVAL_ANTIALIAS_ON, 290 "Antialiased rendering mode"); 291 public static final Object VALUE_ANTIALIAS_OFF = 292 new SunHints.Value(KEY_ANTIALIASING, 293 SunHints.INTVAL_ANTIALIAS_OFF, 294 "Nonantialiased rendering mode"); 295 public static final Object VALUE_ANTIALIAS_DEFAULT = 296 new SunHints.Value(KEY_ANTIALIASING, 297 SunHints.INTVAL_ANTIALIAS_DEFAULT, 298 "Default antialiasing rendering mode"); 299 300 /** 301 * Text antialiasing hint key and value objects 302 */ 303 public static final Key KEY_TEXT_ANTIALIASING = 304 new SunHints.Key(SunHints.INTKEY_TEXT_ANTIALIASING, 305 "Text-specific antialiasing enable key"); 306 public static final Object VALUE_TEXT_ANTIALIAS_ON = 307 new SunHints.Value(KEY_TEXT_ANTIALIASING, 308 SunHints.INTVAL_TEXT_ANTIALIAS_ON, 309 "Antialiased text mode"); 310 public static final Object VALUE_TEXT_ANTIALIAS_OFF = 311 new SunHints.Value(KEY_TEXT_ANTIALIASING, 312 SunHints.INTVAL_TEXT_ANTIALIAS_OFF, 313 "Nonantialiased text mode"); 314 public static final Object VALUE_TEXT_ANTIALIAS_DEFAULT = 315 new SunHints.Value(KEY_TEXT_ANTIALIASING, 316 SunHints.INTVAL_TEXT_ANTIALIAS_DEFAULT, 317 "Default antialiasing text mode"); 318 public static final Object VALUE_TEXT_ANTIALIAS_GASP = 319 new SunHints.Value(KEY_TEXT_ANTIALIASING, 320 SunHints.INTVAL_TEXT_ANTIALIAS_GASP, 321 "gasp antialiasing text mode"); 322 public static final Object VALUE_TEXT_ANTIALIAS_LCD_HRGB = 323 new SunHints.Value(KEY_TEXT_ANTIALIASING, 324 SunHints.INTVAL_TEXT_ANTIALIAS_LCD_HRGB, 325 "LCD HRGB antialiasing text mode"); 326 public static final Object VALUE_TEXT_ANTIALIAS_LCD_HBGR = 327 new SunHints.Value(KEY_TEXT_ANTIALIASING, 328 SunHints.INTVAL_TEXT_ANTIALIAS_LCD_HBGR, 329 "LCD HBGR antialiasing text mode"); 330 public static final Object VALUE_TEXT_ANTIALIAS_LCD_VRGB = 331 new SunHints.Value(KEY_TEXT_ANTIALIASING, 332 SunHints.INTVAL_TEXT_ANTIALIAS_LCD_VRGB, 333 "LCD VRGB antialiasing text mode"); 334 public static final Object VALUE_TEXT_ANTIALIAS_LCD_VBGR = 335 new SunHints.Value(KEY_TEXT_ANTIALIASING, 336 SunHints.INTVAL_TEXT_ANTIALIAS_LCD_VBGR, 337 "LCD VBGR antialiasing text mode"); 338 339 /** 340 * Font fractional metrics hint key and value objects 341 */ 342 public static final Key KEY_FRACTIONALMETRICS = 343 new SunHints.Key(SunHints.INTKEY_FRACTIONALMETRICS, 344 "Fractional metrics enable key"); 345 public static final Object VALUE_FRACTIONALMETRICS_ON = 346 new SunHints.Value(KEY_FRACTIONALMETRICS, 347 SunHints.INTVAL_FRACTIONALMETRICS_ON, 348 "Fractional text metrics mode"); 349 public static final Object VALUE_FRACTIONALMETRICS_OFF = 350 new SunHints.Value(KEY_FRACTIONALMETRICS, 351 SunHints.INTVAL_FRACTIONALMETRICS_OFF, 352 "Integer text metrics mode"); 353 public static final Object VALUE_FRACTIONALMETRICS_DEFAULT = 354 new SunHints.Value(KEY_FRACTIONALMETRICS, 355 SunHints.INTVAL_FRACTIONALMETRICS_DEFAULT, 356 "Default fractional text metrics mode"); 357 358 /** 359 * Dithering hint key and value objects 360 */ 361 public static final Key KEY_DITHERING = 362 new SunHints.Key(SunHints.INTKEY_DITHERING, 363 "Dithering quality key"); 364 public static final Object VALUE_DITHER_ENABLE = 365 new SunHints.Value(KEY_DITHERING, 366 SunHints.INTVAL_DITHER_ENABLE, 367 "Dithered rendering mode"); 368 public static final Object VALUE_DITHER_DISABLE = 369 new SunHints.Value(KEY_DITHERING, 370 SunHints.INTVAL_DITHER_DISABLE, 371 "Nondithered rendering mode"); 372 public static final Object VALUE_DITHER_DEFAULT = 373 new SunHints.Value(KEY_DITHERING, 374 SunHints.INTVAL_DITHER_DEFAULT, 375 "Default dithering mode"); 376 377 /** 378 * Interpolation hint key and value objects 379 */ 380 public static final Key KEY_INTERPOLATION = 381 new SunHints.Key(SunHints.INTKEY_INTERPOLATION, 382 "Image interpolation method key"); 383 public static final Object VALUE_INTERPOLATION_NEAREST_NEIGHBOR = 384 new SunHints.Value(KEY_INTERPOLATION, 385 SunHints.INTVAL_INTERPOLATION_NEAREST_NEIGHBOR, 386 "Nearest Neighbor image interpolation mode"); 387 public static final Object VALUE_INTERPOLATION_BILINEAR = 388 new SunHints.Value(KEY_INTERPOLATION, 389 SunHints.INTVAL_INTERPOLATION_BILINEAR, 390 "Bilinear image interpolation mode"); 391 public static final Object VALUE_INTERPOLATION_BICUBIC = 392 new SunHints.Value(KEY_INTERPOLATION, 393 SunHints.INTVAL_INTERPOLATION_BICUBIC, 394 "Bicubic image interpolation mode"); 395 396 /** 397 * Alpha interpolation hint key and value objects 398 */ 399 public static final Key KEY_ALPHA_INTERPOLATION = 400 new SunHints.Key(SunHints.INTKEY_ALPHA_INTERPOLATION, 401 "Alpha blending interpolation method key"); 402 public static final Object VALUE_ALPHA_INTERPOLATION_SPEED = 403 new SunHints.Value(KEY_ALPHA_INTERPOLATION, 404 SunHints.INTVAL_ALPHA_INTERPOLATION_SPEED, 405 "Fastest alpha blending methods"); 406 public static final Object VALUE_ALPHA_INTERPOLATION_QUALITY = 407 new SunHints.Value(KEY_ALPHA_INTERPOLATION, 408 SunHints.INTVAL_ALPHA_INTERPOLATION_QUALITY, 409 "Highest quality alpha blending methods"); 410 public static final Object VALUE_ALPHA_INTERPOLATION_DEFAULT = 411 new SunHints.Value(KEY_ALPHA_INTERPOLATION, 412 SunHints.INTVAL_ALPHA_INTERPOLATION_DEFAULT, 413 "Default alpha blending methods"); 414 415 /** 416 * Color rendering hint key and value objects 417 */ 418 public static final Key KEY_COLOR_RENDERING = 419 new SunHints.Key(SunHints.INTKEY_COLOR_RENDERING, 420 "Color rendering quality key"); 421 public static final Object VALUE_COLOR_RENDER_SPEED = 422 new SunHints.Value(KEY_COLOR_RENDERING, 423 SunHints.INTVAL_COLOR_RENDER_SPEED, 424 "Fastest color rendering mode"); 425 public static final Object VALUE_COLOR_RENDER_QUALITY = 426 new SunHints.Value(KEY_COLOR_RENDERING, 427 SunHints.INTVAL_COLOR_RENDER_QUALITY, 428 "Highest quality color rendering mode"); 429 public static final Object VALUE_COLOR_RENDER_DEFAULT = 430 new SunHints.Value(KEY_COLOR_RENDERING, 431 SunHints.INTVAL_COLOR_RENDER_DEFAULT, 432 "Default color rendering mode"); 433 434 /** 435 * Stroke normalization control hint key and value objects 436 */ 437 public static final Key KEY_STROKE_CONTROL = 438 new SunHints.Key(SunHints.INTKEY_STROKE_CONTROL, 439 "Stroke normalization control key"); 440 public static final Object VALUE_STROKE_DEFAULT = 441 new SunHints.Value(KEY_STROKE_CONTROL, 442 SunHints.INTVAL_STROKE_DEFAULT, 443 "Default stroke normalization"); 444 public static final Object VALUE_STROKE_NORMALIZE = 445 new SunHints.Value(KEY_STROKE_CONTROL, 446 SunHints.INTVAL_STROKE_NORMALIZE, 447 "Normalize strokes for consistent rendering"); 448 public static final Object VALUE_STROKE_PURE = 449 new SunHints.Value(KEY_STROKE_CONTROL, 450 SunHints.INTVAL_STROKE_PURE, 451 "Pure stroke conversion for accurate paths"); 452 453 454 public static class LCDContrastKey extends Key { 455 456 public LCDContrastKey(int privatekey, String description) { 457 super(privatekey, description); 458 } 459 460 /** 461 * Returns true if the specified object is a valid value 462 * for this Key. The allowable range is 100 to 250. 463 */ 464 public final boolean isCompatibleValue(Object val) { 465 if (val instanceof Integer) { 466 int ival = ((Integer)val).intValue(); 467 return ival >= 100 && ival <= 250; 468 } 469 return false; 470 } 471 472 } 473 474 /** 475 * LCD text contrast hint key 476 */ 477 public static final RenderingHints.Key 478 KEY_TEXT_ANTIALIAS_LCD_CONTRAST = 479 new LCDContrastKey(SunHints.INTKEY_AATEXT_LCD_CONTRAST, 480 "Text-specific LCD contrast key"); 481 }