Ink coverage statistics

This commit is contained in:
Jakub Melka 2021-03-31 19:55:26 +02:00
parent 1bd4e9b53b
commit fb6de717f6
2 changed files with 82 additions and 5 deletions

View File

@ -52,6 +52,7 @@ void OutputPreviewWidget::clear()
m_pageSizeMM = QSizeF();
m_infoBoxItems.clear();
m_imagePointUnderCursor = std::nullopt;
m_inkCoverageMM.dirty();
update();
}
@ -70,6 +71,8 @@ void OutputPreviewWidget::setPageImage(QImage image, pdf::PDFFloatBitmapWithColo
}
}
m_inkCoverageMM.dirty();
buildInfoBoxItems();
update();
}
@ -215,7 +218,7 @@ int OutputPreviewWidget::getInfoBoxWidth() const
return 0;
}
return pdf::PDFWidgetUtils::scaleDPI_x(this, 150);
return pdf::PDFWidgetUtils::scaleDPI_x(this, 200);
}
int OutputPreviewWidget::getInfoBoxContentHorizontalMargin() const
@ -229,9 +232,9 @@ void OutputPreviewWidget::buildInfoBoxItems()
switch (m_displayMode)
{
case pdfplugin::OutputPreviewWidget::Separations:
case pdfplugin::OutputPreviewWidget::ColorWarningInkCoverage:
case pdfplugin::OutputPreviewWidget::ColorWarningRichBlack:
case Separations:
case ColorWarningInkCoverage:
case ColorWarningRichBlack:
{
if (m_originalProcessBitmap.getWidth() > 0 && m_originalProcessBitmap.getHeight() > 0)
{
@ -344,13 +347,40 @@ void OutputPreviewWidget::buildInfoBoxItems()
break;
}
case pdfplugin::OutputPreviewWidget::InkCoverage:
case InkCoverage:
break;
default:
Q_ASSERT(false);
break;
}
if (m_displayMode == Separations || m_displayMode == InkCoverage)
{
if (m_originalProcessBitmap.getWidth() > 0 && m_originalProcessBitmap.getHeight() > 0)
{
const pdf::PDFPixelFormat pixelFormat = m_originalProcessBitmap.getPixelFormat();
std::vector<pdf::PDFInkMapper::ColorInfo> separations = m_inkMapper->getSeparations(pixelFormat.getProcessColorChannelCount(), true);
const std::vector<pdf::PDFColorComponent>& inkCoverage = getInkCoverage();
if (!inkCoverage.empty() && inkCoverage.size() == separations.size())
{
addInfoBoxSeparator();
addInfoBoxHeader(tr("Ink Coverage"));
QLocale locale;
for (size_t i = 0; i < inkCoverage.size(); ++i)
{
const pdf::PDFColorComponent area = inkCoverage[i];
const QColor separationColor = separations[i].color;
const QString& name = separations[i].textName;
addInfoBoxColoredItem(separationColor, name, QString("%1 mm²").arg(locale.toString(area, 'f', 2)));
}
}
}
}
}
void OutputPreviewWidget::addInfoBoxHeader(QString caption)
@ -376,6 +406,47 @@ void OutputPreviewWidget::addInfoBoxColoredRect(QColor color)
m_infoBoxItems.push_back(InfoBoxItem(ColorOnly, color, QString(), QString()));
}
const std::vector<pdf::PDFColorComponent>& OutputPreviewWidget::getInkCoverage() const
{
return m_inkCoverageMM.get(this, &OutputPreviewWidget::getInkCoverageImpl);
}
std::vector<pdf::PDFColorComponent> OutputPreviewWidget::getInkCoverageImpl() const
{
std::vector<pdf::PDFColorComponent> result;
if (m_originalProcessBitmap.getWidth() > 0 && m_originalProcessBitmap.getHeight() > 0)
{
pdf::PDFPixelFormat pixelFormat = m_originalProcessBitmap.getPixelFormat();
pdf::PDFColorComponent totalArea = m_pageSizeMM.width() * m_pageSizeMM.height();
pdf::PDFColorComponent pixelArea = totalArea / pdf::PDFColorComponent(m_originalProcessBitmap.getWidth() * m_originalProcessBitmap.getHeight());
const uint8_t colorChannelCount = pixelFormat.getColorChannelCount();
result.resize(colorChannelCount, 0.0f);
for (size_t y = 0; y < m_originalProcessBitmap.getHeight(); ++y)
{
for (size_t x = 0; x < m_originalProcessBitmap.getWidth(); ++x)
{
const pdf::PDFConstColorBuffer buffer = m_originalProcessBitmap.getPixel(x, y);
const pdf::PDFColorComponent alpha = pixelFormat.hasOpacityChannel() ? buffer[pixelFormat.getOpacityChannelIndex()] : 1.0f;
for (uint8_t i = 0; i < colorChannelCount; ++i)
{
result[i] += buffer[i] * alpha;
}
}
}
for (uint8_t i = 0; i < colorChannelCount; ++i)
{
result[i] *= pixelArea;
}
}
return result;
}
QColor OutputPreviewWidget::getAlarmColor() const
{
return m_alarmColor;

View File

@ -79,6 +79,10 @@ private:
void addInfoBoxColoredItem(QColor color, QString caption, QString value);
void addInfoBoxColoredRect(QColor color);
const std::vector<pdf::PDFColorComponent>& getInkCoverage() const;
std::vector<pdf::PDFColorComponent> getInkCoverageImpl() const;
enum InfoBoxStyle
{
Header,
@ -110,6 +114,8 @@ private:
QColor m_alarmColor;
std::optional<QPoint> m_imagePointUnderCursor;
mutable pdf::PDFCachedItem<std::vector<pdf::PDFColorComponent>> m_inkCoverageMM;
QImage m_pageImage;
pdf::PDFFloatBitmapWithColorSpace m_originalProcessBitmap;
QSizeF m_pageSizeMM;