@Override
   public boolean inverse(SliceIntArray src, SliceIntArray dst)
   {
      if ((!SliceIntArray.isValid(src)) || (!SliceIntArray.isValid(dst)))
         return false;

      final int count = this.dim * this.dim;
      
      if (src.length != count)
         return false;

      if (dst.array.length < count)
         return false;
      
      if (dst.index + count > dst.array.length)
         return false;         
      
      final int d2 = this.dim >> 1;
      SliceIntArray sa = new SliceIntArray(this.buffer, d2*d2, 0);
      
      // Copy and compact LL band
      for (int j=0; j<d2; j++)
         System.arraycopy(src.array, j*this.dim, this.buffer, j*d2, d2);
    
      // Reverse DCT of LL band
      if (this.dct.inverse(sa, sa) == false)
         return false;

      // Copy and expand DCT results for LL band
      for (int j=0; j<d2; j++)
         System.arraycopy(this.buffer, j*d2, src.array, j*this.dim, d2);
     
      return this.dwt.inverse(src, dst);
   }