home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1998 February / VPR9802A.ISO / APP_DEMO / VC / MAIN.BIN / ReplicateScaleFilter.java < prev    next >
Text File  |  1997-10-27  |  6KB  |  184 lines

  1. /*
  2.  * @(#)ReplicateScaleFilter.java    1.2 96/11/23
  3.  * 
  4.  * Copyright (c) 1995, 1996 Sun Microsystems, Inc. All Rights Reserved.
  5.  * 
  6.  * This software is the confidential and proprietary information of Sun
  7.  * Microsystems, Inc. ("Confidential Information").  You shall not
  8.  * disclose such Confidential Information and shall use it only in
  9.  * accordance with the terms of the license agreement you entered into
  10.  * with Sun.
  11.  * 
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
  13.  * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  14.  * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  15.  * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
  16.  * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
  17.  * THIS SOFTWARE OR ITS DERIVATIVES.
  18.  * 
  19.  * CopyrightVersion 1.1_beta
  20.  * 
  21.  */
  22.  
  23. package java.awt.image;
  24.  
  25. import java.awt.image.ImageConsumer;
  26. import java.awt.image.ColorModel;
  27. import java.util.Hashtable;
  28. import java.awt.Rectangle;
  29.  
  30. /**
  31.  * An ImageFilter class for scaling images using the simplest algorithm.
  32.  * This class extends the basic ImageFilter Class to scale an existing
  33.  * image and provide a source for a new image containing the resampled
  34.  * image.  The pixels in the source image are sampled to produce pixels
  35.  * for an image of the specified size by replicating rows and columns of
  36.  * pixels to scale up or omitting rows and columns of pixels to scale
  37.  * down.
  38.  * It is meant to be used in conjunction with a FilteredImageSource
  39.  * object to produce scaled versions of existing images.
  40.  *
  41.  * @see FilteredImageSource
  42.  * @see ImageFilter
  43.  *
  44.  * @version    1.2 11/23/96
  45.  * @author     Jim Graham
  46.  */
  47. public class ReplicateScaleFilter extends ImageFilter {
  48.     protected int srcWidth;
  49.     protected int srcHeight;
  50.     protected int destWidth;
  51.     protected int destHeight;
  52.  
  53.     protected int srcrows[];
  54.     protected int srccols[];
  55.     protected Object outpixbuf;
  56.  
  57.     /**
  58.      * Constructs a ReplicateScaleFilter that scales the pixels from
  59.      * its source Image as specified by the width and height parameters.
  60.      * @param width the target width to scale the image
  61.      * @param height the target height to scale the image
  62.      */
  63.     public ReplicateScaleFilter(int width, int height) {
  64.     destWidth = width;
  65.     destHeight = height;
  66.     }
  67.  
  68.     /**
  69.      * Passes along the properties from the source object after adding a
  70.      * property indicating the scale applied.
  71.      */
  72.     public void setProperties(Hashtable props) {
  73.     props = (Hashtable) props.clone();
  74.     String key = "rescale";
  75.     String val = destWidth + "x" + destHeight;
  76.     Object o = props.get(key);
  77.     if (o != null && o instanceof String) {
  78.         val = ((String) o) + ", " + val;
  79.     }
  80.     props.put(key, val);
  81.     super.setProperties(props);
  82.     }
  83.  
  84.     /**
  85.      * Override the dimensions of the source image and pass the dimensions
  86.      * of the new scaled size to the ImageConsumer.
  87.      * @see ImageConsumer
  88.      */
  89.     public void setDimensions(int w, int h) {
  90.     srcWidth = w;
  91.     srcHeight = h;
  92.     if (destWidth < 0) {
  93.         if (destHeight < 0) {
  94.         destWidth = srcWidth;
  95.         destHeight = srcHeight;
  96.         } else {
  97.         destWidth = srcWidth * destHeight / srcHeight;
  98.         }
  99.     } else if (destHeight < 0) {
  100.         destHeight = srcHeight * destWidth / srcWidth;
  101.     }
  102.     consumer.setDimensions(destWidth, destHeight);
  103.     }
  104.  
  105.     private void calculateMaps() {
  106.     srcrows = new int[destHeight + 1];
  107.     for (int y = 0; y <= destHeight; y++) {
  108.         srcrows[y] = (2 * y * srcHeight + srcHeight) / (2 * destHeight);
  109.     }
  110.     srccols = new int[destWidth + 1];
  111.     for (int x = 0; x <= destWidth; x++) {
  112.         srccols[x] = (2 * x * srcWidth + srcWidth) / (2 * destWidth);
  113.     }
  114.     }
  115.    
  116.     /**
  117.      * Choose which rows and columns of the delivered byte pixels are
  118.      * needed for the destination scaled image and pass through just
  119.      * those rows and columns that are needed, replicated as necessary.
  120.      */
  121.     public void setPixels(int x, int y, int w, int h,
  122.               ColorModel model, byte pixels[], int off,
  123.               int scansize) {
  124.     if (srcrows == null || srccols == null) {
  125.         calculateMaps();
  126.     }
  127.     int sx, sy;
  128.     int dx1 = (2 * x * destWidth + srcWidth - 1) / (2 * srcWidth);
  129.     int dy1 = (2 * y * destHeight + srcHeight - 1) / (2 * srcHeight);
  130.     byte outpix[];
  131.     if (outpixbuf != null && outpixbuf instanceof byte[]) {
  132.         outpix = (byte[]) outpixbuf;
  133.     } else {
  134.         outpix = new byte[destWidth];
  135.         outpixbuf = outpix;
  136.     }
  137.     for (int dy = dy1; (sy = srcrows[dy]) < y + h; dy++) {
  138.         int srcoff = off + scansize * (sy - y);
  139.         int dx;
  140.         for (dx = dx1; (sx = srccols[dx]) < x + w; dx++) {
  141.         outpix[dx] = pixels[srcoff + sx];
  142.         }
  143.         if (dx > dx1) {
  144.         consumer.setPixels(dx1, dy, dx - dx1, 1,
  145.                    model, outpix, dx1, destWidth);
  146.         }
  147.     }
  148.     }
  149.  
  150.     /**
  151.      * Choose which rows and columns of the delivered int pixels are
  152.      * needed for the destination scaled image and pass through just
  153.      * those rows and columns that are needed, replicated as necessary.
  154.      */
  155.     public void setPixels(int x, int y, int w, int h,
  156.               ColorModel model, int pixels[], int off,
  157.               int scansize) {
  158.     if (srcrows == null || srccols == null) {
  159.         calculateMaps();
  160.     }
  161.     int sx, sy;
  162.     int dx1 = (2 * x * destWidth + srcWidth - 1) / (2 * srcWidth);
  163.     int dy1 = (2 * y * destHeight + srcHeight - 1) / (2 * srcHeight);
  164.     int outpix[];
  165.     if (outpixbuf != null && outpixbuf instanceof int[]) {
  166.         outpix = (int[]) outpixbuf;
  167.     } else {
  168.         outpix = new int[destWidth];
  169.         outpixbuf = outpix;
  170.     }
  171.     for (int dy = dy1; (sy = srcrows[dy]) < y + h; dy++) {
  172.         int srcoff = off + scansize * (sy - y);
  173.         int dx;
  174.         for (dx = dx1; (sx = srccols[dx]) < x + w; dx++) {
  175.         outpix[dx] = pixels[srcoff + sx];
  176.         }
  177.         if (dx > dx1) {
  178.         consumer.setPixels(dx1, dy, dx - dx1, 1,
  179.                    model, outpix, dx1, destWidth);
  180.         }
  181.     }
  182.     }
  183. }
  184.