#include "../Axis/Time_Axis.h" #include "Frequency_Trace_p.h" #include "../base/Memory.h" namespace renderive { RENDERIVE_DEFINE_RENDERABLE_BINDING(Frequency_Trace, Frequency_Trace_Private, Frequency_Trace_Render_State, Frequency_Trace_Input_Data, "Frequency_Trace") std::shared_ptr Frequency_Trace::time_axis() { return d()->edit_state_value(&Frequency_Trace_Render_State::time_axis).lock(); } void Frequency_Trace::set_time_axis(std::shared_ptr value) { d()->set_state_value(&Frequency_Trace_Render_State::time_axis, std::weak_ptr(value)); } std::shared_ptr Frequency_Trace::value_axis() { return d()->edit_state_value(&Frequency_Trace_Render_State::value_axis).lock(); } void Frequency_Trace::set_value_axis(std::shared_ptr value) { d()->set_state_value(&Frequency_Trace_Render_State::value_axis, std::weak_ptr(value)); } Frequency_Trace::Builder::Builder(std::shared_ptr parent, std::shared_ptr time_axis, std::shared_ptr value_axis) { ASSERT(parent && parent->attached_to_plot(), "Audio_Frequency build error! parent invalid"); ASSERT(time_axis && value_axis, "Audio_Frequency build error! axis == nullptr"); ASSERT(time_axis->attached_to_plot(), "Audio_Frequency build error! time_axis->plot == nullptr"); ASSERT(time_axis->shares_plot_with(*value_axis), "Audio_Frequency build error! time_axis->plot != value_axis->plot"); ASSERT(parent->shares_plot_with(*time_axis), "Audio_Frequency build error! parent->plot != time_axis->plot"); ASSERT(time_axis->orientation() != value_axis->orientation(), "Audio_Frequency build error! axes must be orthogonal"); this->parent = parent; this->time_axis = time_axis; this->value_axis = value_axis; } std::shared_ptr Frequency_Trace::Builder::build() { auto ret = renderive::make_shared(); ret->init(parent); Frequency_Trace_Private* pd = ret->d(); Render_Edit_Lease edit(pd); Frequency_Trace_Render_State* sc = edit.operator->(); PROP_R(std::weak_ptr, time_axis) PROP_R(std::weak_ptr, value_axis) sc->pen = Pen{.color = color, .width = 1.0}; return ret; } void Frequency_Trace::append_sample(int tick, double data) { if (!ok()) return; Render_Input_Lease input(d()); input->push(tick, data); } void Frequency_Trace::append_sample(Time_Of_Day time, double data) { if (!ok()) return; auto axis = time_axis(); if (!axis) return; auto stream = axis->timeline_stream(); if (!stream) return; int tick = stream->append_time(time); Render_Input_Lease input(d()); input->push(tick, data); } } // namespace renderive