1. /*
  2. * @(#)FilteredImageSource.java 1.25 03/01/23
  3. *
  4. * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
  5. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  6. */
  7. package java.awt.image;
  8. import java.awt.Image;
  9. import java.awt.image.ImageFilter;
  10. import java.awt.image.ImageConsumer;
  11. import java.awt.image.ImageProducer;
  12. import java.util.Hashtable;
  13. import java.awt.image.ColorModel;
  14. /**
  15. * This class is an implementation of the ImageProducer interface which
  16. * takes an existing image and a filter object and uses them to produce
  17. * image data for a new filtered version of the original image.
  18. * Here is an example which filters an image by swapping the red and
  19. * blue compents:
  20. * <pre>
  21. *
  22. * Image src = getImage("doc:///demo/images/duke/T1.gif");
  23. * ImageFilter colorfilter = new RedBlueSwapFilter();
  24. * Image img = createImage(new FilteredImageSource(src.getSource(),
  25. * colorfilter));
  26. *
  27. * </pre>
  28. *
  29. * @see ImageProducer
  30. *
  31. * @version 1.25 01/23/03
  32. * @author Jim Graham
  33. */
  34. public class FilteredImageSource implements ImageProducer {
  35. ImageProducer src;
  36. ImageFilter filter;
  37. /**
  38. * Constructs an ImageProducer object from an existing ImageProducer
  39. * and a filter object.
  40. * @param orig the specified <code>ImageProducer</code>
  41. * @param imgf the specified <code>ImageFilter</code>
  42. * @see ImageFilter
  43. * @see java.awt.Component#createImage
  44. */
  45. public FilteredImageSource(ImageProducer orig, ImageFilter imgf) {
  46. src = orig;
  47. filter = imgf;
  48. }
  49. private Hashtable proxies;
  50. /**
  51. * Adds an ImageConsumer to the list of consumers interested in
  52. * data for this image.
  53. * @see ImageConsumer
  54. */
  55. public synchronized void addConsumer(ImageConsumer ic) {
  56. if (proxies == null) {
  57. proxies = new Hashtable();
  58. }
  59. if (!proxies.containsKey(ic)) {
  60. ImageFilter imgf = filter.getFilterInstance(ic);
  61. proxies.put(ic, imgf);
  62. src.addConsumer(imgf);
  63. }
  64. }
  65. /**
  66. * Determines whether an ImageConsumer is on the list of consumers
  67. * currently interested in data for this image.
  68. * @param ic the specified <code>ImageConsumer</code>
  69. * @return true if the ImageConsumer is on the list; false otherwise
  70. * @see ImageConsumer
  71. */
  72. public synchronized boolean isConsumer(ImageConsumer ic) {
  73. return (proxies != null && proxies.containsKey(ic));
  74. }
  75. /**
  76. * Removes an ImageConsumer from the list of consumers interested in
  77. * data for this image.
  78. * @see ImageConsumer
  79. */
  80. public synchronized void removeConsumer(ImageConsumer ic) {
  81. if (proxies != null) {
  82. ImageFilter imgf = (ImageFilter) proxies.get(ic);
  83. if (imgf != null) {
  84. src.removeConsumer(imgf);
  85. proxies.remove(ic);
  86. if (proxies.isEmpty()) {
  87. proxies = null;
  88. }
  89. }
  90. }
  91. }
  92. /**
  93. * Adds an ImageConsumer to the list of consumers interested in
  94. * data for this image, and immediately starts delivery of the
  95. * image data through the ImageConsumer interface.
  96. * @see ImageConsumer
  97. */
  98. public void startProduction(ImageConsumer ic) {
  99. if (proxies == null) {
  100. proxies = new Hashtable();
  101. }
  102. ImageFilter imgf = (ImageFilter) proxies.get(ic);
  103. if (imgf == null) {
  104. imgf = filter.getFilterInstance(ic);
  105. proxies.put(ic, imgf);
  106. }
  107. src.startProduction(imgf);
  108. }
  109. /**
  110. * Requests that a given ImageConsumer have the image data delivered
  111. * one more time in top-down, left-right order. The request is
  112. * handed to the ImageFilter for further processing, since the
  113. * ability to preserve the pixel ordering depends on the filter.
  114. * @see ImageConsumer
  115. */
  116. public void requestTopDownLeftRightResend(ImageConsumer ic) {
  117. if (proxies != null) {
  118. ImageFilter imgf = (ImageFilter) proxies.get(ic);
  119. if (imgf != null) {
  120. imgf.resendTopDownLeftRight(src);
  121. }
  122. }
  123. }
  124. }