// // Copyright 2019 The ANGLE 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. // // OverlayWidgets.h: // Defines the Overlay* widget classes and corresponding enums. // #ifndef LIBANGLE_OVERLAYWIDGETS_H_ #define LIBANGLE_OVERLAYWIDGETS_H_ #include "common/angleutils.h" #include "libANGLE/Overlay_autogen.h" namespace gl { class Overlay; class OverlayState; namespace overlay_impl { class AppendWidgetDataHelper; } // namespace overlay_impl enum class WidgetType { // Text types: // A total count of some event. Count, // A single line of ASCII text. Retains content until changed. Text, // A per-second value. PerSecond, // Graph types: // A graph of the last N values. RunningGraph, // A histogram of the last N values (values between 0 and 1). RunningHistogram, InvalidEnum, EnumCount = InvalidEnum, }; namespace overlay { class Widget { public: virtual ~Widget() {} protected: WidgetType type; // Whether this item should be drawn. bool enabled = false; // For text items, size of the font. This is a value in [0, overlay::kFontCount) which // determines the font size to use. int fontSize; // The area covered by the item, predetermined by the overlay class. Negative values // indicate offset from the left/bottom of the image. int32_t coords[4]; float color[4]; friend class gl::Overlay; friend class gl::OverlayState; friend class overlay_impl::AppendWidgetDataHelper; }; class Count : public Widget { public: ~Count() override {} void add(size_t n) { count += n; } void reset() { count = 0; } protected: size_t count = 0; friend class gl::Overlay; friend class overlay_impl::AppendWidgetDataHelper; }; class PerSecond : public Count { public: ~PerSecond() override {} protected: size_t lastPerSecondCount = 0; friend class gl::Overlay; friend class overlay_impl::AppendWidgetDataHelper; }; class Text : public Widget { public: ~Text() override {} void set(std::string &&str) { text = std::move(str); } protected: std::string text; friend class overlay_impl::AppendWidgetDataHelper; }; class RunningGraph : public Widget { public: // Out of line constructor to satisfy chromium-style. RunningGraph(size_t n); ~RunningGraph() override; void add(size_t n) { if (!ignoreFirstValue) { runningValues[lastValueIndex] += n; } } void next() { if (ignoreFirstValue) { ignoreFirstValue = false; } else { lastValueIndex = (lastValueIndex + 1) % runningValues.size(); runningValues[lastValueIndex] = 0; } } protected: std::vector runningValues; size_t lastValueIndex = 0; Text description; bool ignoreFirstValue = true; friend class gl::Overlay; friend class gl::OverlayState; friend class overlay_impl::AppendWidgetDataHelper; }; class RunningHistogram : public RunningGraph { public: RunningHistogram(size_t n) : RunningGraph(n) {} ~RunningHistogram() override {} void set(float n) { ASSERT(n >= 0.0f && n <= 1.0f); size_t rank = n == 1.0f ? runningValues.size() - 1 : static_cast(n * runningValues.size()); runningValues[lastValueIndex] = rank; } }; // If overlay is disabled, all the above classes would be replaced with Mock, turning them into // noop. class Mock { public: void reset() const {} template void set(T) const {} template void add(T) const {} void next() const {} }; } // namespace overlay } // namespace gl #endif // LIBANGLE_OVERLAYWIDGETS_H_