home *** CD-ROM | disk | FTP | other *** search
/ Java 1.2 How-To / JavaHowTo.iso / 3rdParty / Gamelication / com / next / gt / DirtyRectSet.java < prev    next >
Text File  |  1998-04-15  |  2KB  |  121 lines

  1. /**
  2.  *
  3.  * DirtyRectSet.java
  4.  * Mar 15/1996
  5.  *
  6.  *
  7. */
  8.  
  9.  
  10. package com.next.gt;
  11.  
  12. import java.util.Vector;
  13. import java.awt.Rectangle;
  14.  
  15.  
  16. public class DirtyRectSet extends java.lang.Object {
  17.  
  18.    private Vector rects;
  19.  
  20.    public DirtyRectSet() { rects = new Vector(); }
  21.    public DirtyRectSet(int i) { rects = new Vector(i); } 
  22.  
  23.    public void addRect (Rectangle r)
  24.    {
  25.           int size = rects.size ();
  26.  
  27.         for (int index = 0; index < size; index++)
  28.         {
  29.             Rectangle curr = (Rectangle)rects.elementAt (index);
  30.  
  31.             if (r.x > curr.x)
  32.             {
  33.                 rects.insertElementAt (r, index);
  34.                 return;
  35.             } 
  36.         }
  37.         
  38.         rects.addElement (r);
  39.  
  40.    }
  41.  
  42.    final int GLUE = 64;
  43.  
  44.    final private boolean closeEnough (Rectangle r1, Rectangle r2)
  45.    {
  46.          boolean result;
  47.  
  48.       r1.width += GLUE;
  49.       r1.height += GLUE;
  50.       r2.width += GLUE;
  51.       r2.height += GLUE;
  52.  
  53.       result = r1.intersects (r2);
  54.  
  55.       r1.width -= GLUE;
  56.       r1.height -= GLUE;
  57.       r2.width -= GLUE;
  58.       r2.height -= GLUE;
  59.  
  60.       return result;
  61.    }
  62.  
  63.    private void collapse ()
  64.    {
  65.         int index = 0;
  66.  
  67.         if (rects.size () < 2)
  68.             return;
  69.  
  70.         Rectangle r1 = (Rectangle)rects.elementAt (index);
  71.         Rectangle r2 = (Rectangle)rects.elementAt (index+1);
  72.  
  73.         while (true)
  74.         {
  75.             // collapse R1 and R2
  76.             if (closeEnough (r1, r2))
  77.             {
  78.                 r1 = r1.union (r2);
  79.  
  80.                 rects.setElementAt (r1, index);
  81.                 rects.removeElementAt (index+1);
  82.  
  83.                 if (index+1 < rects.size ())
  84.                     r2 = (Rectangle)rects.elementAt (index+1);
  85.                 else
  86.                     return;
  87.             }
  88.  
  89.             // go to next pair
  90.             else if (index+2 < rects.size ())
  91.             {
  92.                 r1 = r2;
  93.                 r2 = (Rectangle)rects.elementAt (index+2);
  94.                 index += 1;
  95.             }
  96.  
  97.             // done
  98.             else
  99.             {
  100.                 return;
  101.             }
  102.         }
  103.     }
  104.  
  105.  
  106.     public void drawImage (java.awt.Graphics g, java.awt.Image img,
  107.                     Gamelication owner)
  108.     {
  109.         collapse ();
  110.  
  111.         for (int i= 0; i< rects.size (); i++) {
  112.             Rectangle r = (Rectangle)rects.elementAt(i);
  113.               java.awt.Graphics g2 = g.create (r.x, r.y, r.width, r.height);
  114.               g2.drawImage(img, -r.x, -r.y, owner);
  115.               g2.dispose ();
  116.  
  117.         }
  118.     }
  119.  
  120. }
  121.