home *** CD-ROM | disk | FTP | other *** search
/ Symantec Visual Cafe for Java 2.5 / symantec-visual-cafe-2.5-database-dev-edition.iso / VPage / Java.bin / CLASSES.ZIP / sun / awt / image / PixelStore.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-07-08  |  4.2 KB  |  276 lines

  1. package sun.awt.image;
  2.  
  3. import java.awt.image.ColorModel;
  4. import java.awt.image.ImageConsumer;
  5. import java.awt.image.ImageProducer;
  6. import java.util.Hashtable;
  7. import sun.misc.Ref;
  8.  
  9. public abstract class PixelStore extends Ref {
  10.    int width;
  11.    int height;
  12.    ColorModel colormodel;
  13.    Hashtable properties;
  14.    boolean[] seen;
  15.    int numlines;
  16.    int availinfo;
  17.    int hints;
  18.    static final int NO_BITS_YET = 0;
  19.    static final int BITS_ALLOCATED = 1;
  20.    static final int BITS_LOST = 2;
  21.    int bit_state = 0;
  22.    int[] offsets;
  23.  
  24.    public PixelStore() {
  25.    }
  26.  
  27.    public PixelStore(int var1, int var2) {
  28.       this.setDimensions(var1, var2);
  29.    }
  30.  
  31.    public PixelStore(int var1, int var2, ColorModel var3) {
  32.       this.setDimensions(var1, var2);
  33.       this.setColorModel(var3);
  34.    }
  35.  
  36.    public synchronized void setDimensions(int var1, int var2) {
  37.       this.width = var1;
  38.       this.height = var2;
  39.       this.availinfo |= 3;
  40.    }
  41.  
  42.    public synchronized void setProperties(Hashtable var1) {
  43.       this.properties = var1;
  44.       this.availinfo |= 4;
  45.    }
  46.  
  47.    public synchronized void setColorModel(ColorModel var1) {
  48.       this.colormodel = var1;
  49.    }
  50.  
  51.    public synchronized void setHints(int var1) {
  52.       this.hints = var1;
  53.    }
  54.  
  55.    protected void recordPixels(int var1, int var2, int var3, int var4) {
  56.       this.numlines = Math.max(this.numlines, var2 + var4);
  57.       if ((this.hints & 2) == 0) {
  58.          if (this.seen == null) {
  59.             this.seen = new boolean[this.height];
  60.          }
  61.  
  62.          for(int var5 = 0; var5 < var4; ++var5) {
  63.             this.seen[var2 + var5] = true;
  64.          }
  65.       }
  66.  
  67.    }
  68.  
  69.    public synchronized boolean setPixels(int var1, int var2, int var3, int var4, byte[] var5, int var6, int var7) {
  70.       this.recordPixels(var1, var2, var3, var4);
  71.       Object[] var8 = ((Ref)this).get();
  72.       if (var8 != null) {
  73.          int var9 = var6;
  74.  
  75.          for(int var10 = var2; var10 < var2 + var4; ++var10) {
  76.             byte[] var11 = (byte[])var8[var10];
  77.             int var12 = this.offsets[var10] + var1;
  78.             System.arraycopy(var5, var9, var11, var12, var3);
  79.             var9 += var7;
  80.          }
  81.  
  82.          this.availinfo |= 8;
  83.       }
  84.  
  85.       return var8 != null;
  86.    }
  87.  
  88.    public synchronized boolean setPixels(int var1, int var2, int var3, int var4, int[] var5, int var6, int var7) {
  89.       this.recordPixels(var1, var2, var3, var4);
  90.       Object[] var8 = ((Ref)this).get();
  91.       if (var8 != null) {
  92.          int var9 = var6;
  93.  
  94.          for(int var10 = var2; var10 < var2 + var4; ++var10) {
  95.             int[] var11 = (int[])var8[var10];
  96.             int var12 = this.offsets[var10] + var1;
  97.             System.arraycopy(var5, var9, var11, var12, var3);
  98.             var9 += var7;
  99.          }
  100.  
  101.          this.availinfo |= 8;
  102.       }
  103.  
  104.       return var8 != null;
  105.    }
  106.  
  107.    public synchronized void imageComplete() {
  108.       if (((Ref)this).get() != null && this.bit_state == 1) {
  109.          this.hints = 30;
  110.          this.availinfo |= 32;
  111.       }
  112.  
  113.    }
  114.  
  115.    public synchronized int getWidth() {
  116.       return this.width;
  117.    }
  118.  
  119.    public synchronized int getHeight() {
  120.       return this.height;
  121.    }
  122.  
  123.    public synchronized ColorModel getColorModel() {
  124.       return this.colormodel;
  125.    }
  126.  
  127.    public synchronized int getBitState() {
  128.       if (this.bit_state == 1 && this.numlines > 0) {
  129.          ((Ref)this).get();
  130.       }
  131.  
  132.       return this.bit_state;
  133.    }
  134.  
  135.    abstract void replayLines(ImageConsumer var1, int var2, int var3, Object var4);
  136.  
  137.    public synchronized boolean replay(ImageProducer var1, ImageConsumer var2) {
  138.       return this.replay(var1, var2, true);
  139.    }
  140.  
  141.    public synchronized boolean replay(ImageProducer var1, ImageConsumer var2, boolean var3) {
  142.       if (var3 && (this.availinfo & 1) != 0 && (this.availinfo & 2) != 0) {
  143.          var2.setDimensions(this.width, this.height);
  144.          if (!var1.isConsumer(var2)) {
  145.             return true;
  146.          }
  147.       }
  148.  
  149.       if (var3 && (this.availinfo & 4) != 0) {
  150.          var2.setProperties(this.properties);
  151.       }
  152.  
  153.       if (var3 && this.colormodel != null) {
  154.          var2.setColorModel(this.colormodel);
  155.          if (!var1.isConsumer(var2)) {
  156.             return true;
  157.          }
  158.       }
  159.  
  160.       if (this.hints != 0) {
  161.          var2.setHints(this.hints & 30);
  162.          if (!var1.isConsumer(var2)) {
  163.             return true;
  164.          }
  165.       }
  166.  
  167.       Object[] var4 = null;
  168.       if (this.bit_state == 1 && this.numlines > 0) {
  169.          var4 = ((Ref)this).get();
  170.       }
  171.  
  172.       if (this.bit_state == 2) {
  173.          return false;
  174.       } else {
  175.          Thread var5 = Thread.currentThread();
  176.          if (ImageFetcher.isFetcher(var5) && var5.getPriority() > 3) {
  177.             var5.setPriority(3);
  178.          }
  179.  
  180.          if (var4 != null) {
  181.             Object var6 = null;
  182.             int var7 = 0;
  183.  
  184.             for(int var8 = 0; var8 < this.numlines; ++var8) {
  185.                if (this.seen != null && !this.seen[var8]) {
  186.                   if (var6 != null) {
  187.                      this.replayLines(var2, var8 - var7, var7, var6);
  188.                      if (!var1.isConsumer(var2)) {
  189.                         return true;
  190.                      }
  191.  
  192.                      var6 = null;
  193.                      var7 = 0;
  194.                   }
  195.                } else {
  196.                   Object var9 = var4[var8];
  197.                   if (var6 != var9 && var6 != null) {
  198.                      this.replayLines(var2, var8 - var7, var7, var6);
  199.                      if (!var1.isConsumer(var2)) {
  200.                         return true;
  201.                      }
  202.  
  203.                      var7 = 0;
  204.                   }
  205.  
  206.                   var6 = var9;
  207.                   ++var7;
  208.                }
  209.             }
  210.  
  211.             if (var6 != null) {
  212.                this.replayLines(var2, this.numlines - var7, var7, var6);
  213.                if (!var1.isConsumer(var2)) {
  214.                   return true;
  215.                }
  216.             }
  217.          }
  218.  
  219.          if (var3 && this.bit_state == 1 && (this.availinfo & 32) != 0) {
  220.             var2.imageComplete(3);
  221.          }
  222.  
  223.          return true;
  224.       }
  225.    }
  226.  
  227.    abstract Object allocateLines(int var1);
  228.  
  229.    public Object reconstitute() {
  230.       Object[] var1 = null;
  231.       if (this.bit_state == 0) {
  232.          if ((this.availinfo & 2) == 0 || (this.availinfo & 1) == 0 || this.colormodel == null) {
  233.             return null;
  234.          }
  235.  
  236.          this.bit_state = 1;
  237.          var1 = new Object[this.height];
  238.          this.offsets = new int[this.height];
  239.          int var2 = 0;
  240.  
  241.          while(var2 < this.height) {
  242.             int var3 = this.height - var2;
  243.             Object var4 = null;
  244.  
  245.             while(var4 == null && var3 > 0) {
  246.                try {
  247.                   var4 = this.allocateLines(var3);
  248.                   if (var4 == null) {
  249.                      break;
  250.                   }
  251.                } catch (OutOfMemoryError var6) {
  252.                   var4 = null;
  253.                   var3 /= 2;
  254.                }
  255.             }
  256.  
  257.             if (var4 == null) {
  258.                this.bit_state = 2;
  259.                return null;
  260.             }
  261.  
  262.             for(int var5 = 0; var3 > 0; --var3) {
  263.                var1[var2] = var4;
  264.                this.offsets[var2] = var5;
  265.                var5 += this.width;
  266.                ++var2;
  267.             }
  268.          }
  269.       } else if (this.bit_state == 1) {
  270.          this.bit_state = 2;
  271.       }
  272.  
  273.       return var1;
  274.    }
  275. }
  276.