home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / browser / ns405lyc / nav40.z / java40.jar / sun / awt / image / PixelStore.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-03-24  |  3.6 KB  |  279 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.numlines = this.height;
  110.          this.hints = 30;
  111.          this.availinfo |= 32;
  112.       }
  113.  
  114.    }
  115.  
  116.    public synchronized int getWidth() {
  117.       return this.width;
  118.    }
  119.  
  120.    public synchronized int getHeight() {
  121.       return this.height;
  122.    }
  123.  
  124.    public synchronized ColorModel getColorModel() {
  125.       return this.colormodel;
  126.    }
  127.  
  128.    public synchronized int getBitState() {
  129.       if (this.bit_state == 1 && this.numlines > 0) {
  130.          ((Ref)this).get();
  131.       }
  132.  
  133.       return this.bit_state;
  134.    }
  135.  
  136.    abstract void replayLines(ImageConsumer var1, int var2, int var3, Object var4);
  137.  
  138.    public synchronized boolean replay(ImageProducer var1, ImageConsumer var2) {
  139.       return this.replay(var1, var2, true);
  140.    }
  141.  
  142.    public synchronized boolean replay(ImageProducer var1, ImageConsumer var2, boolean var3) {
  143.       if (var3 && (this.availinfo & 1) != 0 && (this.availinfo & 2) != 0) {
  144.          var2.setDimensions(this.width, this.height);
  145.          if (!var1.isConsumer(var2)) {
  146.             return true;
  147.          }
  148.       }
  149.  
  150.       if (var3 && (this.availinfo & 4) != 0) {
  151.          var2.setProperties(this.properties);
  152.       }
  153.  
  154.       if (var3 && this.colormodel != null) {
  155.          var2.setColorModel(this.colormodel);
  156.          if (!var1.isConsumer(var2)) {
  157.             return true;
  158.          }
  159.       }
  160.  
  161.       if (this.hints != 0) {
  162.          var2.setHints(this.hints & 30);
  163.          if (!var1.isConsumer(var2)) {
  164.             return true;
  165.          }
  166.       }
  167.  
  168.       Object[] var4 = null;
  169.       if (this.bit_state == 1 && this.numlines > 0) {
  170.          var4 = ((Ref)this).get();
  171.       }
  172.  
  173.       if (this.bit_state == 2) {
  174.          return false;
  175.       } else {
  176.          Thread var5 = Thread.currentThread();
  177.          if (ImageFetcher.isFetcher(var5) && var5.getPriority() > 5) {
  178.             SecurityManager.enablePrivilege("UniversalThreadAccess");
  179.             var5.setPriority(5);
  180.             SecurityManager.revertPrivilege();
  181.          }
  182.  
  183.          if (var4 != null) {
  184.             Object var6 = null;
  185.             int var7 = 0;
  186.  
  187.             for(int var8 = 0; var8 < this.numlines; ++var8) {
  188.                if (this.seen != null && !this.seen[var8]) {
  189.                   if (var6 != null) {
  190.                      this.replayLines(var2, var8 - var7, var7, var6);
  191.                      if (!var1.isConsumer(var2)) {
  192.                         return true;
  193.                      }
  194.  
  195.                      var6 = null;
  196.                      var7 = 0;
  197.                   }
  198.                } else {
  199.                   Object var9 = var4[var8];
  200.                   if (var6 != var9 && var6 != null) {
  201.                      this.replayLines(var2, var8 - var7, var7, var6);
  202.                      if (!var1.isConsumer(var2)) {
  203.                         return true;
  204.                      }
  205.  
  206.                      var7 = 0;
  207.                   }
  208.  
  209.                   var6 = var9;
  210.                   ++var7;
  211.                }
  212.             }
  213.  
  214.             if (var6 != null) {
  215.                this.replayLines(var2, this.numlines - var7, var7, var6);
  216.                if (!var1.isConsumer(var2)) {
  217.                   return true;
  218.                }
  219.             }
  220.          }
  221.  
  222.          if (var3 && this.bit_state == 1 && (this.availinfo & 32) != 0) {
  223.             var2.imageComplete(3);
  224.          }
  225.  
  226.          return true;
  227.       }
  228.    }
  229.  
  230.    abstract Object allocateLines(int var1);
  231.  
  232.    public Object reconstitute() {
  233.       Object[] var1 = null;
  234.       if (this.bit_state == 0) {
  235.          if ((this.availinfo & 2) == 0 || (this.availinfo & 1) == 0 || this.colormodel == null) {
  236.             return null;
  237.          }
  238.  
  239.          this.bit_state = 1;
  240.          var1 = new Object[this.height];
  241.          this.offsets = new int[this.height];
  242.          int var2 = 0;
  243.  
  244.          while(var2 < this.height) {
  245.             int var3 = this.height - var2;
  246.             Object var4 = null;
  247.  
  248.             while(var4 == null && var3 > 0) {
  249.                try {
  250.                   var4 = this.allocateLines(var3);
  251.                   if (var4 == null) {
  252.                      break;
  253.                   }
  254.                } catch (OutOfMemoryError var6) {
  255.                   var4 = null;
  256.                   var3 /= 2;
  257.                }
  258.             }
  259.  
  260.             if (var4 == null) {
  261.                this.bit_state = 2;
  262.                return null;
  263.             }
  264.  
  265.             for(int var5 = 0; var3 > 0; --var3) {
  266.                var1[var2] = var4;
  267.                this.offsets[var2] = var5;
  268.                var5 += this.width;
  269.                ++var2;
  270.             }
  271.          }
  272.       } else if (this.bit_state == 1) {
  273.          this.bit_state = 2;
  274.       }
  275.  
  276.       return var1;
  277.    }
  278. }
  279.