核心模板架构
This commit is contained in:
@@ -237,14 +237,14 @@ void Spectrum_Private::update_frequency_point_size(int frequency_point_size, Ran
|
||||
frequency[i] = cur;
|
||||
}
|
||||
}
|
||||
void Spectrum_Private::set_frequency_data(std::pmr::vector<double>& line_data, const std::pmr::vector<double>* max_data, const std::pmr::vector<double>* min_data, const Spectrum_Render_State* s) {
|
||||
void Spectrum_Private::set_frequency_data(const std::pmr::vector<double>& line_data, const std::pmr::vector<double>* max_data, const std::pmr::vector<double>* min_data, const Spectrum_Render_State* s) {
|
||||
if (s->frequency_point_size <= 0)
|
||||
return;
|
||||
if (line_data.size() != s->frequency_point_size)
|
||||
return;
|
||||
if ((max_data && max_data->size() != s->frequency_point_size) || (min_data && min_data->size() != s->frequency_point_size))
|
||||
return;
|
||||
cur_powers.swap(line_data);
|
||||
cur_powers.assign(line_data.begin(), line_data.end());
|
||||
if (!has_power_data) {
|
||||
max_powers.assign(cur_powers.begin(), cur_powers.end());
|
||||
min_powers.assign(cur_powers.begin(), cur_powers.end());
|
||||
@@ -449,36 +449,44 @@ void Spectrum::update_samples(std::span<const double> line_data) {
|
||||
return;
|
||||
Spectrum_Private* pd = d();
|
||||
int frequency_point_size{};
|
||||
Range frequency_range{};
|
||||
Line_Interpolation_Mode interpolation_mode{};
|
||||
bool use_max_line{};
|
||||
bool use_min_line{};
|
||||
{
|
||||
Render_State_Lease<Spectrum_Private, Spectrum_Render_State> state(pd);
|
||||
frequency_point_size = state->frequency_point_size;
|
||||
frequency_range = state->frequency_range;
|
||||
interpolation_mode = state->interpolation_mode;
|
||||
use_max_line = state->max_hold_visible;
|
||||
use_min_line = state->min_hold_visible;
|
||||
}
|
||||
if (line_data.size() != frequency_point_size)
|
||||
return;
|
||||
Render_Input_Lease<Spectrum_Private, Spectrum_Input_Data> input(pd);
|
||||
input->push(line_data, use_max_line, use_min_line);
|
||||
input->push(line_data, frequency_range, interpolation_mode, use_max_line, use_min_line);
|
||||
}
|
||||
void Spectrum::update_samples(std::pmr::vector<double>&& line_data) {
|
||||
if (!ok())
|
||||
return;
|
||||
Spectrum_Private* pd = d();
|
||||
int frequency_point_size{};
|
||||
Range frequency_range{};
|
||||
Line_Interpolation_Mode interpolation_mode{};
|
||||
bool use_max_line{};
|
||||
bool use_min_line{};
|
||||
{
|
||||
Render_State_Lease<Spectrum_Private, Spectrum_Render_State> state(pd);
|
||||
frequency_point_size = state->frequency_point_size;
|
||||
frequency_range = state->frequency_range;
|
||||
interpolation_mode = state->interpolation_mode;
|
||||
use_max_line = state->max_hold_visible;
|
||||
use_min_line = state->min_hold_visible;
|
||||
}
|
||||
if (line_data.size() != frequency_point_size)
|
||||
return;
|
||||
Render_Input_Lease<Spectrum_Private, Spectrum_Input_Data> input(pd);
|
||||
input->push(std::move(line_data), use_max_line, use_min_line);
|
||||
input->push(std::move(line_data), frequency_range, interpolation_mode, use_max_line, use_min_line);
|
||||
}
|
||||
Update_Ticket Spectrum::submit_data(std::span<const double> line_data) {
|
||||
auto update_state = make_update_state();
|
||||
@@ -488,11 +496,15 @@ Update_Ticket Spectrum::submit_data(std::span<const double> line_data) {
|
||||
}
|
||||
Spectrum_Private* pd = d();
|
||||
int frequency_point_size{};
|
||||
Range frequency_range{};
|
||||
Line_Interpolation_Mode interpolation_mode{};
|
||||
bool use_max_line{};
|
||||
bool use_min_line{};
|
||||
{
|
||||
Render_State_Lease<Spectrum_Private, Spectrum_Render_State> state(pd);
|
||||
frequency_point_size = state->frequency_point_size;
|
||||
frequency_range = state->frequency_range;
|
||||
interpolation_mode = state->interpolation_mode;
|
||||
use_max_line = state->max_hold_visible;
|
||||
use_min_line = state->min_hold_visible;
|
||||
}
|
||||
@@ -502,7 +514,7 @@ Update_Ticket Spectrum::submit_data(std::span<const double> line_data) {
|
||||
}
|
||||
{
|
||||
Render_Input_Lease<Spectrum_Private, Spectrum_Input_Data> input(pd);
|
||||
input->push(line_data, use_max_line, use_min_line);
|
||||
input->push(line_data, frequency_range, interpolation_mode, use_max_line, use_min_line);
|
||||
input.set_completion(update_state);
|
||||
}
|
||||
update_state->complete_until(Update_Stage::Input_Released);
|
||||
@@ -516,11 +528,15 @@ Update_Ticket Spectrum::submit_data(std::pmr::vector<double>&& line_data) {
|
||||
}
|
||||
Spectrum_Private* pd = d();
|
||||
int frequency_point_size{};
|
||||
Range frequency_range{};
|
||||
Line_Interpolation_Mode interpolation_mode{};
|
||||
bool use_max_line{};
|
||||
bool use_min_line{};
|
||||
{
|
||||
Render_State_Lease<Spectrum_Private, Spectrum_Render_State> state(pd);
|
||||
frequency_point_size = state->frequency_point_size;
|
||||
frequency_range = state->frequency_range;
|
||||
interpolation_mode = state->interpolation_mode;
|
||||
use_max_line = state->max_hold_visible;
|
||||
use_min_line = state->min_hold_visible;
|
||||
}
|
||||
@@ -530,7 +546,7 @@ Update_Ticket Spectrum::submit_data(std::pmr::vector<double>&& line_data) {
|
||||
}
|
||||
{
|
||||
Render_Input_Lease<Spectrum_Private, Spectrum_Input_Data> input(pd);
|
||||
input->push(std::move(line_data), use_max_line, use_min_line);
|
||||
input->push(std::move(line_data), frequency_range, interpolation_mode, use_max_line, use_min_line);
|
||||
input.set_completion(update_state);
|
||||
}
|
||||
update_state->complete_until(Update_Stage::Input_Released);
|
||||
@@ -605,6 +621,21 @@ void Spectrum::clear_marker_selection() {
|
||||
edit->un_select();
|
||||
}
|
||||
double Spectrum::power_at(double frequency, bool& ok) {
|
||||
return d()->get_y(frequency, ok, interpolation_mode());
|
||||
Spectrum_Private* pd = d();
|
||||
Render_Input_Read_Lease<Spectrum_Private, Spectrum_Input_Data> input(pd);
|
||||
if (!input || !input->has_data) {
|
||||
ok = false;
|
||||
return -1.0;
|
||||
}
|
||||
const auto& powers = input->cur_data;
|
||||
if (powers.size() < 2 || input->frequency_range.length() == 0.0 || !input->frequency_range.contains(frequency)) {
|
||||
ok = false;
|
||||
return -1.0;
|
||||
}
|
||||
double index = coordinate_to_source_index(input->frequency_range, powers.size(), frequency);
|
||||
ok = true;
|
||||
return interpolate_sample_value(index, powers.size(), input->interpolation_mode, [&powers](int i) {
|
||||
return powers.at(i);
|
||||
});
|
||||
}
|
||||
} // namespace renderive
|
||||
|
||||
Reference in New Issue
Block a user