#pragma once #include namespace rack { namespace widget { /** Caches a widget's draw() result to a framebuffer so it is called less frequently. When `dirty` is true, its children will be re-rendered on the next call to step(). Events are not passed to the underlying scene. */ struct FramebufferWidget : Widget { /** Set this to true to re-render the children to the framebuffer the next time it is drawn */ bool dirty = true; bool bypass = false; float oversample = 1.0; NVGLUframebuffer* fb = NULL; /** Scale relative to the world */ math::Vec scale; /** Offset in world coordinates */ math::Vec offset; /** Pixel dimensions of the allocated framebuffer */ math::Vec fbSize; /** Bounding box in world coordinates of where the framebuffer should be painted. Always has integer coordinates so that blitting framebuffers is pixel-perfect. */ math::Rect fbBox; /** Framebuffer's scale relative to the world */ math::Vec fbScale; /** Framebuffer's subpixel offset relative to fbBox in world coordinates */ math::Vec fbOffset; FramebufferWidget(); ~FramebufferWidget(); void step() override; void draw(const DrawArgs& args) override; virtual void drawFramebuffer(); int getImageHandle(); }; } // namespace widget } // namespace rack