From 91d7355a20a5374fe8ba3512a86f024be8ff1100 Mon Sep 17 00:00:00 2001 From: Jakub Melka Date: Sun, 4 Jul 2021 18:11:41 +0200 Subject: [PATCH] Ink coverage tool --- Pdf4QtLib/sources/pdfcms.cpp | 6 +- Pdf4QtLib/sources/pdftransparencyrenderer.cpp | 1 + PdfTool/pdftoolinkcoverage.cpp | 84 ++++++++++++++----- 3 files changed, 65 insertions(+), 26 deletions(-) diff --git a/Pdf4QtLib/sources/pdfcms.cpp b/Pdf4QtLib/sources/pdfcms.cpp index 2620cd1..13e2440 100644 --- a/Pdf4QtLib/sources/pdfcms.cpp +++ b/Pdf4QtLib/sources/pdfcms.cpp @@ -728,9 +728,9 @@ int PDFLittleCMS::installCmsPlugins() cmsBool PDFLittleCMS::optimizePipeline(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { - if (*dwFlags & cmsFLAGS_HIGHRESPRECALC) + if (!(*dwFlags & cmsFLAGS_LOWRESPRECALC)) { - // Do not optimize + // Optimize only on low resolution precalculation return FALSE; } @@ -811,7 +811,7 @@ cmsBool PDFLittleCMS::optimizePipeline(cmsPipeline** Lut, cmsUInt32Number Intent for (cmsUInt32Number i = 0; i < gridPoints; ++i) { const cmsFloat32Number x = i * factor; - s2.SampledPoints[i] = cmsEvalToneCurveFloat(curve, x); + s2.SampledPoints[i] = cmsEvalToneCurveFloat(curve, interpolate(x, 0.0, 1.0, low, high)); } s3.Type = type; diff --git a/Pdf4QtLib/sources/pdftransparencyrenderer.cpp b/Pdf4QtLib/sources/pdftransparencyrenderer.cpp index fff1412..bd252bb 100644 --- a/Pdf4QtLib/sources/pdftransparencyrenderer.cpp +++ b/Pdf4QtLib/sources/pdftransparencyrenderer.cpp @@ -3975,6 +3975,7 @@ void PDFInkCoverageCalculator::perform(QSize size, const std::vector info.textName = colorInfo.textName; info.isSpot = colorInfo.isSpot; info.coveredArea = pageCoverage[i]; + info.ratio = pageRatioCoverage[i]; results.emplace_back(qMove(info)); } diff --git a/PdfTool/pdftoolinkcoverage.cpp b/PdfTool/pdftoolinkcoverage.cpp index 9b36754..16a2a5a 100644 --- a/PdfTool/pdftoolinkcoverage.cpp +++ b/PdfTool/pdftoolinkcoverage.cpp @@ -93,8 +93,9 @@ int PDFToolInkCoverageApplication::execute(const PDFToolOptions& options) formatter.beginTable("ink-coverage-by-page", PDFToolTranslationContext::tr("Ink Coverage by Page")); - bool isHeaderProcessed = false; + QLocale locale; std::vector headerCoverage; + for (const pdf::PDFInteger pageIndex : pageIndices) { const std::vector* coverage = calculator.getInkCoverage(pageIndex); @@ -105,34 +106,71 @@ int PDFToolInkCoverageApplication::execute(const PDFToolOptions& options) continue; } - if (!isHeaderProcessed) + for (const auto& info : *coverage) { - formatter.beginTableHeaderRow("header"); - formatter.writeTableHeaderColumn("page-no", PDFToolTranslationContext::tr("Page No."), Qt::AlignLeft); - for (const pdf::PDFInkCoverageCalculator::InkCoverageChannelInfo& info : *coverage) + if (!pdf::PDFInkCoverageCalculator::findCoverageInfoByName(headerCoverage, info.name)) { - formatter.writeTableHeaderColumn(QString("%1-ratio").arg(QString::fromLatin1(info.name)), PDFToolTranslationContext::tr("%1 Ratio [%]").arg(info.textName), Qt::AlignLeft); - formatter.writeTableHeaderColumn(QString("%1-area").arg(QString::fromLatin1(info.name)), PDFToolTranslationContext::tr("%1 Covered [mm^2]").arg(info.textName), Qt::AlignLeft); + headerCoverage.push_back(info); } - headerCoverage = *coverage; - formatter.endTableHeaderRow(); - - isHeaderProcessed = true; - } - - for (const auto& info : *headerCoverage) - { - pdf::PDFInkCoverageCalculator::InkCoverageChannelInfo* channelInfo = pdf::PDFInkCoverageCalculator::findCoverageInfoByName(*coverage, info.name); - pdf::PDFInkCoverageCalculator::InkCoverageChannelInfo* sumChannelInfo = pdf::PDFInkCoverageCalculator::findCoverageInfoByName(headerCoverage, info.name); - - if (sumChannelInfo && channelInfo) - { - sumChannelInfo->coveredArea += channelInfo->coveredArea; - } - } } + formatter.beginTableHeaderRow("header"); + formatter.writeTableHeaderColumn("page-no", PDFToolTranslationContext::tr("Page No."), Qt::AlignLeft); + for (const pdf::PDFInkCoverageCalculator::InkCoverageChannelInfo& info : headerCoverage) + { + formatter.writeTableHeaderColumn(QString("%1-ratio").arg(QString::fromLatin1(info.name)), PDFToolTranslationContext::tr("%1 Ratio [%]").arg(info.textName), Qt::AlignLeft); + formatter.writeTableHeaderColumn(QString("%1-area").arg(QString::fromLatin1(info.name)), PDFToolTranslationContext::tr("%1 Covered [mm^2]").arg(info.textName), Qt::AlignLeft); + } + formatter.endTableHeaderRow(); + + for (const pdf::PDFInteger pageIndex : pageIndices) + { + const std::vector* coverage = calculator.getInkCoverage(pageIndex); + + if (!coverage) + { + // Jakub Melka: Something bad happened? + continue; + } + + formatter.beginTableRow("page-coverage", pageIndex + 1); + formatter.writeTableColumn("page-no", locale.toString(pageIndex + 1), Qt::AlignRight); + + for (const auto& info : headerCoverage) + { + const pdf::PDFInkCoverageCalculator::InkCoverageChannelInfo* channelInfo = pdf::PDFInkCoverageCalculator::findCoverageInfoByName(*coverage, info.name); + pdf::PDFInkCoverageCalculator::InkCoverageChannelInfo* sumChannelInfo = pdf::PDFInkCoverageCalculator::findCoverageInfoByName(headerCoverage, info.name); + + if (channelInfo) + { + formatter.writeTableColumn(QString("%1-ratio").arg(QString::fromLatin1(info.name)), locale.toString(channelInfo->ratio * 100.0, 'f', 2), Qt::AlignRight); + formatter.writeTableColumn(QString("%1-area").arg(QString::fromLatin1(info.name)), locale.toString(channelInfo->coveredArea, 'f', 2), Qt::AlignRight); + sumChannelInfo->coveredArea += channelInfo->coveredArea; + } + else + { + formatter.writeTableColumn(QString("%1-ratio").arg(QString::fromLatin1(info.name)), QString(), Qt::AlignRight); + formatter.writeTableColumn(QString("%1-area").arg(QString::fromLatin1(info.name)), QString(), Qt::AlignRight); + } + } + + formatter.endTableRow(); + } + + // Summary + formatter.beginTableRow("sum-coverage"); + formatter.writeTableColumn("sum", PDFToolTranslationContext::tr("Sum"), Qt::AlignRight); + + for (const auto& info : headerCoverage) + { + const pdf::PDFInkCoverageCalculator::InkCoverageChannelInfo* channelInfo = pdf::PDFInkCoverageCalculator::findCoverageInfoByName(headerCoverage, info.name); + formatter.writeTableColumn(QString("%1-ratio").arg(QString::fromLatin1(info.name)), QString(), Qt::AlignRight); + formatter.writeTableColumn(QString("%1-area").arg(QString::fromLatin1(info.name)), locale.toString(channelInfo->coveredArea, 'f', 2), Qt::AlignRight); + } + + formatter.endTableRow(); + formatter.endTable(); formatter.endDocument();