X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Fdebugscript.cpp;h=59631aa79b7083ad8d2e31f0065cf05723c5f7b4;hp=7ca6d9830f8c54ed1bcdff48e5f50f54076a0e9a;hb=c786732a062b493be1e53c0223d7cb1858fd3d0f;hpb=ec45b44e3a44e12463c63ec09d63c648602ce866 diff --git a/src/debugscript.cpp b/src/debugscript.cpp index 7ca6d98..59631aa 100644 --- a/src/debugscript.cpp +++ b/src/debugscript.cpp @@ -3,11 +3,17 @@ #include using namespace IPDF; +using namespace std; -void DebugScript::ParseAction() +void DebugScript::ParseAction(View * view, Screen * scr) { + if (m_input == NULL || !m_input->good()) + return; + istream & inp = *m_input; + Debug("Get action type..."); std::string actionType; inp >> actionType; + Debug("Action type: %s", actionType.c_str()); // Skip comments while (actionType[0] == '#') { @@ -118,6 +124,55 @@ void DebugScript::ParseAction() currentAction.type = AT_DebugFont; inp >> currentAction.textargs; } + else if (actionType == "approachz") // approach zenoistically + { + currentAction.type = AT_ApproachBoundsZeno; + std::string _x, _y, _w, _h, _z; + inp >> _x >> _y >> _w >> _h >> _z; + currentAction.x = RealFromStr(_x.c_str()); + currentAction.y = RealFromStr(_y.c_str()); + currentAction.w = RealFromStr(_w.c_str()); + currentAction.h = RealFromStr(_h.c_str()); + currentAction.z = RealFromStr(_z.c_str()); + } + else if (actionType == "approachl") // approach linearly + { + currentAction.type = AT_ApproachBoundsLinear; + std::string _x, _y, _w, _h, _z; + inp >> _x >> _y >> _w >> _h >> _z; + currentAction.x = RealFromStr(_x.c_str()); + currentAction.y = RealFromStr(_y.c_str()); + currentAction.w = RealFromStr(_w.c_str()); + currentAction.h = RealFromStr(_h.c_str()); + currentAction.z = RealFromStr(_z.c_str()); + currentAction.x = (currentAction.x - view->GetBounds().x)/currentAction.z; + currentAction.y = (currentAction.y - view->GetBounds().y)/currentAction.z; + currentAction.w = (currentAction.w - view->GetBounds().w)/currentAction.z; + currentAction.h = (currentAction.h - view->GetBounds().h)/currentAction.z; + } + else if (actionType == "setbounds") + { + currentAction.type = AT_SetBounds; + std::string _x, _y, _w, _h; + inp >> _x >> _y >> _w >> _h; + currentAction.x = RealFromStr(_x.c_str()); + currentAction.y = RealFromStr(_y.c_str()); + currentAction.w = RealFromStr(_w.c_str()); + currentAction.h = RealFromStr(_h.c_str()); + } + else if (actionType == "querygpubounds") + { + currentAction.type = AT_QueryGPUBounds; + inp >> currentAction.textargs; + currentAction.loops = 1; + } + else if (actionType == "screenshot") + { + currentAction.type = AT_ScreenShot; + inp >> currentAction.textargs; + } + else + Fatal("Unknown action %s", actionType.c_str()); } @@ -127,7 +182,7 @@ bool DebugScript::Execute(View *view, Screen *scr) { if (m_index >= m_actions.size()) { - ParseAction(); + ParseAction(view, scr); if (m_labels.size() > 0) { m_actions.push_back(currentAction); @@ -217,6 +272,79 @@ bool DebugScript::Execute(View *view, Screen *scr) scr->ShowDebugFont(currentAction.textargs == "1" || currentAction.textargs == "on"); currentAction.loops = 1; break; + + case AT_ApproachBoundsZeno: + { + VRect target(currentAction.x, currentAction.y, currentAction.w, currentAction.h); + if (currentAction.z != VReal(1)) + { + target.x = view->GetBounds().x + (target.x-view->GetBounds().x)/VReal(currentAction.z); + target.y = view->GetBounds().y + (target.y-view->GetBounds().y)/VReal(currentAction.z); + target.w = view->GetBounds().w + (target.w-view->GetBounds().w)/VReal(currentAction.z); + target.h = view->GetBounds().h + (target.h-view->GetBounds().h)/VReal(currentAction.z); + } + + + VReal s = target.w/(view->GetBounds().w); + if (Real(s) != 1) + { + VReal x0; + VReal y0; + x0 = (view->GetBounds().x - target.x)/((s - VReal(1))*view->GetBounds().w); + y0 = (view->GetBounds().y - target.y)/((s - VReal(1))*view->GetBounds().h); + view->ScaleAroundPoint(x0, y0, s); + currentAction.loops++; + } + else + { + Debug("Already at target view; Waiting for remaining %d frames", currentAction.loops); + currentAction.type = AT_WaitFrame; + } + break; + } + case AT_ApproachBoundsLinear: + { + VRect target(currentAction.x, currentAction.y, currentAction.w, currentAction.h); + target.x += view->GetBounds().x; + target.y += view->GetBounds().y; + target.w += view->GetBounds().w; + target.h += view->GetBounds().h; + VReal s = target.w/(view->GetBounds().w); + if (Real(s) != 1) + { + VReal x0; + VReal y0; + x0 = (view->GetBounds().x - target.x)/((s - VReal(1))*view->GetBounds().w); + y0 = (view->GetBounds().y - target.y)/((s - VReal(1))*view->GetBounds().h); + view->ScaleAroundPoint(x0, y0, s); + currentAction.loops++; + } + else + { + Debug("Already at target view; Waiting for remaining %d frames", currentAction.loops); + currentAction.type = AT_WaitFrame; + } + break; + } + case AT_SetBounds: + { + VRect target(currentAction.x, currentAction.y, currentAction.w, currentAction.h); + view->SetBounds(target); + break; + } + + case AT_QueryGPUBounds: + { + view->QueryGPUBounds(currentAction.textargs.c_str(), "w"); + currentAction.loops = 1; + break; + } + case AT_ScreenShot: + { + view->SaveBMP(currentAction.textargs.c_str()); + currentAction.loops = 1; + break; + } default: Fatal("Unknown script command in queue."); } @@ -240,12 +368,14 @@ void DebugScript::PrintPerformance(View * view, Screen * scr) now.view_bounds = view->GetBounds(); // object_count clock delta_clock x Log10(x) y Log10(y) w Log10(w) Size(w) - printf("%d\t%lu\t%lu\t%s\t%f\t%s\t%f\t%s\t%f\t%lu\n", - now.object_count, (uint64_t)now.clock, - (uint64_t)(now.clock - m_perf_last.clock), - Str(now.view_bounds.x).c_str(), Log10(now.view_bounds.x), - Str(now.view_bounds.y).c_str(), Log10(now.view_bounds.y), - Str(now.view_bounds.w).c_str(), Log10(now.view_bounds.w), - Size(now.view_bounds.w)); + #ifdef QUADTREE_DISABLED + printf("%d\t%llu\t%llu\t%s\t%s\t%s\t%s\t%s\t%s\t%u\n", + now.object_count, (long long unsigned)now.clock, + (long long unsigned)(now.clock - m_perf_last.clock), + Str(now.view_bounds.x).c_str(), Str(Log10(Abs(now.view_bounds.x))).c_str(), + Str(now.view_bounds.y).c_str(), Str(Log10(Abs(now.view_bounds.y))).c_str(), + Str(now.view_bounds.w).c_str(), Str(Log10(now.view_bounds.w)).c_str(), + (unsigned)Size(now.view_bounds.w)); + #endif m_perf_last = now; }