初步重构
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
#pragma once
|
||||
#include "Audio_Frequent.h"
|
||||
#include "../Renderable.h"
|
||||
#include "../Axis/Axis_p.h"
|
||||
#include "../Axis/Time_Axis.h"
|
||||
#include "../Axis/Time_Axis_p.h"
|
||||
#include "../base/Performance_Shower_p.h"
|
||||
#include "../base/Plot_p.h"
|
||||
namespace YSG {
|
||||
struct AudioFrequentInputData : Input_Data {
|
||||
std::list<double> mDataList;
|
||||
void clear() override {
|
||||
mDataList.clear();
|
||||
}
|
||||
};
|
||||
struct AudioFrequentRenderState : Render_State, AudioFrequent_Prop {};
|
||||
struct Audio_Frequent_Private : Typed_Render_Data<Audio_Frequent, AudioFrequentRenderState, AudioFrequentInputData> {
|
||||
friend class Audio_Frequent;
|
||||
Psc::StreamRingBuffer_ST buffer;
|
||||
std::vector<double> powerSnapshot;
|
||||
int dataCount{};
|
||||
int pointCount{};
|
||||
void resizePowerBuffer(int count) {
|
||||
pointCount = count;
|
||||
dataCount = 0;
|
||||
powerSnapshot.resize(count);
|
||||
buffer.init(sizeof(double) * count);
|
||||
}
|
||||
void pushPower(double power) {
|
||||
if (dataCount == pointCount) {
|
||||
double ignored;
|
||||
std::size_t len = sizeof(double);
|
||||
buffer.read(&ignored, len);
|
||||
--dataCount;
|
||||
}
|
||||
buffer.write(&power, sizeof(double));
|
||||
++dataCount;
|
||||
}
|
||||
void snapshotPowerBuffer() {
|
||||
buffer.peek_best_effort(powerSnapshot.data(), sizeof(double) * dataCount);
|
||||
}
|
||||
void prepare_data() override {
|
||||
sync_state_pipeline();
|
||||
AudioFrequentRenderState* s = render_state();
|
||||
AudioFrequentInputData* d = render_input_data();
|
||||
if (pointCount != s->time_point_size) {
|
||||
resizePowerBuffer(s->time_point_size);
|
||||
Performance_Shower* shower = q()->mPlot->d->mShower;
|
||||
if (shower) {
|
||||
shower->set_performance_line("TimePointSize", Performance_Line(QString("time_point_size:%1").arg(s->time_point_size)));
|
||||
}
|
||||
}
|
||||
for (double& power : d->mDataList) {
|
||||
pushPower(power);
|
||||
}
|
||||
snapshotPowerBuffer();
|
||||
clear_render_input();
|
||||
}
|
||||
void draw(QPainter* painter) override {
|
||||
AudioFrequentRenderState* s = render_state();
|
||||
Performance_Shower* shower = q()->mPlot->d->mShower;
|
||||
if (shower) {
|
||||
shower->set_performance_line("time_point_size", Performance_Line(QString("time_point_size:%1").arg(s->time_axis->time_point_size())));
|
||||
}
|
||||
painter->save();
|
||||
QPolygonF polyline;
|
||||
int start = (int)s->time_axis->start_coord();
|
||||
QPen newPen = QPen(s->color);
|
||||
newPen.setWidth(0);
|
||||
painter->setPen(newPen);
|
||||
for (int i = 0; i < dataCount; ++i) {
|
||||
double* power = powerSnapshot.data() + dataCount - 1 - i;
|
||||
int index = s->time_axis->d()->mTimeTicker.mStartCoordToEndCoord ? start + i : start + s->time_axis->d()->mTimeTicker.mTimePointSize - i;
|
||||
double x = s->time_axis->coord_to_pixel(index, SRC::Render);
|
||||
double y = s->value_axis->coord_to_pixel(*power, SRC::Render);
|
||||
polyline.append({x, y});
|
||||
}
|
||||
painter->drawPolyline(polyline);
|
||||
painter->restore();
|
||||
}
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user