1. /*
  2. * @(#)FilteredImageSource.java 1.21 01/11/29
  3. *
  4. * Copyright 2002 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.21 11/29/01
  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. * @see ImageFilter
  41. * @see java.awt.Component#createImage
  42. */
  43. public FilteredImageSource(ImageProducer orig, ImageFilter imgf) {
  44. src = orig;
  45. filter = imgf;
  46. }
  47. private Hashtable proxies;
  48. /**
  49. * Adds an ImageConsumer to the list of consumers interested in
  50. * data for this image.
  51. * @see ImageConsumer
  52. */
  53. public synchronized void addConsumer(ImageConsumer ic) {
  54. if (proxies == null) {
  55. proxies = new Hashtable();
  56. }
  57. if (!proxies.containsKey(ic)) {
  58. ImageFilter imgf = filter.getFilterInstance(ic);
  59. proxies.put(ic, imgf);
  60. src.addConsumer(imgf);
  61. }
  62. }
  63. /**
  64. * Determines whether an ImageConsumer is on the list of consumers
  65. * currently interested in data for this image.
  66. * @return true if the ImageConsumer is on the list; false otherwise
  67. * @see ImageConsumer
  68. */
  69. public synchronized boolean isConsumer(ImageConsumer ic) {
  70. return (proxies != null && proxies.containsKey(ic));
  71. }
  72. /**
  73. * Removes an ImageConsumer from the list of consumers interested in
  74. * data for this image.
  75. * @see ImageConsumer
  76. */
  77. public synchronized void removeConsumer(ImageConsumer ic) {
  78. if (proxies != null) {
  79. ImageFilter imgf = (ImageFilter) proxies.get(ic);
  80. if (imgf != null) {
  81. src.removeConsumer(imgf);
  82. proxies.remove(ic);
  83. if (proxies.isEmpty()) {
  84. proxies = null;
  85. }
  86. }
  87. }
  88. }
  89. /**
  90. * Adds an ImageConsumer to the list of consumers interested in
  91. * data for this image, and immediately starts delivery of the
  92. * image data through the ImageConsumer interface.
  93. * @see ImageConsumer
  94. */
  95. public void startProduction(ImageConsumer ic) {
  96. if (proxies == null) {
  97. proxies = new Hashtable();
  98. }
  99. ImageFilter imgf = (ImageFilter) proxies.get(ic);
  100. if (imgf == null) {
  101. imgf = filter.getFilterInstance(ic);
  102. proxies.put(ic, imgf);
  103. }
  104. src.startProduction(imgf);
  105. }
  106. /**
  107. * Requests that a given ImageConsumer have the image data delivered
  108. * one more time in top-down, left-right order. The request is
  109. * handed to the ImageFilter for further processing, since the
  110. * ability to preserve the pixel ordering depends on the filter.
  111. * @see ImageConsumer
  112. */
  113. public void requestTopDownLeftRightResend(ImageConsumer ic) {
  114. if (proxies != null) {
  115. ImageFilter imgf = (ImageFilter) proxies.get(ic);
  116. if (imgf != null) {
  117. imgf.resendTopDownLeftRight(src);
  118. }
  119. }
  120. }
  121. }