1. /*
  2. * @(#)FilteredImageSource.java 1.22 00/02/02
  3. *
  4. * Copyright 1995-2000 Sun Microsystems, Inc. All Rights Reserved.
  5. *
  6. * This software is the proprietary information of Sun Microsystems, Inc.
  7. * Use is subject to license terms.
  8. *
  9. */
  10. package java.awt.image;
  11. import java.awt.Image;
  12. import java.awt.image.ImageFilter;
  13. import java.awt.image.ImageConsumer;
  14. import java.awt.image.ImageProducer;
  15. import java.util.Hashtable;
  16. import java.awt.image.ColorModel;
  17. /**
  18. * This class is an implementation of the ImageProducer interface which
  19. * takes an existing image and a filter object and uses them to produce
  20. * image data for a new filtered version of the original image.
  21. * Here is an example which filters an image by swapping the red and
  22. * blue compents:
  23. * <pre>
  24. *
  25. * Image src = getImage("doc:///demo/images/duke/T1.gif");
  26. * ImageFilter colorfilter = new RedBlueSwapFilter();
  27. * Image img = createImage(new FilteredImageSource(src.getSource(),
  28. * colorfilter));
  29. *
  30. * </pre>
  31. *
  32. * @see ImageProducer
  33. *
  34. * @version 1.22 02/02/00
  35. * @author Jim Graham
  36. */
  37. public class FilteredImageSource implements ImageProducer {
  38. ImageProducer src;
  39. ImageFilter filter;
  40. /**
  41. * Constructs an ImageProducer object from an existing ImageProducer
  42. * and a filter object.
  43. * @see ImageFilter
  44. * @see java.awt.Component#createImage
  45. */
  46. public FilteredImageSource(ImageProducer orig, ImageFilter imgf) {
  47. src = orig;
  48. filter = imgf;
  49. }
  50. private Hashtable proxies;
  51. /**
  52. * Adds an ImageConsumer to the list of consumers interested in
  53. * data for this image.
  54. * @see ImageConsumer
  55. */
  56. public synchronized void addConsumer(ImageConsumer ic) {
  57. if (proxies == null) {
  58. proxies = new Hashtable();
  59. }
  60. if (!proxies.containsKey(ic)) {
  61. ImageFilter imgf = filter.getFilterInstance(ic);
  62. proxies.put(ic, imgf);
  63. src.addConsumer(imgf);
  64. }
  65. }
  66. /**
  67. * Determines whether an ImageConsumer is on the list of consumers
  68. * currently interested in data for this image.
  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. }