wblk method

dynamic wblk(
  1. List<int> dat,
  2. List<int> out,
  3. int fineL,
  4. List syms,
  5. List<int> lf,
  6. List<int> df,
  7. int eb,
  8. int li,
  9. int bs,
  10. int bl,
  11. dynamic p,
)

Implementation

wblk(List<int> dat, List<int> out, int fineL, List syms, List<int> lf, List<int> df, int eb, int li,int bs, int bl, p) {
  wbits(out, p++, fineL);
  ++lf[256];
  var _a = hTree(lf, 15), dlt = _a['t'], mlb = _a['l'];
  var _b = hTree(df, 15), ddt = _b['t'], mdb = _b['l'];
  var _c = lc(dlt), lclt = _c['c'], nlc = _c['n'];
  var _d = lc(ddt), lcdt = _d['c'], ndc = _d['n'];
  u16 lcfreq = u16(19);
  for (int i = 0; i < lclt.length; ++i){
    ++lcfreq[lclt[i] & 31];
  }
  for (int i = 0; i < lcdt.length; ++i){
    ++lcfreq[lcdt[i] & 31];
  }
  var _e = hTree(lcfreq, 7), lct = _e['t'], mlcb = _e['l'];
  int nlcc = 19;
  for (; nlcc > 4 && (lct[clim[nlcc - 1]] == null); --nlcc);
  int flen = (bl + 5) << 3;
  var ftlen = clen(lf, flt) + clen(df, fdt) + eb;
  var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];
  if (bs >= 0 && flen <= ftlen && flen <= dtlen){
    return wfblk(out, p, dat.sublist(bs, bs + bl));
  }
  var lm, ll, dm, dl;
  wbits(out, p, 1 + (dtlen < ftlen ? 1 : 0));//1 + (dtlen < ftlen));
  p += 2;
  if (dtlen < ftlen) {
    lm = hMap(dlt, mlb, 0);
    ll = dlt;
    dm = hMap(ddt, mdb, 0);
    dl = ddt;
    var llm = hMap(lct, mlcb, 0);
    wbits(out, p, nlc - 257);
    wbits(out, p + 5, ndc - 1);
    wbits(out, p + 10, nlcc - 4);
    p += 14;
    for (int i = 0; i < nlcc; ++i){
      wbits(out, p + 3 * i, lct[clim[i]]);
    }
    p += 3 * nlcc;
    var lcts = [lclt, lcdt];
    for (int it = 0; it < 2; ++it) {
      var clct = lcts[it];
      for (int i = 0; i < clct.length; ++i) {
        int len = clct[i] & 31;
        wbits(out, p, llm[len]);
        p += lct[len];
        if (len > 15){
          wbits(out, p, (clct[i] >> 5) & 127);
          p += clct[i] >> 12;
        }
      }
    }
  }
  else {
    lm = flm;
    ll = flt;
    dm = fdm;
    dl = fdt;
  }
    for (int i = 0; i < li; ++i) {
      var sym = syms[i];
      if (sym > 255) {
          int len = (sym >> 18) & 31;
          wbits16(out, p, lm[len + 257]);
          p += ll[len + 257];
          if (len > 7){
            wbits(out, p, (sym >> 23) & 31);
            p += fleb[len];
          }
          int dst = sym & 31;
          wbits16(out, p, dm[dst]);
          p += dl[dst];
          if (dst > 3){
            wbits16(out, p, (sym >> 5) & 8191);
            p += fdeb[dst];
          }
      }
      else {
        wbits16(out, p, lm[sym]);
        p += ll[sym];
      }
    }
    wbits16(out, p, lm[256]);
    return p + ll[256];
}