public static void SetDepth(global::encode.entropy_encode.HuffmanTree p, global::Array <object> pool, int pool_off, uint[] depth, int depth_off, int level) { if ((p.index_left_ >= 0)) { ++level; global::encode.Entropy_encode.SetDepth(((global::encode.entropy_encode.HuffmanTree)(pool[(pool_off + p.index_left_)])), pool, pool_off, depth, depth_off, level); global::encode.Entropy_encode.SetDepth(((global::encode.entropy_encode.HuffmanTree)(pool[(pool_off + p.index_right_or_value_)])), pool, pool_off, depth, depth_off, level); } else { ((uint[])(depth))[(depth_off + p.index_right_or_value_)] = ((uint)(level)); } }
public static int SortHuffmanTree(global::encode.entropy_encode.HuffmanTree v0, global::encode.entropy_encode.HuffmanTree v1) { unchecked { if ((v0.total_count_ == v1.total_count_)) { return(v1.index_right_or_value_ - v0.index_right_or_value_); } if ((v0.total_count_ < v1.total_count_)) { return(-1); } return(1); } }
public static void __hx_ctor_encode_entropy_encode_HuffmanTree(global::encode.entropy_encode.HuffmanTree __hx_this) { }
public static void CreateHuffmanTree(int[] data, int data_off, int length, int tree_limit, uint[] depth, int depth_off) { unchecked { int count_limit = 1; while (true) { global::Array <object> tree = new global::Array <object>(); int tree_off = 0; int i = (length - 1); while ((i >= 0)) { if ((((int)(((int[])(data))[i])) > 0)) { int count = ((int)(global::System.Math.Max(((double)(((int)(((int[])(data))[i])))), ((double)(count_limit))))); global::encode.entropy_encode.HuffmanTree huffmantree = new global::encode.entropy_encode.HuffmanTree(); huffmantree.HuffmanTree3(count, -1, i); tree[tree_off++] = huffmantree; } --i; } int n = tree.length; if ((n == 1)) { ((uint[])(depth))[(depth_off + ((global::encode.entropy_encode.HuffmanTree)(tree[0])).index_right_or_value_)] = ((uint)(1)); break; } tree.sort(((global::haxe.lang.Function)(new global::haxe.lang.Closure(typeof(global::encode.Entropy_encode), "SortHuffmanTree", 323217485)))); global::encode.entropy_encode.HuffmanTree huffmantree1 = new global::encode.entropy_encode.HuffmanTree(); huffmantree1.HuffmanTree3(2147483647, -1, -1); tree[tree_off++] = huffmantree1; global::encode.entropy_encode.HuffmanTree huffmantree2 = new global::encode.entropy_encode.HuffmanTree(); huffmantree2.HuffmanTree3(2147483647, -1, -1); tree[tree_off++] = huffmantree2; int i1 = 0; int j = (n + 1); int k = (n - 1); while ((k > 0)) { int left = default(int); int right = default(int); if ((((global::encode.entropy_encode.HuffmanTree)(tree[i1])).total_count_ <= ((global::encode.entropy_encode.HuffmanTree)(tree[j])).total_count_)) { left = i1; ++i1; } else { left = j; ++j; } if ((((global::encode.entropy_encode.HuffmanTree)(tree[i1])).total_count_ <= ((global::encode.entropy_encode.HuffmanTree)(tree[j])).total_count_)) { right = i1; ++i1; } else { right = j; ++j; } int j_end = (tree.length - 1); ((global::encode.entropy_encode.HuffmanTree)(tree[j_end])).total_count_ = (((global::encode.entropy_encode.HuffmanTree)(tree[left])).total_count_ + ((global::encode.entropy_encode.HuffmanTree)(tree[right])).total_count_); ((global::encode.entropy_encode.HuffmanTree)(tree[j_end])).index_left_ = left; ((global::encode.entropy_encode.HuffmanTree)(tree[j_end])).index_right_or_value_ = right; global::encode.entropy_encode.HuffmanTree huffmantree3 = new global::encode.entropy_encode.HuffmanTree(); huffmantree3.HuffmanTree3(2147483647, -1, -1); tree[tree_off++] = huffmantree3; --k; } global::encode.Entropy_encode.SetDepth(((global::encode.entropy_encode.HuffmanTree)(tree[((2 * n) - 1)])), tree, 0, depth, depth_off, 0); int max_element = 0; { int _g1 = depth_off; int _g = (depth_off + length); while ((_g1 < _g)) { int i2 = _g1++; if (((bool)((((uint)(((uint[])(depth))[i2])) > max_element)))) { max_element = ((int)(((uint)(((uint[])(depth))[i2])))); } } } if ((max_element <= tree_limit)) { break; } count_limit *= 2; } } }