private void hsmooth64(LongArrayPointer a,int nxtop,int nytop){
  int i, j;
  int ny2, s10, s00;
  long hm, h0, hp, hmm, hpm, hmp, hpp, hx2, hy2, diff, dmax, dmin, s, smax, m1, m2;
  smax=this.scale >> 1;
  if (smax <= 0) {
    return;
  }
  ny2=this.ny << 1;
  for (i=2; i < nxtop - 2; i+=2) {
    s00=this.ny * i;
    s10=s00 + this.ny;
    for (j=0; j < nytop; j+=2) {
      hm=a.get(s00 - ny2);
      h0=a.get(s00);
      hp=a.get(s00 + ny2);
      diff=hp - hm;
      dmax=Math.max(Math.min(hp - h0,h0 - hm),0) << 2;
      dmin=Math.min(Math.max(hp - h0,h0 - hm),0) << 2;
      if (dmin < dmax) {
        diff=Math.max(Math.min(diff,dmax),dmin);
        s=diff - (a.get(s10) << N03);
        s=s >= 0 ? s >> N03 : s + N07 >> N03;
        s=Math.max(Math.min(s,smax),-smax);
        a.set(s10,a.get(s10) + s);
      }
      s00+=2;
      s10+=2;
    }
  }
  for (i=0; i < nxtop; i+=2) {
    s00=this.ny * i + 2;
    s10=s00 + this.ny;
    for (j=2; j < nytop - 2; j+=2) {
      hm=a.get(s00 - 2);
      h0=a.get(s00);
      hp=a.get(s00 + 2);
      diff=hp - hm;
      dmax=Math.max(Math.min(hp - h0,h0 - hm),0) << 2;
      dmin=Math.min(Math.max(hp - h0,h0 - hm),0) << 2;
      if (dmin < dmax) {
        diff=Math.max(Math.min(diff,dmax),dmin);
        s=diff - (a.get(s00 + 1) << N03);
        s=s >= 0 ? s >> N03 : s + N07 >> N03;
        s=Math.max(Math.min(s,smax),-smax);
        a.set(s00 + 1,a.get(s00 + 1) + s);
      }
      s00+=2;
      s10+=2;
    }
  }
  for (i=2; i < nxtop - 2; i+=2) {
    s00=this.ny * i + 2;
    s10=s00 + this.ny;
    for (j=2; j < nytop - 2; j+=2) {
      hmm=a.get(s00 - ny2 - 2);
      hpm=a.get(s00 + ny2 - 2);
      hmp=a.get(s00 - ny2 + 2);
      hpp=a.get(s00 + ny2 + 2);
      h0=a.get(s00);
      diff=hpp + hmm - hmp - hpm;
      hx2=a.get(s10) << 1;
      hy2=a.get(s00 + 1) << 1;
      m1=Math.min(Math.max(hpp - h0,0) - hx2 - hy2,Math.max(h0 - hpm,0) + hx2 - hy2);
      m2=Math.min(Math.max(h0 - hmp,0) - hx2 + hy2,Math.max(hmm - h0,0) + hx2 + hy2);
      dmax=Math.min(m1,m2) << BITS_OF_1_NYBBLE;
      m1=Math.max(Math.min(hpp - h0,0) - hx2 - hy2,Math.min(h0 - hpm,0) + hx2 - hy2);
      m2=Math.max(Math.min(h0 - hmp,0) - hx2 + hy2,Math.min(hmm - h0,0) + hx2 + hy2);
      dmin=Math.max(m1,m2) << BITS_OF_1_NYBBLE;
      if (dmin < dmax) {
        diff=Math.max(Math.min(diff,dmax),dmin);
        s=diff - (a.get(s10 + 1) << N06);
        s=s >= 0 ? s >> N06 : s + N63 >> N06;
        s=Math.max(Math.min(s,smax),-smax);
        a.set(s10 + 1,a.get(s10 + 1) + s);
      }
      s00+=2;
      s10+=2;
    }
  }
}

private void hsmooth64 ( LongArrayPointer a , int nxtop , int nytop ) { int i , j ; int ny2 , s10 , s00 ; long hm , h0 , hp , hmm , hpm , hmp , hpp , hx2 , hy2 , diff , dmax , dmin , s , smax , m1 , m2 ; smax = this . scale > > 1 ; if ( smax <= 0 ) { return ; } ny2 = this . ny << 1 ; for ( i = 2 ; i < nxtop - 2 ; i += 2 ) { s00 = this . ny * i ; s10 = s00 + this . ny ; for ( j = 0 ; j < nytop ; j += 2 ) { hm = a . get ( s00 - ny2 ) ; h0 = a . get ( s00 ) ; hp = a . get ( s00 + ny2 ) ; diff = hp - hm ; dmax = Math . max ( Math . min ( hp - h0 , h0 - hm ) , 0 ) << 2 ; dmin = Math . min ( Math . max ( hp - h0 , h0 - hm ) , 0 ) << 2 ; if ( dmin < dmax ) { diff = Math . max ( Math . min ( diff , dmax ) , dmin ) ; s = diff - ( a . get ( s10 ) << N03 ) ; s = s >= 0 ? s > > N03 : s + N07 > > N03 ; s = Math . max ( Math . min ( s , smax ) , - smax ) ; a . set ( s10 , a . get ( s10 ) + s ) ; } s00 += 2 ; s10 += 2 ; } } for ( i = 0 ; i < nxtop ; i += 2 ) { s00 = this . ny * i + 2 ; s10 = s00 + this . ny ; for ( j = 2 ; j < nytop - 2 ; j += 2 ) { hm = a . get ( s00 - 2 ) ; h0 = a . get ( s00 ) ; hp = a . get ( s00 + 2 ) ; diff = hp - hm ; dmax = Math . max ( Math . min ( hp - h0 , h0 - hm ) , 0 ) << 2 ; dmin = Math . min ( Math . max ( hp - h0 , h0 - hm ) , 0 ) << 2 ; if ( dmin < dmax ) { diff = Math . max ( Math . min ( diff , dmax ) , dmin ) ; s = diff - ( a . get ( s00 + 1 ) << N03 ) ; s = s >= 0 ? s > > N03 : s + N07 > > N03 ; s = Math . max ( Math . min ( s , smax ) , - smax ) ; a . set ( s00 + 1 , a . get ( s00 + 1 ) + s ) ; } s00 += 2 ; s10 += 2 ; } } for ( i = 2 ; i < nxtop - 2 ; i += 2 ) { s00 = this . ny * i + 2 ; s10 = s00 + this . ny ; for ( j = 2 ; j < nytop - 2 ; j += 2 ) { hmm = a . get ( s00 - ny2 - 2 ) ; hpm = a . get ( s00 + ny2 - 2 ) ; hmp = a . get ( s00 - ny2 + 2 ) ; hpp = a . get ( s00 + ny2 + 2 ) ; h0 = a . get ( s00 ) ; diff = hpp + hmm - hmp - hpm ; hx2 = a . get ( s10 ) << 1 ; hy2 = a . get ( s00 + 1 ) << 1 ; m1 = Math . min ( Math . max ( hpp - h0 , 0 ) - hx2 - hy2 , Math . max ( h0 - hpm , 0 ) + hx2 - hy2 ) ; m2 = Math . min ( Math . max ( h0 - hmp , 0 ) - hx2 + hy2 , Math . max ( hmm - h0 , 0 ) + hx2 + hy2 ) ; dmax = Math . min ( m1 , m2 ) << BITS_OF_1_NYBBLE ; m1 = Math . max ( Math . min ( hpp - h0 , 0 ) - hx2 - hy2 , Math . min ( h0 - hpm , 0 ) + hx2 - hy2 ) ; m2 = Math . max ( Math . min ( h0 - hmp , 0 ) - hx2 + hy2 , Math . min ( hmm - h0 , 0 ) + hx2 + hy2 ) ; dmin = Math . max ( m1 , m2 ) << BITS_OF_1_NYBBLE ; if ( dmin < dmax ) { diff = Math . max ( Math . min ( diff , dmax ) , dmin ) ; s = diff - ( a . get ( s10 + 1 ) << N06 ) ; s = s >= 0 ? s > > N06 : s + N63 > > N06 ; s = Math . max ( Math . min ( s , smax ) , - smax ) ; a . set ( s10 + 1 , a . get ( s10 + 1 ) + s ) ; } s00 += 2 ; s10 += 2 ; } } }
long a [ ] ; tiledimageoperation of h - transform coefficients int nxtop , nytop ; size of coefficient block to use int ny ; actual 1st dimension of tiledimageoperation int scale ; truncation scale factor that was used
