ImProcCoordinator::updateVectorscope(): fix crash caused by large stack allocation, speedup, fixed scaling from [0;255] to [0;65535] range
This commit is contained in:
parent
e247a1e086
commit
07d26c16ed
@ -45,7 +45,8 @@
|
|||||||
#ifdef _OPENMP
|
#ifdef _OPENMP
|
||||||
#include <omp.h>
|
#include <omp.h>
|
||||||
#endif
|
#endif
|
||||||
|
#define BENCHMARK
|
||||||
|
#include "StopWatch.h"
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -1855,57 +1856,53 @@ void ImProcCoordinator::updateVectorscope()
|
|||||||
if (!workimg) {
|
if (!workimg) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
BENCHFUN
|
||||||
int x1, y1, x2, y2;
|
int x1, y1, x2, y2;
|
||||||
params->crop.mapToResized(pW, pH, scale, x1, x2, y1, y2);
|
params->crop.mapToResized(pW, pH, scale, x1, x2, y1, y2);
|
||||||
|
|
||||||
constexpr int size = VECTORSCOPE_SIZE;
|
constexpr int size = VECTORSCOPE_SIZE;
|
||||||
memset((int*)vectorscope, 0, size * size * sizeof(vectorscope[0][0]));
|
memset((int*)vectorscope, 0, size * size * sizeof(vectorscope[0][0]));
|
||||||
|
|
||||||
const int lab_img_size = (hListener->vectorscopeType() == 1) ? (x2 - x1) * (y2 - y1) : 0;
|
|
||||||
float a[lab_img_size], b[lab_img_size];
|
|
||||||
if (lab_img_size) {
|
|
||||||
float L[lab_img_size];
|
|
||||||
ipf.rgb2lab(*workimg, x1, y1, x2 - x1, y2 - y1, L, a, b, params->icm);
|
|
||||||
}
|
|
||||||
|
|
||||||
int ofs_lab = 0;
|
|
||||||
for (int i = y1; i < y2; i++) {
|
|
||||||
int ofs = (i * pW + x1) * 3;
|
|
||||||
|
|
||||||
for (int j = x1; j < x2; j++) {
|
|
||||||
switch (hListener->vectorscopeType()) {
|
|
||||||
case 0: {
|
|
||||||
// HS
|
|
||||||
int red = 256 * workimg->data[ofs++];
|
|
||||||
int green = 256 * workimg->data[ofs++];
|
|
||||||
int blue = 256 * workimg->data[ofs++];
|
|
||||||
float h, s, l;
|
|
||||||
Color::rgb2hsl(red, green, blue, h, s, l);
|
|
||||||
const int col = s * cos(2 * RT_PI * h) * (size / 2) + size / 2;
|
|
||||||
const int row = s * sin(2 * RT_PI * h) * (size / 2) + size / 2;
|
|
||||||
if (col >= 0 && col < size && row >= 0 && row < size) {
|
|
||||||
vectorscope[row][col]++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 1: {
|
|
||||||
// CH
|
|
||||||
const int col = (size / 96000.0) * a[ofs_lab] + size / 2;
|
|
||||||
const int row = (size / 96000.0) * b[ofs_lab] + size / 2;
|
|
||||||
|
|
||||||
if (col >= 0 && col < size && row >= 0 && row < size) {
|
|
||||||
vectorscope[row][col]++;
|
|
||||||
}
|
|
||||||
ofs_lab++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
vectorscopeScale = (x2 - x1) * (y2 - y1);
|
vectorscopeScale = (x2 - x1) * (y2 - y1);
|
||||||
|
const int lab_img_size = (hListener->vectorscopeType() == 1) ? vectorscopeScale : 0;
|
||||||
|
|
||||||
|
std::unique_ptr<float[]> a;
|
||||||
|
std::unique_ptr<float[]> b;
|
||||||
|
if (lab_img_size) {
|
||||||
|
a.reset(new float[lab_img_size]);
|
||||||
|
b.reset(new float[lab_img_size]);
|
||||||
|
std::unique_ptr<float []> L(new float[lab_img_size]);
|
||||||
|
ipf.rgb2lab(*workimg, x1, y1, x2 - x1, y2 - y1, L.get(), a.get(), b.get(), params->icm);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hListener->vectorscopeType() == 0) { // HS
|
||||||
|
for (int i = y1; i < y2; ++i) {
|
||||||
|
int ofs = (i * pW + x1) * 3;
|
||||||
|
for (int j = x1; j < x2; ++j) {
|
||||||
|
const float red = 257.f * workimg->data[ofs++];
|
||||||
|
const float green = 257.f * workimg->data[ofs++];
|
||||||
|
const float blue = 257.f * workimg->data[ofs++];
|
||||||
|
float h, s, l;
|
||||||
|
Color::rgb2hslfloat(red, green, blue, h, s, l);
|
||||||
|
const auto sincosval = xsincosf(2.f * RT_PI_F * h);
|
||||||
|
const int col = s * sincosval.y * (size / 2) + size / 2;
|
||||||
|
const int row = s * sincosval.x * (size / 2) + size / 2;
|
||||||
|
if (col >= 0 && col < size && row >= 0 && row < size) {
|
||||||
|
vectorscope[row][col]++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (hListener->vectorscopeType() == 1) { // CH
|
||||||
|
for (int i = y1; i < y2; ++i) {
|
||||||
|
for (int j = x1, ofs_lab = (i - y1) * (x2 - x1); j < x2; ++j, ++ofs_lab) {
|
||||||
|
const int col = (size / 96000.f) * a[ofs_lab] + size / 2;
|
||||||
|
const int row = (size / 96000.f) * b[ofs_lab] + size / 2;
|
||||||
|
if (col >= 0 && col < size && row >= 0 && row < size) {
|
||||||
|
vectorscope[row][col]++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImProcCoordinator::updateWaveforms()
|
void ImProcCoordinator::updateWaveforms()
|
||||||
|
@ -350,7 +350,7 @@ public:
|
|||||||
/** Returns if the listener wants the waveform to be updated. */
|
/** Returns if the listener wants the waveform to be updated. */
|
||||||
virtual bool updateWaveform(void) = 0;
|
virtual bool updateWaveform(void) = 0;
|
||||||
/** Returns the vectorscope type: 0 for H-S and 1 for H-C. */
|
/** Returns the vectorscope type: 0 for H-S and 1 for H-C. */
|
||||||
virtual int vectorscopeType(void) = 0;
|
virtual int vectorscopeType(void) const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class HistogramObservable
|
class HistogramObservable
|
||||||
|
@ -2289,7 +2289,7 @@ bool EditorPanel::updateWaveform(void)
|
|||||||
|| histogram_scope_type == HistogramPanelListener::NONE;
|
|| histogram_scope_type == HistogramPanelListener::NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int EditorPanel::vectorscopeType(void)
|
int EditorPanel::vectorscopeType(void) const
|
||||||
{
|
{
|
||||||
switch (histogram_scope_type) {
|
switch (histogram_scope_type) {
|
||||||
case HistogramPanelListener::VECTORSCOPE_HS:
|
case HistogramPanelListener::VECTORSCOPE_HS:
|
||||||
|
@ -146,7 +146,7 @@ public:
|
|||||||
bool updateHistogram(void) override;
|
bool updateHistogram(void) override;
|
||||||
bool updateVectorscope(void) override;
|
bool updateVectorscope(void) override;
|
||||||
bool updateWaveform(void) override;
|
bool updateWaveform(void) override;
|
||||||
int vectorscopeType(void) override;
|
int vectorscopeType(void) const override;
|
||||||
|
|
||||||
// HistogramPanelListener
|
// HistogramPanelListener
|
||||||
void scopeTypeChanged(ScopeType new_type) override;
|
void scopeTypeChanged(ScopeType new_type) override;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user