#pragma once
#ifndef COMBOHISTOGRAM_H
#define COMBOHISTOGRAM_H
#include "tcommon.h"
#include "traster.h"
#include "ttoonzimage.h"
#include "tpalette.h"
#include <QWidget>
#include <QStackedWidget>
#undef DVAPI
#undef DVVAR
#ifdef TOONZQT_EXPORTS
#define DVAPI DV_EXPORT_API
#define DVVAR DV_EXPORT_VAR
#else
#define DVAPI DV_IMPORT_API
#define DVVAR DV_IMPORT_VAR
#endif
#ifdef _MSC_VER
#pragma warning(disable : 4251)
#endif
class QStackedWidget;
class QString;
class QComboBox;
class QColor;
class RGBLabel;
class QLabel;
#define COMBOHIST_RESOLUTION_W 256
#define COMBOHIST_RESOLUTION_H 100
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// 120405
//-----------------------------------------------------------------------------
class DVAPI ComboHistoRGBLabel final : public QWidget {
Q_OBJECT
public:
enum DisplayMode { Display_8bit = 0, Display_16bit, Display_0_1 };
private:
QColor m_color;
DisplayMode m_mode;
public:
ComboHistoRGBLabel(QColor color, QWidget *parent);
~ComboHistoRGBLabel() {}
void setColorAndUpdate(QColor color);
void setDisplayMode(DisplayMode mode) { m_mode = mode; }
protected:
void paintEvent(QPaintEvent *pe) override;
};
//-----------------------------------------------------------------------------
class DVAPI ChannelHistoGraph : public QWidget {
Q_OBJECT
QVector<int> m_values[2]; // 0: current raster 1: snapshot
int m_maxValue[2];
int m_pickedValue;
int m_channelIndex;
public:
bool *m_showComparePtr;
ChannelHistoGraph(int index, QWidget *parent = nullptr,
bool *showComparePtr = nullptr);
~ChannelHistoGraph();
virtual void setValues(int *buf, bool isComp);
void showCurrentChannelValue(int val);
protected:
void paintEvent(QPaintEvent *event) override;
};
//-----------------------------------------------------------------------------
class DVAPI RGBHistoGraph final : public ChannelHistoGraph {
Q_OBJECT
QVector<int> m_rgbValues[3];
QImage m_histoImg;
public:
RGBHistoGraph(int index, QWidget *parent = 0);
~RGBHistoGraph();
void setValues(int *buf, bool isComp) override;
protected:
void paintEvent(QPaintEvent *event) override;
};
//-----------------------------------------------------------------------------
class DVAPI ChannelColorBar final : public QWidget {
Q_OBJECT
QColor m_color;
public:
ChannelColorBar(QWidget *parent = 0, QColor m_color = QColor());
~ChannelColorBar() {}
protected:
void paintEvent(QPaintEvent *event) override;
};
//-----------------------------------------------------------------------------
class DVAPI ChannelHisto final : public QWidget {
Q_OBJECT
ChannelHistoGraph *m_histogramGraph;
ChannelColorBar *m_colorBar;
public:
ChannelHisto(int channelIndex, bool *showComparePtr, QWidget *parent = 0);
~ChannelHisto() {}
void refleshValue(int *buf, bool isComp = false) {
m_histogramGraph->setValues(buf, isComp);
}
void showCurrentChannelValue(int val);
protected slots:
void onShowAlphaButtonToggled(bool visible);
};
//-----------------------------------------------------------------------------
class DVAPI ComboHistogram final : public QWidget {
Q_OBJECT
TRasterP m_raster;
TPaletteP m_palette;
// rgba channels
int m_channelValue[4][COMBOHIST_RESOLUTION_W];
// rgba channels + composited
ChannelHisto *m_histograms[5];
ComboHistoRGBLabel *m_rgbLabel;
ComboHistoRGBLabel *m_rectAverageRgbLabel;
QLabel *m_xPosLabel;
QLabel *m_yPosLabel;
QComboBox *m_displayModeCombo;
bool m_showCompare;
bool m_compHistoIsValid;
int m_channelValueComp[4][COMBOHIST_RESOLUTION_W];
public:
ComboHistogram(QWidget *parent = 0);
~ComboHistogram();
TRasterP getRaster() const { return m_raster; }
void setRaster(const TRasterP &raster, const TPaletteP &palette = 0);
void updateInfo(const TPixel32 &pix, const TPointD &imagePos);
void updateInfo(const TPixel64 &pix, const TPointD &imagePos);
void updateAverageColor(const TPixel32 &pix);
void updateAverageColor(const TPixel64 &pix);
void updateCompHistogram();
void setShowCompare(bool on) {
m_showCompare = on;
if (isVisible() && !m_compHistoIsValid) updateCompHistogram();
}
void invalidateCompHisto() {
m_compHistoIsValid = false;
if (isVisible() && m_showCompare) updateCompHistogram();
}
protected:
void computeChannelsValue(int *buf, size_t size, TRasterP ras,
TPalette *extPlt = nullptr);
void showEvent(QShowEvent *) override;
protected slots:
void onDisplayModeChanged();
};
#endif