Files
Renderive/YSGraphic_Core/plottable/AudioFrequent_p.h
T
2026-07-23 11:10:17 +08:00

69 lines
2.6 KiB
C++

#pragma once
#include "AudioFrequent.h"
#include "../RenderAble.h"
#include "../Axis/Axis_p.h"
#include "../Axis/TimeAxis.h"
#include "../Axis/TimeAxis_p.h"
#include "../base/PerformanceShower_p.h"
#include "../base/Plot_p.h"
namespace YSG {
struct AudioFrequentTempData : TempData {
std::list<double> mDataList;
};
struct AudioFrequentRenderState : RenderState, AudioFrequent_Prop {};
struct AudioFrequentPrivate : RenderData {
D_Ptr(AudioFrequent)
YSG::MutiRingBuffer mMutiBuffer;
void prepareData() override {
SpinLockGuard guard(&mBufferLock);
syncStatePipeline();
AudioFrequentRenderState *s = renderState();
AudioFrequentTempData *d = renderTempData();
if(mMutiBuffer.buffers.empty() || mMutiBuffer.n != s->timePointSize) {
mMutiBuffer.resize({sizeof(double)}, s->timePointSize, s->timePointSize * 10);
PerformanceShower *shower = q()->mPlot->d->mShower;
if(shower) {
shower->mInfoMap["TimePointSize"] = PerformanceLine(QString("timePointSize:%1")
.arg(s->timePointSize));
}
}
for(double& power : d->mDataList) {
mMutiBuffer.pushData({&power});
}
d->mDataList.clear();
}
void draw(QPainter* painter) override {
AudioFrequentRenderState *s = renderState();
PerformanceShower *shower = q()->mPlot->d->mShower;
if(shower) {
shower->mInfoMap["timePointSize"] = PerformanceLine(QString("timePointSize:%1")
.arg(s->timeAxis->timePointSize()));
}
painter->save();
AudioFrequentTempData *d = renderTempData();
QPolygonF polyline;
int start = (int)s->timeAxis->startCoord();
QPen newPen = QPen(s->color);
newPen.setWidth(0);
painter->setPen(newPen);
auto l1 = mMutiBuffer.buffers[0].list<double>();
for(int i = 0; i < mMutiBuffer.buffers[0].f; ++i) {
double* power = l1 + i;
int index = s->timeAxis->d()->mTimeTicker.mStartCoordToEndCoord ? start + i :
start + s->timeAxis->d()->mTimeTicker.mTimePointSize - i;
double x = s->timeAxis->coordToPixel(index, SRC::Render);
double y = s->valueAxis->coordToPixel(*power, SRC::Render);
polyline.append({x, y});
}
painter->drawPolyline(polyline);
painter->restore();
}
};
}