#include namespace rack { namespace widget { math::Vec ZoomWidget::getRelativeOffset(math::Vec v, Widget* ancestor) { // Transform `v` (which is in child coordinates) to local coordinates. v = v.mult(zoom); return Widget::getRelativeOffset(v, ancestor); } float ZoomWidget::getRelativeZoom(Widget* ancestor) { return zoom * Widget::getRelativeZoom(ancestor); } math::Rect ZoomWidget::getViewport(math::Rect r) { r.pos = r.pos.mult(zoom); r.size = r.size.mult(zoom); r = Widget::getViewport(r); r.pos = r.pos.div(zoom); r.size = r.size.div(zoom); return r; } float ZoomWidget::getZoom() { return zoom; } void ZoomWidget::setZoom(float zoom) { if (zoom == this->zoom) return; this->zoom = zoom; // Dispatch Dirty event widget::EventContext cDirty; DirtyEvent eDirty; eDirty.context = &cDirty; Widget::onDirty(eDirty); } void ZoomWidget::draw(const DrawArgs& args) { DrawArgs zoomCtx = args; zoomCtx.clipBox.pos = zoomCtx.clipBox.pos.div(zoom); zoomCtx.clipBox.size = zoomCtx.clipBox.size.div(zoom); // No need to save the state because that is done in the parent nvgScale(args.vg, zoom, zoom); Widget::draw(zoomCtx); } void ZoomWidget::drawLayer(const DrawArgs& args, int layer) { DrawArgs zoomCtx = args; zoomCtx.clipBox.pos = zoomCtx.clipBox.pos.div(zoom); zoomCtx.clipBox.size = zoomCtx.clipBox.size.div(zoom); // No need to save the state because that is done in the parent nvgScale(args.vg, zoom, zoom); Widget::drawLayer(zoomCtx, layer); } } // namespace widget } // namespace rack