127using namespace std::string_literals;
238 if (entry.fName ==
name)
239 return precision > 0 ? entry.fIndx*10 + precision : entry.fIndx;
240 if (entry.fIndx > maxindx)
241 maxindx = entry.fIndx;
244 TString fullname = fontfile, fmt =
"ttf";
245 auto pos = fullname.
Last(
'.');
247 fmt = fullname(pos+1, fullname.
Length() - pos);
249 if ((fmt !=
"ttf") && (fmt !=
"woff2")) {
250 ::Error(
"TWebCanvas::AddFont",
"Unsupported font file extension %s", fmt.Data());
258 ::Error(
"TWebCanvas::AddFont",
"Not possible to read font file %s", fullname.
Data());
262 std::ifstream is(fullname.
Data(), std::ios::in | std::ios::binary);
265 is.seekg(0, std::ios::end);
266 res.resize(is.tellg());
267 is.seekg(0, std::ios::beg);
268 is.read((
char *)res.data(), res.length());
274 ::Error(
"TWebCanvas::AddFont",
"Fail to read font file %s", fullname.
Data());
284 return precision > 0 ? maxindx*10 + precision : maxindx;
313 static const struct {
314 const char *
name{
nullptr};
315 bool with_derived{
false};
316 bool reduse_by_many{
false};
317 } supported_classes[] = {{
"ROOT::Experimental::RTreeMapPainter"},
325 {
"TGraphPolargram",
true},
333 {
"TBox",
false,
true},
335 {
"TLine",
false,
true},
336 {
"TEllipse",
true,
true},
345 {
"TPolyLine",
true,
true},
362 for (
int i = 0; supported_classes[i].name !=
nullptr; ++i)
363 if ((!many_primitives || !supported_classes[i].reduse_by_many) && (strcmp(supported_classes[i].
name, obj->
ClassName()) == 0))
367 for (
int i = 0; supported_classes[i].name !=
nullptr; ++i)
368 if (supported_classes[i].with_derived && (!many_primitives || !supported_classes[i].reduse_by_many))
412 std::map<std::string, bool> mapped_funcs;
414 while (!modules_names.empty()) {
416 auto p = modules_names.find(
";");
417 if (
p == std::string::npos) {
418 modname = modules_names;
419 modules_names.clear();
421 modname = modules_names.substr(0,
p);
422 modules_names = modules_names.substr(
p+1);
425 p = modname.find(
"/");
426 if ((
p == std::string::npos) || modname.empty())
429 std::string pathname = modname.substr(0,
p+1);
430 std::string
filename = modname.substr(
p+1);
432 auto fpath = loc[pathname];
442 auto pmark = cont.find(
"$$jsroot_batch_conform$$");
443 if (pmark == std::string::npos)
449 static const std::string str1 =
"import {";
450 static const std::string str2 =
"} from 'jsroot';";
452 auto p1 = cont.find(str1);
453 auto p2 = cont.find(str2, p1);
454 if ((p1 == std::string::npos) || (p2 == std::string::npos) || (p2 > pmark))
459 TString funcs = cont.substr(p1 + 8, p2 - p1 - 8).c_str();
460 auto arr =
funcs.Tokenize(
",");
463 while (
auto obj = next()) {
466 if (!mapped_funcs[
name.Data()]) {
468 mapped_funcs[
name.Data()] =
true;
473 cont.erase(p1, p2 + str2.length() - p1);
475 cont.insert(p1, globs.
Data());
477 content.append(cont);
501 if (
name[0] ==
'+') {
524 TView *view =
nullptr;
541 auto painting = masterps;
545 painting->SetObjectName(obj->
GetName());
549 painter->SetPainting(painting);
562 painter->SetPainting(
nullptr);
570 if (!painting->IsEmpty())
624 auto *tgt = listofcols->Reserve(pal.
GetSize());
627 listofcols->FixSize();
638 TString code =
TString::Format(
"%d:%s:%s:%s", entry.fIndx, entry.fName.Data(), entry.fFormat.Data(), entry.fData.Data());
656 bool process_primitives = (version == 0) || (pad_status.fVersion > version);
682 if (resfunc && (version == 0))
689 auto masterps = std::make_unique<TWebPainting>();
692 TIter iter(primitives);
698 TString polargram_drawopt =
"-";
699 bool need_frame =
false, has_histo =
false, need_palette =
false;
700 std::string need_title;
702 auto checkNeedPalette = [](
TH1* hist,
const TString &opt) {
703 auto check = [&opt](
const TString &arg) {
704 return opt.
Contains(arg +
"Z") || opt.Contains(arg +
"HZ");
707 return ((hist->
GetDimension() == 2) && (check(
"COL") || check(
"LEGO") || check(
"LEGO4") || check(
"SURF2"))) ||
708 ((hist->
GetDimension() == 3) && (check(
"BOX2") || check(
"BOX3")));
711 while (process_primitives && ((obj = iter()) !=
nullptr)) {
720 auto hs =
static_cast<THStack *
>(obj);
723 do_rebuild_stack =
kTRUE;
730 hs->BuildPrimitives(iter.
GetOption(), do_rebuild_stack);
749 frame =
static_cast<TFrame *
>(obj);
755 if (checkNeedPalette(
static_cast<TH1*
>(obj), opt))
761 need_title = first_polar->
GetTitle();
765 polargram_drawopt = opt.
Contains(
"N") ?
"N" :
"";
769 polar->SetPolargram(polargram);
777 if (!has_histo && (strlen(obj->
GetTitle()) > 0))
780 need_frame = need_palette =
true;
786 if (!has_histo && (strlen(obj->
GetTitle()) > 0))
790 if (strcmp(obj->
GetName(),
"title") == 0)
794 auto text =
dynamic_cast<TText *
> (btn->GetListOfPrimitives()->First());
796 text->SetTitle(btn->GetTitle());
797 text->SetTextSize(btn->GetTextSize());
798 text->SetTextFont(btn->GetTextFont());
799 text->SetTextAlign(btn->GetTextAlign());
800 text->SetTextColor(btn->GetTextColor());
801 text->SetTextAngle(btn->GetTextAngle());
817 auto line0 = title->
GetLine(0);
820 title =
new TPaveText(0, 0, 0, 0,
"blNDC");
829 title->
AddText(need_title.c_str());
835 if (polargram && (polargram_drawopt !=
"-"))
836 primitives->
Add(polargram, polargram_drawopt);
838 auto flush_master = [&]() {
839 if (!usemaster || masterps->IsEmpty())
return;
842 masterps = std::make_unique<TWebPainting>();
845 auto check_cutg_in_options = [&](
const TString &opt) {
846 auto p1 = opt.Index(
"["), p2 = opt.Index(
"]");
847 if ((p1 !=
kNPOS) && (p2 !=
kNPOS) && p2 > p1 + 1) {
848 TString cutname = opt(p1 + 1, p2 - p1 - 1);
858 auto check_save_tf1 = [&](
TObject *fobj,
bool ignore_nodraw =
false) {
864 auto f1 =
static_cast<TF1 *
>(fobj);
873 auto f3 =
dynamic_cast<TF3 *
>(
f1);
874 auto f2 =
dynamic_cast<TF2 *
>(
f1);
876 f3->
Save(f3->GetXmin(), f3->GetXmax(), f3->GetYmin(), f3->GetYmax(), f3->GetZmin(), f3->GetZmax());
878 f2->Save(f2->GetXmin(), f2->GetXmax(), f2->GetYmin(), f2->GetYmax(), 0, 0);
883 auto create_stats = [&]() {
923 bool has_tf1 =
false;
925 while (
auto fobj = fiter()) {
929 check_save_tf1(fobj);
935 stats = create_stats();
947 bool first_obj =
true;
949 if (process_primitives)
950 pad_status._has_specials =
false;
952 while ((obj = iter()) !=
nullptr) {
956 }
else if (!process_primitives) {
961 TH1 *hist =
static_cast<TH1 *
>(obj);
968 while (
auto fobj = fiter()) {
974 check_save_tf1(fobj);
982 stats = create_stats();
989 if (!palette &&
CanCreateObject(
"TPaletteAxis") && checkNeedPalette(hist, o)) {
990 std::stringstream exec;
991 exec <<
"new TPaletteAxis(0,0,0,0, (TH1*)" << std::hex << std::showbase << (size_t)hist <<
");";
992 palette = (
TObject *)
gROOT->ProcessLine(exec.str().c_str());
1000 check_cutg_in_options(iter.
GetOption());
1008 check_graph_funcs(polar);
1020 check_graph_funcs(
gr);
1047 TString hopt = !real_draw ? iter.
GetOption() : (cont5_draw ?
"" : (zscale ?
"lego2z" :
"lego2"));
1048 if (title) hopt.
Append(
";;use_pad_title");
1051 auto hist = gr2d->
GetHistogram(real_draw ?
"empty" :
"");
1063 while (
auto fobj = fiter()) {
1065 check_save_tf1(fobj);
1069 while (
auto gobj = giter())
1070 check_graph_funcs(
static_cast<TGraph *
>(gobj));
1099 while (
auto fobj = fiter()) {
1109 std::stringstream exec;
1110 exec <<
"new TPaletteAxis(0,0,0,0,0,0);";
1111 palette = (
TObject *)
gROOT->ProcessLine(exec.str().c_str());
1121 auto f1 =
static_cast<TF1 *
> (obj);
1125 check_save_tf1(obj,
true);
1127 f1opt.
Append(
";force_saved");
1129 f1opt.
Append(
";prefer_saved");
1134 f1opt.
Append(
";webcanv_hist");
1138 check_cutg_in_options(iter.
GetOption());
1146 auto gaxis =
static_cast<TGaxis *
> (obj);
1154 if (frame && (obj == frame)) {
1168 bool provide_colors =
false;
1172 provide_colors = process_primitives;
1195 std::vector<TList *> all_primitives(
fAllPads.size());
1197 all_primitives[
n] =
fAllPads[
n]->fPrimitives;
1211 fAllPads[
n]->fPrimitives = all_primitives[
n];
1228 if (conn.match(connid)) {
1229 conn.fCtrl[key] =
value;
1246 if (conn.match(connid))
1247 conn.fSend.emplace(msg);
1261 bool isMoreData =
false, isAnySend =
false;
1265 bool isConnData = !conn.fCtrl.empty() || !conn.fSend.empty() ||
1266 ((conn.fCheckedVersion <
fCanvVersion) && (conn.fSendVersion == conn.fDrawVersion));
1268 while ((conn.is_batch() && !connid) || (conn.match(connid) &&
fWindow &&
fWindow->CanSend(conn.fConnId,
true))) {
1273 if (!conn.fCtrl.empty()) {
1276 }
else if (!conn.fSend.empty()) {
1277 std::swap(buf, conn.fSend.front());
1279 }
else if ((conn.fCheckedVersion <
fCanvVersion) && (conn.fSendVersion == conn.fDrawVersion)) {
1288 if (!conn.fSendVersion)
1294 if (conn.is_batch()) {
1301 auto hash =
json.Hash();
1302 if (conn.fLastSendHash && (conn.fLastSendHash == hash) && conn.fSendVersion) {
1306 buf.append(
json.Data());
1307 conn.fLastSendHash = hash;
1322 if (!buf.empty() && !conn.is_batch()) {
1323 fWindow->Send(conn.fConnId, buf);
1332 if (fTimer->IsSlow() && isMoreData)
1357 fWindow->SetDefaultPage(
"file:rootui5sys/canv/canvas6.html");
1361 [
this](
unsigned connid) {
1362 if (
fWindow->GetConnectionId(0) == connid)
1369 [
this](
unsigned connid,
const std::string &arg) {
1374 [
this](
unsigned connid) {
1377 if (
c.fConnId == connid) {
1398 if ((
w > 0) && (
w < 50000) && (
h > 0) && (
h < 30000))
1409 if (
gROOT->IsWebDisplayBatch())
1436 if (!pad || !obj)
return;
1440 AddCtrlMsg(0,
"edit"s, std::to_string(hash));
1509 if ((cw > 0) && (ch > 0)) {
1555 auto arr = TBufferJSON::FromJSON<std::vector<TWebPadOptions>>(msg);
1562 TPad *pad_with_execs =
nullptr;
1563 TExec *hist_exec =
nullptr;
1565 for (
unsigned n = 0;
n < arr->size(); ++
n) {
1566 auto &
r = arr->at(
n);
1577 if (
r.w.size() == 4)
1582 if (
r.active && (pad !=
gPad) && process_execs)
1630 if (mother->GetAbsWNDC() > 0. && mother->GetAbsHNDC() > 0.) {
1631 pad->
fXlowNDC = (
r.xlow - mother->GetAbsXlowNDC()) / mother->GetAbsWNDC();
1632 pad->
fYlowNDC = (
r.ylow - mother->GetAbsYlowNDC()) / mother->GetAbsHNDC();
1633 pad->
fXUpNDC = (
r.xup - mother->GetAbsXlowNDC()) / mother->GetAbsWNDC();
1634 pad->
fYUpNDC = (
r.yup - mother->GetAbsYlowNDC()) / mother->GetAbsHNDC();
1635 pad->
fWNDC = (
r.xup -
r.xlow) / mother->GetAbsWNDC();
1636 pad->
fHNDC = (
r.yup -
r.ylow) / mother->GetAbsHNDC();
1640 if (
r.phi ||
r.theta) {
1656 if ((xrange != 0.) && (pxrange != 0)) {
1659 pad->
fXtoPixelk = rounding + -pxrange*
r.px1/xrange;
1666 if ((yrange != 0.) && (pyrange != 0.)) {
1669 pad->
fYtoPixelk = rounding + -pyrange - pyrange*
r.py1/yrange;
1685 if (hist_holder == hist)
1686 hist_holder =
nullptr;
1701 setAxisRange(hist->
GetXaxis(),
r.zx1,
r.zx2);
1706 if ((
hmin ==
hmax) && !no_entries && !is_stack) {
1712 setAxisRange(hist->
GetYaxis(),
r.zy1,
r.zy2);
1718 if ((
hmin ==
hmax) && !no_entries) {
1724 setAxisRange(hist->
GetZaxis(),
r.zz1,
r.zz2);
1743 ::Error(
"SetMember",
"Cannot find %s data member in %s",
name, hist_holder->
ClassName());
1747 SetMember(
"fMinimum",
hmin);
1748 SetMember(
"fMaximum",
hmax);
1752 while (
auto fobj = next())
1754 hist_exec = (
TExec *) fobj;
1755 need_update =
kTRUE;
1759 std::map<std::string, int> idmap;
1761 for (
auto &item :
r.primitives) {
1762 auto iter = idmap.find(item.snapid);
1764 if (iter == idmap.end())
1765 idmap[item.snapid] = 1;
1767 idcnt = ++iter->second;
1775 need_update =
kTRUE;
1778 if (process_execs && (
gPad == pad))
1779 pad_with_execs = pad;
1796 if ((!execs || !execs->GetSize()) && !extra)
1807 while (
auto obj = next()) {
1808 auto exec =
dynamic_cast<TExec *
>(obj);
1825 std::string buf = lines;
1829 while (obj && !buf.empty()) {
1830 std::string sub = buf;
1831 auto pos = buf.find(
";;");
1832 if (pos == std::string::npos) {
1836 sub = buf.substr(0,pos);
1837 buf = buf.substr(pos+2);
1839 if (sub.empty())
continue;
1841 std::stringstream exec;
1842 exec <<
"((" << obj->
ClassName() <<
" *) " << std::hex << std::showbase << (size_t)obj <<
")->" << sub <<
";";
1843 if (indx < 3 || gDebug > 0)
1844 Info(
"ProcessLinesForObject",
"Obj %s Execute %s", obj->
GetName(), exec.str().c_str());
1845 gROOT->ProcessLine(exec.str().c_str());
1862 if (
fWebConn[indx].fConnId == connid)
1868 Bool_t is_main_connection = indx == 1;
1872 FlagGuard(
Bool_t &_flag) : flag(_flag) { flag =
true; }
1873 ~FlagGuard() { flag =
false; }
1878 const char *cdata = arg.c_str();
1880 if (arg ==
"KEEPALIVE") {
1883 }
else if (arg ==
"QUIT") {
1888 }
else if (arg.compare(0, 7,
"READY6:") == 0) {
1895 const char *separ = strchr(cdata,
':');
1897 fWebConn[indx].fDrawVersion = std::stoll(cdata);
1899 fWebConn[indx].fDrawVersion = std::stoll(std::string(cdata, separ - cdata));
1908 }
else if (arg ==
"RELOAD") {
1913 }
else if (arg.compare(0, 5,
"SAVE:") == 0) {
1916 const char *img = cdata + 5;
1918 const char *separ = strchr(img,
':');
1923 std::ofstream ofs(
filename.Data());
1930 filelen = strlen(img);
1934 filelen = binary.
Length();
1938 Info(
"ProcessData",
"File %s size %d has been created",
filename.Data(), filelen);
1941 }
else if (arg.compare(0, 8,
"PRODUCE:") == 0) {
1946 }
else if (arg.compare(0, 8,
"GETMENU:") == 0) {
1954 std::string buf =
"MENU:";
1959 }
else if (arg.compare(0, 11,
"STATUSBITS:") == 0) {
1961 if (is_main_connection) {
1966 }
else if (arg.compare(0, 10,
"HIGHLIGHT:") == 0) {
1968 if (is_main_connection) {
1969 auto arr = TBufferJSON::FromJSON<std::vector<std::string>>(arg.substr(10));
1970 if (!arr || (arr->size() != 4)) {
1971 Error(
"ProcessData",
"Wrong arguments count %d in highlight message", (
int)(arr ? arr->size() : -1));
1975 int argx = std::stoi(arr->at(2));
1976 int argy = std::stoi(arr->at(3));
1988 }
else if (
IsReadOnly() || !is_main_connection) {
1995 }
else if (arg.compare(0, 9,
"OPTIONS6:") == 0) {
2000 }
else if (arg.compare(0, 9,
"FITPANEL:") == 0) {
2002 std::string chid = arg.substr(9);
2004 TH1 *hist =
nullptr;
2006 while (
auto obj = iter()) {
2007 hist =
dynamic_cast<TH1 *
>(obj);
2012 if (chid ==
"standalone")
2013 showcmd =
"panel->Show()";
2015 showcmd =
TString::Format(
"auto wptr = (std::shared_ptr<ROOT::RWebWindow>*)0x%zx;"
2016 "panel->Show({*wptr, %u, %s})",
2017 (
size_t) &
fWindow, connid, chid.c_str());
2019 auto cmd =
TString::Format(
"auto panel = std::make_shared<ROOT::Experimental::RFitPanel>(\"FitPanel\");"
2020 "panel->AssignCanvas(\"%s\");"
2021 "panel->AssignHistogram((TH1 *)0x%zx);"
2022 "%s;panel->ClearOnClose(panel);",
2023 Canvas()->GetName(), (
size_t) hist, showcmd.
Data());
2024 gROOT->ProcessLine(cmd.Data());
2025 }
else if (arg ==
"START_BROWSER"s) {
2027 gROOT->ProcessLine(
"new TBrowser;");
2029 }
else if (arg.compare(0, 6,
"EVENT:") == 0) {
2030 auto arr = TBufferJSON::FromJSON<std::vector<std::string>>(arg.substr(6));
2031 if (!arr || (arr->size() != 5)) {
2032 Error(
"ProcessData",
"Wrong arguments count %d in event message", (
int)(arr ? arr->size() : -1));
2035 std::string kind = arr->at(1);
2038 int argx = std::stoi(arr->at(2));
2039 int argy = std::stoi(arr->at(3));
2042 if ((
event >= 0) && pad && (pad ==
gPad)) {
2053 }
else if (arg.compare(0, 8,
"PRIMIT6:") == 0) {
2055 auto opt = TBufferJSON::FromJSON<TWebObjectOptions>(arg.c_str() + 8);
2065 }
else if (arg.compare(0, 11,
"PADCLICKED:") == 0) {
2067 auto click = TBufferJSON::FromJSON<TWebPadClick>(arg.c_str() + 11);
2075 const char *mthd = btn->GetMethod();
2076 if (mthd && *mthd) {
2080 gROOT->ProcessLine(mthd);
2085 if (pad && (pad !=
gPad)) {
2092 if (!click->objid.empty()) {
2100 if ((click->x >= 0) && (click->y >= 0)) {
2113 }
else if (arg.compare(0, 8,
"OBJEXEC:") == 0) {
2115 auto buf = arg.substr(8);
2116 auto pos = buf.find(
":");
2118 if ((pos > 0) && (pos != std::string::npos)) {
2119 auto sid = buf.substr(0, pos);
2120 buf.erase(0, pos + 1);
2123 TPad *objpad =
nullptr;
2127 if (obj && !buf.empty()) {
2140 }
else if (arg.compare(0, 12,
"EXECANDSEND:") == 0) {
2144 std::string buf = arg.substr(12);
2148 auto pos = buf.find(
":");
2152 reply = buf.substr(0, pos);
2153 buf.erase(0, pos + 1);
2154 pos = buf.find(
":");
2156 auto sid = buf.substr(0, pos);
2157 buf.erase(0, pos + 1);
2162 if (obj && !buf.empty() && !reply.empty()) {
2163 std::stringstream exec;
2164 exec <<
"((" << obj->
ClassName() <<
" *) " << std::hex << std::showbase << (size_t)obj
2165 <<
")->" << buf <<
";";
2167 Info(
"ProcessData",
"Obj %s Exec %s", obj->
GetName(), exec.str().c_str());
2169 auto res =
gROOT->ProcessLine(exec.str().c_str());
2172 std::string send = reply;
2176 if (reply[0] ==
'D')
2181 }
else if (arg.compare(0, 6,
"CLEAR:") == 0) {
2182 std::string snapid = arg.substr(6);
2191 Error(
"ProcessData",
"Not found pad with id %s to clear\n", snapid.c_str());
2193 }
else if (arg.compare(0, 7,
"DIVIDE:") == 0) {
2194 auto arr = TBufferJSON::FromJSON<std::vector<std::string>>(arg.substr(7));
2195 if (arr && arr->size() == 2) {
2197 int nn = 0, n1 = 0, n2 = 0;
2199 std::string divide = arr->at(1);
2200 auto p = divide.find(
'x');
2201 if (
p == std::string::npos)
2202 p = divide.find(
'X');
2204 if (
p != std::string::npos) {
2205 n1 = std::stoi(divide.substr(0,
p));
2206 n2 = std::stoi(divide.substr(
p+1));
2208 nn = std::stoi(divide);
2211 if (pad && ((nn > 1) || (n1*n2 > 1))) {
2223 }
else if (arg.compare(0, 8,
"DRAWOPT:") == 0) {
2225 auto arr = TBufferJSON::FromJSON<std::vector<std::string>>(arg.substr(8));
2226 if (arr && arr->size() == 2) {
2233 }
else if (arg.compare(0, 8,
"RESIZED:") == 0) {
2235 auto arr = TBufferJSON::FromJSON<std::vector<int>>(arg.substr(8));
2236 if (arr && arr->size() == 7) {
2245 }
else if (arg.compare(0, 7,
"POPOBJ:") == 0) {
2247 auto arr = TBufferJSON::FromJSON<std::vector<std::string>>(arg.substr(7));
2248 if (arr && arr->size() == 2) {
2253 while (
auto o = next())
2263 }
else if (arg.compare(0, 8,
"SHOWURL:") == 0) {
2266 args.
SetUrl(arg.substr(8));
2271 }
else if (arg ==
"INTERRUPT"s) {
2273 gROOT->SetInterrupt();
2295 entry._detected =
true;
2298 entry._modified =
true;
2302 while (
auto obj = iter()) {
2317 entry.second._detected =
false;
2318 entry.second._modified = force_modified;
2325 bool is_any_modified =
false;
2327 if (iter->second._modified)
2328 is_any_modified =
true;
2329 if (!iter->second._detected)
2336 if (is_any_modified) {
2339 if (entry.second._modified)
2343 return is_any_modified;
2359 fWindow->SetGeometry(arr[2], arr[3]);
2434 Info(
"WaitWhenCanvasPainted",
"version %ld", (
long)ver);
2436 while (cnt++ < cnt_limit) {
2441 if (!
fWindow->HasConnection(0,
false)) {
2443 Info(
"WaitWhenCanvasPainted",
"no connections - abort");
2449 Info(
"WaitWhenCanvasPainted",
"ver %ld got painted", (
long)ver);
2455 Info(
"WaitWhenCanvasPainted",
"ver %ld got painted before client disconnected", (
long)
fLastDrawVersion);
2465 Info(
"WaitWhenCanvasPainted",
"timeout");
2488 imp->CreatePadSnapshot(holder, pad, 0, [&res, json_compression](
TPadWebSnapshot *snap) {
2508 auto imp = std::make_unique<TWebCanvas>(
c,
c->GetName(), 0, 0,
c->GetWw(),
c->GetWh(),
kTRUE);
2514 imp->CreatePadSnapshot(holder,
c, 0, [&res, json_compression](
TPadWebSnapshot *snap) {
2536 }
else if (*
option ==
'i') {
2546 auto imp = std::make_unique<TWebCanvas>(
c,
c->GetName(), 0, 0,
c->GetWw(),
c->GetWh(),
kTRUE);
2574 const char *endings[4] = {
"(",
"[",
"]",
")"};
2575 const char *suffix =
nullptr;
2576 for (
int n = 0; (
n < 4) && !suffix; ++
n) {
2579 suffix = endings[
n];
2598 }
else if (fmt ==
"pdf") {
2601 append_batch =
kTRUE;
2607 ::Error(
"TWebCanvas::ProduceImage",
"Cannot change PDF name when multi-page PDF active");
2612 ::Error(
"TWebCanvas::ProduceImage",
"Cannot produce other images when multi-page PDF active");
2626 if (!suffix && (!
gBatchImageMode || (fmt ==
"s.pdf") || (fmt ==
"json") || (fmt ==
"html") || (fmt ==
"s.png")))
2654 std::vector<std::string> jsons;
2655 std::vector<Int_t> widths, heights;
2657 for (
unsigned n = 0;
n < pads.size(); ++
n) {
2667 if ((pad->GetCanvas() == pad) || (pad->IsA() ==
TCanvas::Class())) {
2671 w = (
Int_t) (pad->GetAbsWNDC() * pad->GetCanvas()->GetWw());
2672 h = (
Int_t) (pad->GetAbsHNDC() * pad->GetCanvas()->GetWh());
2676 jsons.emplace_back(
json.Data());
2677 widths.emplace_back(
w);
2678 heights.emplace_back(
h);
2683 if (!
gBatchImageMode || (fmt ==
"json") || (fmt ==
"s.png") || (fmt ==
"s.pdf"))
2706 TPad *objpad =
nullptr;
2709 if (item.
fcust.compare(
"exec") == 0) {
2710 auto pos = item.
opt.find(
"(");
2711 if (obj && (pos != std::string::npos) && obj->
IsA()->
GetMethodAllAny(item.
opt.substr(0,pos).c_str())) {
2712 std::stringstream exec;
2713 exec <<
"((" << obj->
ClassName() <<
" *) " << std::hex << std::showbase
2714 << (size_t)obj <<
")->" << item.
opt <<
";";
2716 Info(
"ProcessObjectOptions",
"Obj %s Execute %s", obj->
GetName(), exec.str().c_str());
2717 gROOT->ProcessLine(exec.str().c_str());
2719 Error(
"ProcessObjectOptions",
"Fail to execute %s for object %p %s", item.
opt.c_str(), obj, obj ? obj->
ClassName() :
"---");
2725 bool modified =
false;
2728 auto pos = item.
opt.find(
";;use_");
2729 if (pos != std::string::npos) item.
opt.resize(pos);
2732 Info(
"ProcessObjectOptions",
"Set draw option %s for object %s %s", item.
opt.c_str(),
2740 if (item.
fcust.compare(0,10,
"auto_exec:") == 0) {
2742 }
else if (item.
fcust.compare(
"frame") == 0) {
2745 if (item.
fopt.size() >= 4) {
2753 }
else if (item.
fcust.compare(0,4,
"pave") == 0) {
2756 if ((item.
fopt.size() >= 4) && objpad) {
2772 auto stats =
static_cast<TPaveStats *
>(pave);
2774 size_t pos_start = 6, pos_end;
2775 while ((pos_end = item.
fcust.find(
";;", pos_start)) != std::string::npos) {
2776 stats->AddText(item.
fcust.substr(pos_start, pos_end - pos_start).c_str());
2777 pos_start = pos_end + 2;
2779 stats->AddText(item.
fcust.substr(pos_start).c_str());
2782 }
else if (item.
fcust.compare(0,9,
"func_fail") == 0) {
2789 return modified ? objpad :
nullptr;
2800 if (sid.empty() || (sid ==
"0"s))
2806 std::string subelement;
2807 long unsigned id = 0;
2810 auto separ = sid.find(
"#");
2812 if (separ == std::string::npos) {
2813 id = std::stoul(sid);
2815 subelement = sid.substr(separ + 1);
2816 id = std::stoul(sid.substr(0, separ));
2823 TObject *obj = lnk->GetObject();
2826 if (!search_hist && (
TString::Hash(&obj,
sizeof(obj)) !=
id)) {
2829 if (objpad && !*objpad)
2838 if (!search_hist && --idcnt > 0)
2848 subelement =
"hist";
2850 auto getHistogram = [](
TObject *container) ->
TH1* {
2851 auto offset = container->IsA()->GetDataMemberOffset(
"fHistogram");
2853 return *((
TH1 **)((
char *)container +
offset));
2854 ::Error(
"getHistogram",
"Cannot access fHistogram data member in %s", container->ClassName());
2858 while(!subelement.empty() && obj) {
2860 if (!search_hist && objlnk)
2863 std::string kind = subelement;
2864 auto separ = kind.find(
"#");
2865 if (separ == std::string::npos) {
2869 subelement = subelement.substr(separ + 1);
2880 if (kind.compare(
"hist") == 0) {
2884 obj = getHistogram(
gr);
2886 obj = getHistogram(mg);
2888 obj = getHistogram(hs);
2890 obj = getHistogram(scatter);
2892 obj = getHistogram(
f1);
2894 obj = getHistogram(gr2d);
2897 }
else if (kind.compare(
"x") == 0) {
2899 }
else if (kind.compare(
"y") == 0) {
2901 }
else if (kind.compare(
"z") == 0) {
2903 }
else if ((kind.compare(0,5,
"func_") == 0) || (kind.compare(0,5,
"indx_") == 0)) {
2904 auto funcname = kind.substr(5);
2905 TList *col =
nullptr;
2916 else if (kind.compare(0,5,
"func_") == 0)
2919 obj = col->
At(std::stoi(funcname));
2920 }
else if (kind.compare(
"polargram") == 0) {
2922 obj = polar ? polar->GetPolargram() :
nullptr;
2923 }
else if (kind.compare(0,7,
"graphs_") == 0) {
2925 obj = graphs ? graphs->
At(std::stoi(kind.substr(7))) :
nullptr;
2926 }
else if (kind.compare(0,6,
"hists_") == 0) {
2928 obj = hists ? hists->
At(std::stoi(kind.substr(6))) :
nullptr;
2929 }
else if (kind.compare(0,6,
"stack_") == 0) {
2930 auto stack = hs ? hs->
GetStack() :
nullptr;
2931 obj = stack ? stack->At(std::stoi(kind.substr(6))) :
nullptr;
2932 }
else if (kind.compare(0,7,
"member_") == 0) {
2933 auto member = kind.substr(7);
2941 if (!search_hist || obj)
2978 canvas->SetName(
name);
2979 canvas->SetTitle(title);
2983 canvas->SetCanvas(canvas);
2984 canvas->SetBatch(
kTRUE);
2985 canvas->SetEditable(
kTRUE);
2989 canvas->SetFillStyle(1001);
3004 canvas->SetCanvasImp(imp);
3010 auto l1 =
gROOT->GetListOfCleanups();
3011 if (!l1->FindObject(canvas))
3013 auto l2 =
gROOT->GetListOfCanvases();
3014 if (!l2->FindObject(canvas))
3019 imp->CreateWebWindow();
int Int_t
Signed integer 4 bytes (int)
unsigned int UInt_t
Unsigned integer 4 bytes (unsigned int)
short Font_t
Font number (short)
constexpr Ssiz_t kNPOS
The equivalent of std::string::npos for the ROOT class TString.
long long Long64_t
Portable signed long integer 8 bytes.
void Info(const char *location, const char *msgfmt,...)
Use this function for informational messages.
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t hmin
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t hmax
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h offset
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void funcs
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t src
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t height
Option_t Option_t TPoint TPoint const char text
Int_t gDebug
Global variable setting the debug level. Set to 0 to disable, increase it in steps of 1 to increase t...
R__EXTERN TVirtualMutex * gROOTMutex
R__EXTERN TStyle * gStyle
R__EXTERN TSystem * gSystem
#define R__LOCKGUARD(mutex)
R__EXTERN TVirtualPS * gVirtualPS
static std::vector< WebFont_t > gWebFonts
static const std::string sid_pad_histogram
Holds different arguments for starting browser with RWebDisplayHandle::Display() method.
EBrowserKind GetBrowserKind() const
returns configured browser kind, see EBrowserKind for supported values
void SetStandalone(bool on=true)
Set standalone mode for running browser, default on When disabled, normal browser window (or just tab...
RWebDisplayArgs & SetWidgetKind(const std::string &kind)
set widget kind
RWebDisplayArgs & SetSize(int w, int h)
set preferable web window width and height
RWebDisplayArgs & SetUrl(const std::string &url)
set window url
RWebDisplayArgs & SetPos(int x=-1, int y=-1)
set preferable web window x and y position, negative is default
@ kCEF
Chromium Embedded Framework - local display with CEF libs.
@ kQt6
Qt6 QWebEngine libraries - Chromium code packed in qt6.
static bool ProduceImages(const std::string &fname, const std::vector< std::string > &jsons, const std::vector< int > &widths, const std::vector< int > &heights, const char *batch_file=nullptr)
Produce image file(s) using JSON data as source Invokes JSROOT drawing functionality in headless brow...
static std::vector< std::string > ProduceImagesNames(const std::string &fname, unsigned nfiles=1)
Produce vector of file names for specified file pattern Depending from supported file formats.
static std::string GetImageFormat(const std::string &fname)
Detect image format There is special handling of ".screenshot.pdf" and ".screenshot....
static bool ProduceImage(const std::string &fname, const std::string &json, int width=800, int height=600, const char *batch_file=nullptr)
Produce image file using JSON data as source Invokes JSROOT drawing functionality in headless browser...
static std::unique_ptr< RWebDisplayHandle > Display(const RWebDisplayArgs &args)
Create web display.
static std::shared_ptr< RWebWindow > Create()
Create new RWebWindow Using default RWebWindowsManager.
static unsigned ShowWindow(std::shared_ptr< RWebWindow > window, const RWebDisplayArgs &args="")
Static method to show web window Has to be used instead of RWebWindow::Show() when window potentially...
static bool EmbedFileDialog(const std::shared_ptr< RWebWindow > &window, unsigned connid, const std::string &args)
Create dialog instance to use as embedded dialog inside provided widget Loads libROOTBrowserv7 and tr...
static bool IsFileDialogMessage(const std::string &msg)
Check if this could be the message send by client to start new file dialog If returns true,...
static std::map< std::string, std::string > GetServerLocations()
Returns server locations as <std::string, std::string> Key is location name (with slash at the end) a...
Array of integers (32 bits per element).
const Int_t * GetArray() const
virtual void SetFillColor(Color_t fcolor)
Set the fill area color.
virtual void SetFillStyle(Style_t fstyle)
Set the fill area style.
virtual void SetBottomMargin(Float_t bottommargin)
Set Pad bottom margin in fraction of the pad height.
virtual void SetLeftMargin(Float_t leftmargin)
Set Pad left margin in fraction of the pad width.
virtual void SetRightMargin(Float_t rightmargin)
Set Pad right margin in fraction of the pad width.
Float_t GetRightMargin() const
virtual void SetTopMargin(Float_t topmargin)
Set Pad top margin in fraction of the pad height.
virtual void SetTextAlign(Short_t align=11)
Set the text alignment.
virtual void SetTextColor(Color_t tcolor=1)
Set the text color.
virtual void SetTextFont(Font_t tfont=62)
Set the text font.
virtual void SetTextSize(Float_t tsize=1)
Set the text size.
Class to manage histogram axis.
Int_t GetLast() const
Return last bin on the axis i.e.
virtual void SetRangeUser(Double_t ufirst, Double_t ulast)
Set the viewing range for the axis from ufirst to ulast (in user coordinates, that is,...
virtual void SetRange(Int_t first=0, Int_t last=0)
Set the viewing range for the axis using bin numbers.
Int_t GetFirst() const
Return first bin on the axis i.e.
static TString Decode(const char *data)
Decode a base64 string date into a generic TString.
static TString Encode(const char *data)
Transform data into a null terminated base64 string.
virtual void SetY2(Double_t y2)
virtual void SetX1(Double_t x1)
virtual void SetX2(Double_t x2)
virtual void SetY1(Double_t y1)
static Int_t ExportToFile(const char *filename, const TObject *obj, const char *option=nullptr)
Convert object into JSON and store in text file Returns size of the produce file Used in TObject::Sav...
static TString ToJSON(const T *obj, Int_t compact=0, const char *member_name=nullptr)
@ kNoSpaces
no new lines plus remove all spaces around "," and ":" symbols
@ kMapAsObject
store std::map, std::unordered_map as JSON object
@ kSameSuppression
zero suppression plus compress many similar values together
ABC describing GUI independent main window (with menubar, scrollbars and a drawing area).
void SetScripts(const std::string &src)
void SetFixedSize(bool on=true)
void SetHighlightConnect(bool on=true)
UInt_t fCw
Width of the canvas along X (pixels)
UInt_t GetWindowHeight() const
void SetClickSelectedPad(TPad *pad)
Int_t fWindowTopX
Top X position of window (in pixels)
Int_t fEventX
! Last X mouse position in canvas
TVirtualPadPainter * GetCanvasPainter()
Access and (probably) creation of pad painter.
UInt_t fWindowWidth
Width of window (including borders, etc.)
Int_t fEventY
! Last Y mouse position in canvas
UInt_t fWindowHeight
Height of window (including menubar, borders, etc.)
TObject * fSelected
! Currently selected object
UInt_t fCh
Height of the canvas along Y (pixels)
UInt_t GetWindowWidth() const
Int_t fWindowTopY
Top Y position of window (in pixels)
void SetClickSelected(TObject *obj)
UInt_t GetWw() const override
UInt_t GetWh() const override
virtual void Highlighted(TVirtualPad *pad, TObject *obj, Int_t x, Int_t y)
Emit Highlighted() signal.
Int_t fEvent
! Type of current or last handled event
TClass instances represent classes, structs and namespaces in the ROOT type system.
Longptr_t GetDataMemberOffset(const char *membername) const
return offset for member name.
Int_t Size() const
Return size of object of this class.
Bool_t InheritsFrom(const char *cl) const override
Return kTRUE if this class inherits from a class with name "classname".
TMethod * GetMethodAllAny(const char *method)
Return pointer to method without looking at parameters.
void SetName(const char *name)
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
The color creation and management class.
static const TArrayI & GetPalette()
Static function returning the current active palette.
static Bool_t DefinedColors(Int_t set_always_on=0)
Static method returning kTRUE if some new colors have been defined after initialisation or since the ...
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
TExec is a utility class that can be used to execute a C++ command when some event happens in a pad.
virtual void Exec(const char *command="")
Execute the command referenced by this object.
virtual Double_t GetXmax() const
virtual TH1 * GetHistogram() const
Return a pointer to the histogram used to visualise the function Note that this histogram is managed ...
virtual Bool_t IsValid() const
Return kTRUE if the function is valid.
virtual void Save(Double_t xmin, Double_t xmax, Double_t ymin, Double_t ymax, Double_t zmin, Double_t zmax)
Save values of function in array fSave.
TClass * IsA() const override
virtual Double_t GetXmin() const
Bool_t HasSave() const
Return true if function has data in fSave buffer.
A 2-Dim function with parameters.
void Save(Double_t xmin, Double_t xmax, Double_t ymin, Double_t ymax, Double_t zmin, Double_t zmax) override
Save values of function in array fSave.
TF3 defines a 3D Function with Parameters.
TF1 * GetFunction() const
Graphics object made of three arrays X, Y and Z with the same number of points each.
TH2D * GetHistogram(Option_t *option="")
By default returns a pointer to the Delaunay histogram.
TList * GetListOfFunctions() const
TGraphPolargram * GetPolargram()
TGraphPolargram * CreatePolargram(const char *opt)
Create polargram object for given draw options.
A TGraph is an object made of two arrays X and Y with npoints each.
@ kNoStats
Don't draw stats box.
TList * GetListOfFunctions() const
virtual TH1F * GetHistogram() const
Returns a pointer to the histogram used to draw the axis Takes into account the two following cases.
TH1 is the base class of all histogram classes in ROOT.
virtual Int_t GetDimension() const
@ kNoTitle
Don't draw the histogram title.
@ kIsZoomed
Bit set when zooming on Y axis.
virtual void SetMaximum(Double_t maximum=-1111)
virtual void SetMinimum(Double_t minimum=-1111)
virtual Double_t GetEntries() const
Return the current number of entries.
TList * GetListOfFunctions() const
virtual Int_t BufferEmpty(Int_t action=0)
Fill histogram with all entries in the buffer.
The Histogram stack class.
TObjArray * GetStack()
Return pointer to Stack. Build it if not yet done.
Int_t GetNhists() const
Return the number of histograms in the stack.
static char * ReadFileContent(const char *filename, Int_t &len)
Reads content of file from the disk.
Option_t * GetOption() const
TObject * FindObject(const char *name) const override
Find an object in this list using its name.
void Add(TObject *obj) override
TObject * Last() const override
Return the last object in the list. Returns 0 when list is empty.
virtual TObjLink * FirstLink() const
TObject * At(Int_t idx) const override
Returns the object at position idx. Returns 0 if idx is out of range.
void AddFirst(TObject *obj) override
Add object at the beginning of the list.
A TMultiGraph is a collection of TGraph (or derived) objects.
TList * GetListOfGraphs() const
void BuildPrimitives(Option_t *chopt="")
TList * GetListOfFunctions()
Return pointer to list of functions.
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
const char * GetName() const override
Returns name of object.
const char * GetTitle() const override
Returns title of object.
TObject * At(Int_t idx) const override
Int_t GetLast() const override
Return index of last object in array.
Wrapper around a TObject so it can be stored in a TList.
virtual void SetOption(Option_t *)
TObject * GetObject() const
Mother of all ROOT objects.
virtual const char * GetName() const
Returns name of object.
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
virtual const char * ClassName() const
Returns name of class to which the object belongs.
virtual TObject * FindObject(const char *name) const
Must be redefined in derived classes.
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
virtual const char * GetTitle() const
Returns title of object.
virtual TClass * IsA() const
virtual void Paint(Option_t *option="")
This method must be overridden if a class wants to paint itself.
TPadWebSnapshot & NewSubPad()
Create new entry for subpad.
TWebSnapshot & NewPrimitive(TObject *obj=nullptr, const std::string &opt="", const std::string &suffix="")
Create new entry in list of primitives.
TWebSnapshot & NewSpecials()
Create new entry in list of primitives in the front.
void SetHasExecs(bool on=true)
void SetWithoutPrimitives(bool on=true)
void SetActive(bool on=true)
bool IsSetObjectIds() const
The most important graphics class in the ROOT system.
Int_t GetTicky() const override
Double_t fAbsYlowNDC
Absolute Y top left corner of pad in NDC [0,1].
Double_t fXtoAbsPixelk
Conversion coefficient for X World to absolute pixel.
virtual void DivideSquare(Int_t n, Float_t xmargin=0.01, Float_t ymargin=0.01, Int_t color=0)
"n" is the total number of sub-pads.
Double_t fWNDC
Width of pad along X in Normalized Coordinates (NDC)
void SetView(TView *view=nullptr) override
Set the current TView. Delete previous view if view=0.
TVirtualViewer3D * GetViewer3D(Option_t *type="") override
Create/obtain handle to 3D viewer.
Double_t fPixeltoYk
Conversion coefficient for pixel to Y World.
void SetGrid(Int_t valuex=1, Int_t valuey=1) override
Double_t fPhi
phi angle to view as lego/surface
Double_t fPixeltoY
yworld = fPixeltoYk + fPixeltoY*ypixel
Double_t fAbsXlowNDC
Absolute X top left corner of pad in NDC [0,1].
TList * GetListOfExecs() const override
void Divide(Int_t nx=1, Int_t ny=1, Float_t xmargin=0.01, Float_t ymargin=0.01, Int_t color=0) override
Automatic pad generation by division.
Double_t fXtoPixel
xpixel = fXtoPixelk + fXtoPixel*xworld
Bool_t GetGridx() const override
Double_t fX2
X of upper X coordinate.
Double_t fPixeltoX
xworld = fPixeltoXk + fPixeltoX*xpixel
Double_t fYtoPixel
ypixel = fYtoPixelk + fYtoPixel*yworld
Double_t fAbsWNDC
Absolute Width of pad along X in NDC.
TObject * Remove(TObject *obj, Bool_t modified=kTRUE) override
Remove object from list of primitives When.
UInt_t GetWw() const override
Get canvas width.
Double_t fX1
X of lower X coordinate.
TList * GetListOfPrimitives() const override
Double_t fUymin
Minimum value on the Y axis.
Int_t fLogz
(=0 if Z linear scale, =1 if log scale)
Double_t fYtoPixelk
Conversion coefficient for Y World to pixel.
Double_t fPixeltoXk
Conversion coefficient for pixel to X World.
Bool_t IsModified() const override
Double_t fY1
Y of lower Y coordinate.
Double_t fYlowNDC
Y bottom left corner of pad in NDC [0,1].
Double_t fAbsPixeltoXk
Conversion coefficient for absolute pixel to X World.
void Clear(Option_t *option="") override
Delete all pad primitives.
Int_t GetTickx() const override
Double_t fUymax
Maximum value on the Y axis.
TVirtualPad * GetMother() const override
void Modified(Bool_t flag=true) override
Mark pad modified Will be repainted when TCanvas::Update() will be called next time.
TView * GetView() const override
TClass * IsA() const override
Bool_t GetGridy() const override
Double_t fAbsHNDC
Absolute Height of pad along Y in NDC.
void SetFixedAspectRatio(Bool_t fixed=kTRUE) override
Fix pad aspect ratio to current value if fixed is true.
Int_t fLogx
(=0 if X linear scale, =1 if log scale)
Double_t GetAbsWNDC() const override
UInt_t GetWh() const override
Get canvas height.
TCanvas * GetCanvas() const override
void Add(TObject *obj, Option_t *opt="", Bool_t modified=kTRUE) override
Add an object to list of primitives with specified draw option When.
Double_t fTheta
theta angle to view as lego/surface
TVirtualPad * cd(Int_t subpadnumber=0) override
Set Current pad.
void Print(const char *filename="") const override
This method is equivalent to SaveAs("filename"). See TPad::SaveAs for details.
TFrame * GetFrame() override
Get frame.
Double_t fYtoAbsPixelk
Conversion coefficient for Y World to absolute pixel.
Double_t fXtoPixelk
Conversion coefficient for X World to pixel.
Int_t fLogy
(=0 if Y linear scale, =1 if log scale)
Double_t fHNDC
Height of pad along Y in Normalized Coordinates (NDC)
Double_t fXlowNDC
X bottom left corner of pad in NDC [0,1].
Double_t fUxmin
Minimum value on the X axis.
Double_t GetAbsHNDC() const override
void SetTicks(Int_t valuex=1, Int_t valuey=1) override
Double_t fUxmax
Maximum value on the X axis.
Double_t fY2
Y of upper Y coordinate.
Double_t fAbsPixeltoYk
Conversion coefficient for absolute pixel to Y World.
TVirtualPad * GetSelectedPad() const override
Get selected pad.
const char * GetName() const override
Returns name of object.
The histogram statistics painter class.
virtual void SetStatFormat(const char *format="6.4g")
Change (i.e. set) the format for printing statistics.
void SetOptStat(Int_t stat=1)
Set the stat option.
virtual void SetFitFormat(const char *format="5.4g")
Change (i.e. set) the format for printing fit parameters in statistics box.
void SetParent(TObject *obj) override
void SetOptFit(Int_t fit=1)
Set the fit option.
A Pave (see TPave) with text, lines or/and boxes inside.
virtual TText * AddText(Double_t x1, Double_t y1, const char *label)
Add a new Text line to this pavetext at given coordinates.
void Clear(Option_t *option="") override
Clear all lines in this pavetext.
virtual TText * GetLine(Int_t number) const
Get Pointer to line number in this pavetext.
A TBox with a bordersize and a shadow option.
virtual void SetY1NDC(Double_t y1)
virtual void ConvertNDCtoPad()
Convert pave coordinates from NDC to Pad coordinates.
virtual void SetName(const char *name="")
virtual void SetBorderSize(Int_t bordersize=4)
Sets the border size of the TPave box and shadow.
virtual void SetY2NDC(Double_t y2)
Option_t * GetOption() const override
virtual void SetX1NDC(Double_t x1)
virtual void SetX2NDC(Double_t x2)
A TScatter is able to draw four variables scatter plot on a single plot.
TGraph * GetGraph() const
Get the graph holding X and Y positions.
TH2F * GetHistogram() const
Get the graph histogram used for drawing axis.
void ToLower()
Change string to lower-case.
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
const char * Data() const
void Resize(Ssiz_t n)
Resize the string. Truncate or add blanks as necessary.
Ssiz_t Last(char c) const
Find last occurrence of a character c.
void ToUpper()
Change string to upper case.
UInt_t Hash(ECaseCompare cmp=kExact) const
Return hash value.
TString & Append(const char *cs)
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
Color_t GetStatTextColor() const
Int_t GetOptTitle() const
Int_t GetPadTickX() const
Float_t GetStatFontSize() const
Float_t GetPadRightMargin() const
Style_t GetTitleFont(Option_t *axis="X") const
Return title font.
Color_t GetTitleFillColor() const
Style_t GetTitleStyle() const
Bool_t GetPadGridY() const
Color_t GetStatColor() const
Float_t GetPadLeftMargin() const
Bool_t GetPadGridX() const
Int_t GetPadTickY() const
Width_t GetTitleBorderSize() const
Color_t GetCanvasColor() const
Float_t GetPadBottomMargin() const
Width_t GetStatBorderSize() const
Color_t GetTitleTextColor() const
Style_t GetStatStyle() const
const char * GetFitFormat() const
Int_t GetCanvasBorderMode() const
const char * GetStatFormat() const
Width_t GetCanvasBorderSize() const
Style_t GetStatFont() const
Float_t GetTitleFontSize() const
Float_t GetPadTopMargin() const
virtual Bool_t ExpandPathName(TString &path)
Expand a pathname getting rid of special shell characters like ~.
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
virtual void Sleep(UInt_t milliSec)
Sleep milliSec milli seconds.
virtual Bool_t ProcessEvents()
Process pending events (GUI, timers, sockets).
Base class for several text objects.
static Long_t SelfId()
Static method returning the id for the current thread.
Handles synchronous and a-synchronous timer events.
virtual void TurnOn()
Add the timer to the system timer list.
void SetTime(Long_t milliSec)
static TView * CreateView(Int_t system=1, const Double_t *rmin=nullptr, const Double_t *rmax=nullptr)
Create a concrete default 3-d view via the plug-in manager.
virtual void SetAutoRange(Bool_t autorange=kTRUE)=0
TVirtualPS is an abstract interface to Postscript, PDF, SVG.
To make it possible to use GL for 2D graphic in a TPad/TCanvas.
small helper class to store/restore gPad context in TPad methods
TVirtualPad is an abstract base class for the Pad and Canvas classes.
virtual TVirtualPad * cd(Int_t subpadnumber=0)=0
Semi-Abstract base class defining a generic interface to the underlying, low level,...
void SetSlow(Bool_t slow=kTRUE)
TWebCanvasTimer(TWebCanvas &canv)
void Timeout() override
used to send control messages to clients
Basic TCanvasImp ABI implementation for Web-based Graphics Provides painting of main ROOT classes in ...
TVirtualPadPainter * CreatePadPainter() override
Creates web-based pad painter.
void ForceUpdate() override
Increment canvas version and force sending data to client - do not wait for reply.
static TCanvas * CreateWebCanvas(const char *name, const char *title, UInt_t width=1200, UInt_t height=800)
Create TCanvas and assign TWebCanvas implementation to it Canvas is not displayed automatically,...
static void AddCustomClass(const std::string &clname, bool with_derived=false)
Assign custom class.
static TString CreatePadJSON(TPad *pad, Int_t json_compression=0, Bool_t batchmode=kFALSE)
Create JSON painting output for given pad Produce JSON can be used for offline drawing with JSROOT.
void SetCanvasSize(UInt_t w, UInt_t h) override
Set canvas size of web canvas.
UInt_t fColorsHash
! last hash of colors/palette
Int_t fTF1UseSave
! use save buffer for TF1/TF2, 0:off, 1:prefer, 2:force
void ShowCmd(const std::string &arg, Bool_t show)
Function used to send command to browser to toggle menu, toolbar, editors, ...
Long64_t fColorsVersion
! current colors/palette version, checked every time when new snapshot created
virtual Bool_t IsReadOnly() const
std::shared_ptr< ROOT::RWebWindow > fWindow
virtual Bool_t IsJSSupportedClass(TObject *obj, Bool_t many_primitives=kFALSE)
Returns kTRUE when object is fully supported on JSROOT side In ROOT7 Paint function will just return ...
void AddCtrlMsg(unsigned connid, const std::string &key, const std::string &value)
Add control message for specified connection Same control message can be overwritten many time before...
static void SetCustomScripts(const std::string &src)
Configures custom script for canvas.
ObjectSelectSignal_t fObjSelectSignal
! signal emitted when new object selected in the pad
PadClickedSignal_t fPadClickedSignal
! signal emitted when simple mouse click performed on the pad
void SetLongerPolling(Bool_t on)
UInt_t fStyleHash
! last hash of gStyle
virtual Bool_t CanCreateObject(const std::string &)
void ShowWebWindow(const ROOT::RWebDisplayArgs &user_args="")
Show canvas in specified place.
Int_t fPrimitivesMerge
! number of PS primitives, which will be merged together
void Show() override
Show canvas in browser window.
Bool_t WaitWhenCanvasPainted(Long64_t ver)
Wait when specified version of canvas was painted and confirmed by browser.
static UInt_t gBatchImageMode
! configured batch size
static std::string gCustomScripts
! custom JavaScript code or URL on JavaScript files to load before start drawing
Bool_t IsAsyncMode() const
Long64_t fLastDrawVersion
! last draw version
UInt_t CalculateColorsHash()
Calculate hash function for all colors and palette.
void SetWindowGeometry(const std::vector< int > &arr)
Set window geometry as array with coordinates and dimensions.
Bool_t HasStatusBar() const override
Returns kTRUE if web canvas has status bar.
static std::vector< std::string > gCustomClasses
! list of custom classes, which can be delivered as is to client
void CreateWebWindow()
Create web window for the canvas.
void Close() override
Close web canvas - not implemented.
static bool ProduceImages(std::vector< TPad * > pads, const char *filename, Int_t width=0, Int_t height=0)
Create images for several pads using batch (headless) capability of Chrome or Firefox browsers Suppor...
Bool_t HasMenuBar() const override
Returns kTRUE if web canvas has menu bar.
Int_t InitWindow() override
Initialize window for the web canvas At this place canvas is not yet register to the list of canvases...
void CheckPadModified(TPad *pad)
Returns true if any pad in the canvas were modified Reset modified flags, increment canvas version (i...
void RaiseWindow() override
Raise browser window.
static bool ProduceImage(TPad *pad, const char *filename, Int_t width=0, Int_t height=0)
Create image using batch (headless) capability of Chrome or Firefox browsers Supported png,...
void ActivateInEditor(TPad *pad, TObject *obj)
Activate object in editor in web browser.
std::vector< WebConn > fWebConn
! connections
PadSignal_t fActivePadChangedSignal
! signal emitted when active pad changed in the canvas
Bool_t GetLongerPolling() const
UInt_t fClientBits
! latest status bits from client like editor visible or not
std::function< void(TPadWebSnapshot *)> PadPaintingReady_t
Function called when pad painting produced.
Int_t fPaletteDelivery
! colors palette delivery 0:never, 1:once, 2:always, 3:per subpad
Bool_t fProcessingData
! flag used to prevent blocking methods when process data is invoked
Bool_t HasToolTips() const override
Returns kTRUE if tooltips are activated in web canvas.
std::vector< TPad * > fAllPads
! list of all pads recognized during streaming
friend class TWebCanvasTimer
TWebCanvasTimer * fTimer
! timer to submit control messages
static std::vector< std::string > gBatchJsons
! converted jsons batch job
Long64_t fCanvVersion
! actual canvas version, changed with every new Modified() call
std::vector< int > fWindowGeometry
! last received window geometry
TPad * ProcessObjectOptions(TWebObjectOptions &item, TPad *pad, int idcnt=1)
Process data for single primitive Returns object pad if object was modified.
std::map< TObject *, bool > fUsedObjs
! map of used objects during streaming
void AddColorsPalette(TPadWebSnapshot &master)
Add special canvas objects with list of colors and color palette.
Long64_t fStyleVersion
! current gStyle object version, checked every time when new snapshot created
static std::string gBatchMultiPdf
! name of current multi-page pdf file
static void BatchImageMode(UInt_t n=100)
Configure batch image mode for web graphics.
std::vector< std::unique_ptr< ROOT::RWebDisplayHandle > > fHelpHandles
! array of handles for help widgets
void AddSendQueue(unsigned connid, const std::string &msg)
Add message to send queue for specified connection If connid == 0, message will be add to all connect...
void SetWindowPosition(Int_t x, Int_t y) override
Set window position of web canvas.
UpdatedSignal_t fUpdatedSignal
! signal emitted when canvas updated or state is changed
Int_t fJsonComp
! compression factor for messages send to the client
static std::vector< int > gBatchWidths
! batch job widths
~TWebCanvas() override
Destructor.
static std::string ProcessCustomScripts(bool batch)
For batch mode special handling of scripts are required Headless browser not able to load modules fro...
Bool_t fReadOnly
!< configured display
std::map< TPad *, PadStatus > fPadsStatus
! map of pads in canvas and their status flags
static Font_t AddFont(const char *name, const char *ttffile, Int_t precision=2)
Add font to static list of fonts supported by the canvas Name specifies name of the font,...
void AddCustomFonts(TPadWebSnapshot &master)
Add special canvas objects with custom fonts.
Bool_t CheckDataToSend(unsigned connid=0)
Check if any data should be send to client If connid != 0, only selected connection will be checked.
Bool_t PerformUpdate(Bool_t async) override
if canvas or any subpad was modified, scan all primitives in the TCanvas and subpads and convert them...
void AssignStatusBits(UInt_t bits)
Assign clients bits.
virtual Bool_t ProcessData(unsigned connid, const std::string &arg)
Handle data from web browser Returns kFALSE if message was not processed.
void ProcessLinesForObject(TObject *obj, const std::string &lines)
Execute one or several methods for selected object String can be separated by ";;" to let execute sev...
TWebCanvas(TCanvas *c, const char *name, Int_t x, Int_t y, UInt_t width, UInt_t height, Bool_t readonly=kTRUE)
Constructor.
static std::vector< int > gBatchHeights
! batch job heights
static Int_t StoreCanvasJSON(TCanvas *c, const char *filename, const char *option="")
Create JSON painting output for given canvas and store into the file See TBufferJSON::ExportToFile() ...
static const std::string & GetCustomScripts()
Returns configured custom script.
void Iconify() override
Iconify browser window.
void SetWindowTitle(const char *newTitle) override
Set window title of web canvas.
UInt_t GetWindowGeometry(Int_t &x, Int_t &y, UInt_t &w, UInt_t &h) override
Returns window geometry including borders and menus.
static std::vector< std::string > gBatchFiles
! file names for batch job
static TCanvasImp * NewCanvas(TCanvas *c, const char *name, Int_t x, Int_t y, UInt_t width, UInt_t height)
Static method to create TWebCanvas instance Used by plugin manager.
static TString CreateCanvasJSON(TCanvas *c, Int_t json_compression=0, Bool_t batchmode=kFALSE)
Create JSON painting output for given canvas Produce JSON can be used for offline drawing with JSROOT...
Bool_t HasEditor() const override
Returns kTRUE if web canvas has graphical editor.
Int_t fStyleDelivery
! gStyle delivery to clients: 0:never, 1:once, 2:always
PadClickedSignal_t fPadDblClickedSignal
! signal emitted when simple mouse click performed on the pad
void ProcessExecs(TPad *pad, TExec *extra=nullptr)
Process TExec objects in the pad.
static bool FlushBatchImages()
Flush batch images.
void CreatePadSnapshot(TPadWebSnapshot &paddata, TPad *pad, Long64_t version, PadPaintingReady_t func)
Create snapshot for pad and all primitives Callback function is used to create JSON in the middle of ...
void CreateObjectSnapshot(TPadWebSnapshot &master, TPad *pad, TObject *obj, const char *opt, TWebPainting *masterps=nullptr)
Creates representation of the object for painting in web browser.
Bool_t CheckCanvasModified(bool force_modified=false)
Check if any pad on the canvas was modified If yes, increment version of correspondent pad Returns tr...
virtual Bool_t DecodePadOptions(const std::string &, bool process_execs=false)
Decode all pad options, which includes ranges plus objects options.
Int_t GetPaletteDelivery() const
void SetWindowSize(UInt_t w, UInt_t h) override
Set window size of web canvas.
static bool IsCustomClass(const TClass *cl)
Checks if class belongs to custom.
TObject * FindPrimitive(const std::string &id, int idcnt=1, TPad *pad=nullptr, TObjLink **objlnk=nullptr, TPad **objpad=nullptr)
Search of object with given id in list of primitives One could specify pad where search could be star...
Bool_t fFixedSize
! is canvas size fixed
Int_t GetStyleDelivery() const
Class used to transport drawing options from the client.
std::vector< double > fopt
custom float array
std::string fcust
custom string
std::string snapid
id of the object
std::string opt
drawing options
Implement TVirtualPadPainter which abstracts painting operations.
Object used to store paint operations and deliver them to JSROOT.
void AddColor(Int_t indx, TColor *col)
Add custom color to operations.
void AddOper(const std::string &oper)
Add next custom operator to painting Operations are separated by semicolons Following operations are ...
void SetClassName(const std::string &classname)
@ kSVG
list of SVG primitives
@ kColors
list of ROOT colors + palette
void SetSnapshot(Int_t kind, TObject *snapshot, Bool_t owner=kFALSE)
SetUse pointer to assign object id - TString::Hash.
void SetObjectIDAsPtr(void *ptr, const std::string &suffix="")
Use pointer to assign object id - TString::Hash.
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
Returns x raised to the power y.
WebFont_t(Int_t indx, const TString &name, const TString &fmt, const TString &data)