mirror of
https://github.com/JakubMelka/PDF4QT.git
synced 2025-06-05 21:59:17 +02:00
Ink coverage statistics
This commit is contained in:
@ -52,6 +52,7 @@ void OutputPreviewWidget::clear()
|
|||||||
m_pageSizeMM = QSizeF();
|
m_pageSizeMM = QSizeF();
|
||||||
m_infoBoxItems.clear();
|
m_infoBoxItems.clear();
|
||||||
m_imagePointUnderCursor = std::nullopt;
|
m_imagePointUnderCursor = std::nullopt;
|
||||||
|
m_inkCoverageMM.dirty();
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,6 +71,8 @@ void OutputPreviewWidget::setPageImage(QImage image, pdf::PDFFloatBitmapWithColo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_inkCoverageMM.dirty();
|
||||||
|
|
||||||
buildInfoBoxItems();
|
buildInfoBoxItems();
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
@ -215,7 +218,7 @@ int OutputPreviewWidget::getInfoBoxWidth() const
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return pdf::PDFWidgetUtils::scaleDPI_x(this, 150);
|
return pdf::PDFWidgetUtils::scaleDPI_x(this, 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
int OutputPreviewWidget::getInfoBoxContentHorizontalMargin() const
|
int OutputPreviewWidget::getInfoBoxContentHorizontalMargin() const
|
||||||
@ -229,9 +232,9 @@ void OutputPreviewWidget::buildInfoBoxItems()
|
|||||||
|
|
||||||
switch (m_displayMode)
|
switch (m_displayMode)
|
||||||
{
|
{
|
||||||
case pdfplugin::OutputPreviewWidget::Separations:
|
case Separations:
|
||||||
case pdfplugin::OutputPreviewWidget::ColorWarningInkCoverage:
|
case ColorWarningInkCoverage:
|
||||||
case pdfplugin::OutputPreviewWidget::ColorWarningRichBlack:
|
case ColorWarningRichBlack:
|
||||||
{
|
{
|
||||||
if (m_originalProcessBitmap.getWidth() > 0 && m_originalProcessBitmap.getHeight() > 0)
|
if (m_originalProcessBitmap.getWidth() > 0 && m_originalProcessBitmap.getHeight() > 0)
|
||||||
{
|
{
|
||||||
@ -344,13 +347,40 @@ void OutputPreviewWidget::buildInfoBoxItems()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case pdfplugin::OutputPreviewWidget::InkCoverage:
|
case InkCoverage:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
Q_ASSERT(false);
|
Q_ASSERT(false);
|
||||||
break;
|
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)
|
void OutputPreviewWidget::addInfoBoxHeader(QString caption)
|
||||||
@ -376,6 +406,47 @@ void OutputPreviewWidget::addInfoBoxColoredRect(QColor color)
|
|||||||
m_infoBoxItems.push_back(InfoBoxItem(ColorOnly, color, QString(), QString()));
|
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
|
QColor OutputPreviewWidget::getAlarmColor() const
|
||||||
{
|
{
|
||||||
return m_alarmColor;
|
return m_alarmColor;
|
||||||
|
@ -79,6 +79,10 @@ private:
|
|||||||
void addInfoBoxColoredItem(QColor color, QString caption, QString value);
|
void addInfoBoxColoredItem(QColor color, QString caption, QString value);
|
||||||
void addInfoBoxColoredRect(QColor color);
|
void addInfoBoxColoredRect(QColor color);
|
||||||
|
|
||||||
|
const std::vector<pdf::PDFColorComponent>& getInkCoverage() const;
|
||||||
|
|
||||||
|
std::vector<pdf::PDFColorComponent> getInkCoverageImpl() const;
|
||||||
|
|
||||||
enum InfoBoxStyle
|
enum InfoBoxStyle
|
||||||
{
|
{
|
||||||
Header,
|
Header,
|
||||||
@ -110,6 +114,8 @@ private:
|
|||||||
QColor m_alarmColor;
|
QColor m_alarmColor;
|
||||||
std::optional<QPoint> m_imagePointUnderCursor;
|
std::optional<QPoint> m_imagePointUnderCursor;
|
||||||
|
|
||||||
|
mutable pdf::PDFCachedItem<std::vector<pdf::PDFColorComponent>> m_inkCoverageMM;
|
||||||
|
|
||||||
QImage m_pageImage;
|
QImage m_pageImage;
|
||||||
pdf::PDFFloatBitmapWithColorSpace m_originalProcessBitmap;
|
pdf::PDFFloatBitmapWithColorSpace m_originalProcessBitmap;
|
||||||
QSizeF m_pageSizeMM;
|
QSizeF m_pageSizeMM;
|
||||||
|
Reference in New Issue
Block a user