@@ -0,0 +1,51 @@
#include "histogram.h"

#include <QValueAxis>

Histogram::Histogram() {
setTitle("current histogram");

for(int i = 0; i < BIN_COUNT; i++){
mRedSet->append(0);
mGreenSet->append(0);
mBlueSet->append(0);
}

QBarSeries* mSeries = new QBarSeries();
mSeries->append(mRedSet);
mSeries->append(mGreenSet);
mSeries->append(mBlueSet);
addSeries(mSeries);

// set up axes
QValueAxis* yAxis = new QValueAxis();
yAxis->setMax(10000);
yAxis->setMin(0);


// set up fps chart
legend()->hide();
createDefaultAxes();
setAxisY(yAxis, mSeries);
}

void Histogram::update(const Magick::Image &data, int pixelCount) {
uint32_t histValues[3][BIN_COUNT];
memset(histValues, 0, 3*BIN_COUNT);

for(int i = 0; i < pixelCount; i++) {
// retrieve rgb data from the line
Magick::ColorRGB pixel = data.pixelColor(i, 0);

histValues[0][BIN_COUNT * (int) pixel.red()]++;
histValues[1][BIN_COUNT * (int) pixel.green()]++;
histValues[2][BIN_COUNT * (int) pixel.blue()]++;
}

for(int i = 0; i < BIN_COUNT; i++){
mRedSet->replace(i, histValues[0][i]);
mGreenSet->replace(i, histValues[1][i]);
mBlueSet->replace(i, histValues[2][i]);
}
}

@@ -0,0 +1,28 @@
#ifndef HISTOGRAM_H
#define HISTOGRAM_H

#include <QChart>
#include <QBarSeries>
#include <QBarSet>
#include <QChartView>

// using namespace qtcharts
QT_CHARTS_USE_NAMESPACE

#include <ImageMagick-6/Magick++.h>
#include <ImageMagick-6/magick/image.h>

class Histogram : public QChart {
public:
Histogram();
void update(const Magick::Image& data, int pixelCount);
private:
QBarSet* mRedSet = new QBarSet("red");
QBarSet* mGreenSet = new QBarSet("green");
QBarSet* mBlueSet = new QBarSet("blue");
QBarSeries mSeries;

const int BIN_COUNT = 16;
};

#endif // HISTOGRAM_H
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>421</width>
<height>495</height>
<width>384</width>
<height>412</height>
</rect>
</property>
<property name="windowTitle">
@@ -16,186 +16,171 @@
<widget class="QWidget" name="centralWidget">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QGroupBox" name="groupBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>LED config</string>
</property>
<layout class="QFormLayout" name="formLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Horizontal count</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="xLedSpin">
<property name="suffix">
<string/>
</property>
<property name="maximum">
<number>1000000</number>
</property>
<property name="value">
<number>60</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Vertical count</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="yLedSpin">
<property name="suffix">
<string/>
</property>
<property name="maximum">
<number>1000000</number>
</property>
<property name="value">
<number>18</number>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Resulting LED count</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="ledCountLabel">
<property name="text">
<string>156</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>Configuration</string>
<string>Screen config</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>LEDs</string>
</property>
<layout class="QFormLayout" name="formLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Horizontal count</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="xLedSpin">
<property name="suffix">
<string/>
</property>
<property name="maximum">
<number>1000000</number>
</property>
<property name="value">
<number>60</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Vertical count</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="yLedSpin">
<property name="suffix">
<string/>
</property>
<property name="maximum">
<number>1000000</number>
</property>
<property name="value">
<number>18</number>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Resulting LED count</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="ledCountLabel">
<property name="text">
<string>156</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>Screen</string>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Width</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="resolutionWidthSpinbox">
<property name="maximum">
<number>1000000</number>
</property>
<property name="value">
<number>1920</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Height</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="resolutionHeightSpinbox">
<property name="maximum">
<number>999997</number>
</property>
<property name="value">
<number>1080</number>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>X offset</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="xOffsetSpinbox">
<property name="maximum">
<number>1000000000</number>
</property>
<property name="value">
<number>1024</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Y offset</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QSpinBox" name="yOffsetSpinbox">
<property name="maximum">
<number>1000000000</number>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Letterboxing width</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QSpinBox" name="letterboxingWidthSpinBox">
<property name="maximum">
<number>1000000000</number>
</property>
<property name="value">
<number>240</number>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
<string>Letterboxing height</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QSpinBox" name="letterboxingHeightSpinBox">
<property name="maximum">
<number>1000000000</number>
</property>
</widget>
</item>
</layout>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Width</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="resolutionWidthSpinbox">
<property name="maximum">
<number>1000000</number>
</property>
<property name="value">
<number>1920</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Height</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="resolutionHeightSpinbox">
<property name="maximum">
<number>999997</number>
</property>
<property name="value">
<number>1080</number>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>X offset</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="xOffsetSpinbox">
<property name="maximum">
<number>1000000000</number>
</property>
<property name="value">
<number>1024</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Y offset</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QSpinBox" name="yOffsetSpinbox">
<property name="maximum">
<number>1000000000</number>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Letterboxing width</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QSpinBox" name="letterboxingWidthSpinBox">
<property name="maximum">
<number>1000000000</number>
</property>
<property name="value">
<number>240</number>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
<string>Letterboxing height</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QSpinBox" name="letterboxingHeightSpinBox">
<property name="maximum">
<number>1000000000</number>
</property>
</widget>
</item>
</layout>
@@ -214,24 +199,6 @@
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menuBar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>421</width>
<height>22</height>
</rect>
</property>
</widget>
<widget class="QToolBar" name="mainToolBar">
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
</attribute>
<attribute name="toolBarBreak">
<bool>false</bool>
</attribute>
</widget>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
@@ -32,6 +32,10 @@ class AmbiRgbLineProvider : public RgbLineProvider {
*/
float getData(uint8_t *resultSpace) override;

std::unique_ptr<Magick::Image> getLastLineImage(){
return move(mLastLineImage);
}

std::shared_ptr<BorderProvider> getBorderProvider(){
return mBorderProvider;
}
@@ -69,6 +73,8 @@ class AmbiRgbLineProvider : public RgbLineProvider {
Magick::Image mRightImage, mTopImage, mLeftImage, mBottomImage;
///@}

std::unique_ptr<Magick::Image> mLastLineImage;///!< last complete border image, scaled down

Magick::Geometry mHorizontalLedGeometry;///!< horizontal scaling target geometry

Magick::Geometry mVerticalLedGeometry; ///!< vertical scaling target geometry
@@ -91,6 +91,8 @@ void AmbiRgbLineProvider::imageToRgb(std::unique_ptr<Image> lineBorder, uint8_t
result[i * 3 + 2] = (255 * data.blue());
//cout << "R" << to_string(result[i + 0]) << " G" << to_string(result[i + 1]) << " B" << to_string(result[i + 2]) << std::endl;
}

mLastLineImage = move(lineBorder);
}

void AmbiRgbLineProvider::debugSaveBorders() {