// Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef THIRD_PARTY_QUIC_TRACE_TOOLS_TRACE_PROGRAM_H_ #define THIRD_PARTY_QUIC_TRACE_TOOLS_TRACE_PROGRAM_H_ #include "absl/time/time.h" #include "quic_trace/quic_trace.pb.h" #include "tools/render/axis_renderer.h" #include "tools/render/processed_trace.h" #include "tools/render/program_state.h" #include "tools/render/rectangle_renderer.h" #include "tools/render/sdl_util.h" #include "tools/render/table.h" #include "tools/render/text.h" #include "tools/render/trace_renderer.h" namespace quic_trace { namespace render { // The framerate with respect to which all of the animations are scaled. Equal // to 60 frames per second. constexpr absl::Duration kReferenceFrameDuration = absl::Microseconds(16667); // Top-level code for the trace rendering tool. Handles loading the trace from // proto, the rendering and event loop, and the input events themselves. class TraceProgram { public: TraceProgram(); // Loads the trace into the renderer buffer. void LoadTrace(std::unique_ptr trace); // Handle events and redraw the trace accordingly. void Loop(); private: ProgramStateData state_; ScopedSDL sdl_; ScopedSdlWindow window_; OpenGlContext context_; std::unique_ptr trace_; std::unique_ptr state_buffer_; std::unique_ptr renderer_; std::unique_ptr text_renderer_; std::unique_ptr axis_renderer_; std::unique_ptr rectangle_renderer_; bool quit_ = false; // If true, panning is currently in progress. bool panning_ = false; vec2 panning_last_pos_; bool zooming_ = false; int zoom_start_x_; int zoom_start_y_; bool summary_ = false; int summary_start_x_; absl::optional summary_table_; bool show_online_help_ = false; // On OS X, the window has different size for rendering and for mouse input // purposes. This vector contains the factor we use to translate mouse // coordinates into the rendering coordinates. vec2 input_scale_; // An EWMA-filtered frame duration, used for scaling animations. absl::Duration frame_duration_ = kReferenceFrameDuration; // Scales a value with respect to framerate so that if you add |x| to some // variable every frame, the effect is always same numerically as if the // program is running at 60 frames per second. float ScaleAdditiveFactor(float x); // Same as above, except |k| is being multiplied instead of added. float ScaleMultiplicativeFactor(float k); // Zooms in or out, depending on the sign. For example, if |zoom| is +0.98, // the size of the viewport would be 98% of what it was before, and -0.98 // would perform an inverse transform. void Zoom(float zoom); void UpdateWindowSize(); // Handle input and window events. void PollEvents(); // Handle keyboard inputs. void PollKeyboard(); // Handle mouse inputs . void PollMouse(); // Handle panning via mouse. void HandlePanning(bool pressed, int x, int y); void HandleZooming(bool pressed, int x, int y); void HandleSummary(bool pressed, int x); void HandleMouseover(int x, int y); // Ensure that the currently rendered part of the trace stays within the // bounds of the trace. void EnsureBounds(); // Converts a relative coordinate window vector into an appropriate trace // coordinate vector. vec2 WindowToTraceRelative(vec2 vector); // Converts an absolute coordinate window vector into an appropriate trace // coordinate vector. vec2 WindowToTraceCoordinates(vec2 point); Box WindowToTraceCoordinates(Box box); Box TraceBounds(); // Shows the current framerate of the program in the corner if --show_fps is // enabled. void MaybeShowFramerate(); Table GenerateOnlineHelp(); // Draws all of the tables on the right side of the window. void DrawRightSideTables(); }; } // namespace render } // namespace quic_trace #endif // THIRD_PARTY_QUIC_TRACE_TOOLS_TRACE_PROGRAM_H_