1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
// Copyright (c) the JPEG XL Project Authors. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
#include "lib/jxl/modular/encoding/enc_debug_tree.h"
#include <stdint.h>
#include <stdlib.h>
#include "lib/jxl/base/os_macros.h"
#include "lib/jxl/base/printf_macros.h"
#include "lib/jxl/base/status.h"
#include "lib/jxl/modular/encoding/context_predict.h"
#include "lib/jxl/modular/encoding/dec_ma.h"
#include "lib/jxl/modular/options.h"
#if JXL_OS_IOS
#define JXL_ENABLE_DOT 0
#else
#define JXL_ENABLE_DOT 1 // iOS lacks C89 system()
#endif
namespace jxl {
const char *PredictorName(Predictor p) {
switch (p) {
case Predictor::Zero:
return "Zero";
case Predictor::Left:
return "Left";
case Predictor::Top:
return "Top";
case Predictor::Average0:
return "Avg0";
case Predictor::Average1:
return "Avg1";
case Predictor::Average2:
return "Avg2";
case Predictor::Average3:
return "Avg3";
case Predictor::Average4:
return "Avg4";
case Predictor::Select:
return "Sel";
case Predictor::Gradient:
return "Grd";
case Predictor::Weighted:
return "Wgh";
case Predictor::TopLeft:
return "TopL";
case Predictor::TopRight:
return "TopR";
case Predictor::LeftLeft:
return "LL";
default:
return "INVALID";
};
}
std::string PropertyName(size_t i) {
static_assert(kNumNonrefProperties == 16, "Update this function");
switch (i) {
case 0:
return "c";
case 1:
return "g";
case 2:
return "y";
case 3:
return "x";
case 4:
return "|N|";
case 5:
return "|W|";
case 6:
return "N";
case 7:
return "W";
case 8:
return "W-WW-NW+NWW";
case 9:
return "W+N-NW";
case 10:
return "W-NW";
case 11:
return "NW-N";
case 12:
return "N-NE";
case 13:
return "N-NN";
case 14:
return "W-WW";
case 15:
return "WGH";
default:
return "ch[" + ToString(15 - (int)i) + "]";
}
}
void PrintTree(const Tree &tree, const std::string &path) {
FILE *f = fopen((path + ".dot").c_str(), "w");
fprintf(f, "graph{\n");
for (size_t cur = 0; cur < tree.size(); cur++) {
if (tree[cur].property < 0) {
fprintf(f, "n%05" PRIuS " [label=\"%s%+" PRId64 " (x%u)\"];\n", cur,
PredictorName(tree[cur].predictor), tree[cur].predictor_offset,
tree[cur].multiplier);
} else {
fprintf(f, "n%05" PRIuS " [label=\"%s>%d\"];\n", cur,
PropertyName(tree[cur].property).c_str(), tree[cur].splitval);
fprintf(f, "n%05" PRIuS " -- n%05d;\n", cur, tree[cur].lchild);
fprintf(f, "n%05" PRIuS " -- n%05d;\n", cur, tree[cur].rchild);
}
}
fprintf(f, "}\n");
fclose(f);
#if JXL_ENABLE_DOT
JXL_ASSERT(
system(("dot " + path + ".dot -T svg -o " + path + ".svg").c_str()) == 0);
#endif
}
} // namespace jxl
|