diff --git a/Pdf4QtLib/sources/pdftransparencyrenderer.cpp b/Pdf4QtLib/sources/pdftransparencyrenderer.cpp index 6334d99..bc532b0 100644 --- a/Pdf4QtLib/sources/pdftransparencyrenderer.cpp +++ b/Pdf4QtLib/sources/pdftransparencyrenderer.cpp @@ -1987,7 +1987,7 @@ void PDFTransparencyRenderer::processSoftMask(const PDFDictionary* softMask) return; } - PDFInkMapper inkMapper(getDocument()); + PDFInkMapper inkMapper(nullptr, getDocument()); PDFTransparencyRenderer softMaskRenderer(getPage(), getDocument(), getFontCache(), getCMS(), getOptionalContentActivity(), &inkMapper, m_settings, getPagePointToDevicePointMatrix()); softMaskRenderer.initializeProcessor(); @@ -3005,7 +3005,8 @@ bool PDFTransparencyRenderer::isMultithreadedPathSamplingUsed(QRect fillRect) co return fillRect.width() * fillRect.height() > m_settings.multithreadingPathSampleThreshold && fillRect.width() > 1; } -PDFInkMapper::PDFInkMapper(const PDFDocument* document) : +PDFInkMapper::PDFInkMapper(const PDFCMSManager* manager, const PDFDocument* document) : + m_cmsManager(manager), m_document(document) { // Initialize device separations @@ -3023,96 +3024,113 @@ std::vector PDFInkMapper::getSeparations(uint32_t proce std::vector result; result.reserve(getActiveSpotColorCount() + processColorCount); + PDFRenderErrorReporterDummy renderErrorReporter; + PDFCMSPointer cms = m_cmsManager ? m_cmsManager->getCurrentCMS() : nullptr; + switch (processColorCount) { case 1: { + PDFDeviceGrayColorSpace grayColorSpace; + ColorInfo gray; gray.name = "Gray"; - gray.textName = PDFTranslationContext::tr("Process Gray"); + gray.textName = PDFTranslationContext::tr("Gray"); gray.canBeActive = true; gray.active = true; gray.isSpot = false; gray.spotColorIndex = 0; gray.colorSpaceType = PDFAbstractColorSpace::ColorSpace::DeviceGray; + gray.color = cms ? grayColorSpace.getColor(PDFColor(1.0f), cms.get(), RenderingIntent::Perceptual, &renderErrorReporter, true) : QColor(); result.emplace_back(qMove(gray)); break; } case 3: { + PDFDeviceRGBColorSpace rgbColorSpace; + ColorInfo red; red.name = "Red"; - red.textName = PDFTranslationContext::tr("Process Red"); + red.textName = PDFTranslationContext::tr("Red"); red.canBeActive = true; red.active = true; red.isSpot = false; red.spotColorIndex = 0; red.colorSpaceType = PDFAbstractColorSpace::ColorSpace::DeviceRGB; + red.color = cms ? rgbColorSpace.getColor(PDFColor(1.0f, 0.0f, 0.0f), cms.get(), RenderingIntent::Perceptual, &renderErrorReporter, true) : QColor(); result.emplace_back(qMove(red)); ColorInfo green; green.name = "Green"; - green.textName = PDFTranslationContext::tr("Process Green"); + green.textName = PDFTranslationContext::tr("Green"); green.canBeActive = true; green.active = true; green.isSpot = false; green.spotColorIndex = 1; green.colorSpaceType = PDFAbstractColorSpace::ColorSpace::DeviceRGB; + green.color = cms ? rgbColorSpace.getColor(PDFColor(0.0f, 1.0f, 0.0f), cms.get(), RenderingIntent::Perceptual, &renderErrorReporter, true) : QColor(); result.emplace_back(qMove(green)); ColorInfo blue; blue.name = "Blue"; - blue.textName = PDFTranslationContext::tr("Process Blue"); + blue.textName = PDFTranslationContext::tr("Blue"); blue.canBeActive = true; blue.active = true; blue.isSpot = false; blue.spotColorIndex = 2; blue.colorSpaceType = PDFAbstractColorSpace::ColorSpace::DeviceRGB; + blue.color = cms ? rgbColorSpace.getColor(PDFColor(0.0f, 0.0f, 1.0f), cms.get(), RenderingIntent::Perceptual, &renderErrorReporter, true) : QColor(); result.emplace_back(qMove(blue)); break; } case 4: { + PDFDeviceCMYKColorSpace cmykColorSpace; + ColorInfo cyan; cyan.name = "Cyan"; - cyan.textName = PDFTranslationContext::tr("Process Cyan"); + cyan.textName = PDFTranslationContext::tr("Cyan"); cyan.canBeActive = true; cyan.active = true; cyan.isSpot = false; cyan.spotColorIndex = 0; cyan.colorSpaceType = PDFAbstractColorSpace::ColorSpace::DeviceCMYK; + cyan.color = cms ? cmykColorSpace.getColor(PDFColor(1.0f, 0.0f, 0.0f, 0.0f), cms.get(), RenderingIntent::Perceptual, &renderErrorReporter, true) : QColor(); result.emplace_back(qMove(cyan)); ColorInfo magenta; magenta.name = "Magenta"; - magenta.textName = PDFTranslationContext::tr("Process Magenta"); + magenta.textName = PDFTranslationContext::tr("Magenta"); magenta.canBeActive = true; magenta.active = true; magenta.isSpot = false; magenta.spotColorIndex = 1; magenta.colorSpaceType = PDFAbstractColorSpace::ColorSpace::DeviceCMYK; + magenta.color = cms ? cmykColorSpace.getColor(PDFColor(0.0f, 1.0f, 0.0f, 0.0f), cms.get(), RenderingIntent::Perceptual, &renderErrorReporter, true) : QColor(); result.emplace_back(qMove(magenta)); ColorInfo yellow; yellow.name = "Yellow"; - yellow.textName = PDFTranslationContext::tr("Process Yellow"); + yellow.textName = PDFTranslationContext::tr("Yellow"); yellow.canBeActive = true; yellow.active = true; yellow.isSpot = false; yellow.spotColorIndex = 2; yellow.colorSpaceType = PDFAbstractColorSpace::ColorSpace::DeviceCMYK; + yellow.color = cms ? cmykColorSpace.getColor(PDFColor(0.0f, 0.0f, 1.0f, 0.0f), cms.get(), RenderingIntent::Perceptual, &renderErrorReporter, true) : QColor(); result.emplace_back(qMove(yellow)); ColorInfo black; black.name = "Black"; - black.textName = PDFTranslationContext::tr("Process Black"); + black.textName = PDFTranslationContext::tr("Black"); black.canBeActive = true; black.active = true; black.isSpot = false; black.spotColorIndex = 3; black.colorSpaceType = PDFAbstractColorSpace::ColorSpace::DeviceCMYK; + black.color = cms ? cmykColorSpace.getColor(PDFColor(0.0f, 0.0f, 0.0f, 1.0f), cms.get(), RenderingIntent::Perceptual, &renderErrorReporter, true) : QColor(); result.emplace_back(qMove(black)); break; } @@ -3155,6 +3173,9 @@ void PDFInkMapper::createSpotColors(bool activate) m_spotColors.clear(); m_activeSpotColors = 0; + PDFRenderErrorReporterDummy renderErrorReporter; + PDFCMSPointer cms = m_cmsManager ? m_cmsManager->getCurrentCMS() : nullptr; + const PDFCatalog* catalog = m_document->getCatalog(); const size_t pageCount = catalog->getPageCount(); for (size_t i = 0; i < pageCount; ++i) @@ -3203,6 +3224,7 @@ void PDFInkMapper::createSpotColors(bool activate) info.textName = PDFEncoding::convertTextString(info.name); info.colorSpace = colorSpacePointer; info.spotColorIndex = uint32_t(m_spotColors.size()); + info.color = cms ? separationColorSpace->getColor(pdf::PDFColor(1.0f), cms.get(), pdf::RenderingIntent::Perceptual, &renderErrorReporter, true) : nullptr; m_spotColors.emplace_back(qMove(info)); } } @@ -3222,12 +3244,17 @@ void PDFInkMapper::createSpotColors(bool activate) const PDFDeviceNColorSpace::ColorantInfo& colorantInfo = colorants[i]; if (!containsSpotColor(colorantInfo.name) && !containsProcessColor(colorantInfo.name)) { + PDFColor color; + color.resize(deviceNColorSpace->getColorComponentCount()); + color[i] = 1.0f; + ColorInfo info; info.name = colorantInfo.name; info.textName = PDFEncoding::convertTextString(info.name); info.colorSpaceIndex = uint32_t(i); info.colorSpace = colorSpacePointer; info.spotColorIndex = uint32_t(m_spotColors.size()); + info.color = cms ? deviceNColorSpace->getColor(color, cms.get(), pdf::RenderingIntent::Perceptual, &renderErrorReporter, true) : nullptr; m_spotColors.emplace_back(qMove(info)); } } diff --git a/Pdf4QtLib/sources/pdftransparencyrenderer.h b/Pdf4QtLib/sources/pdftransparencyrenderer.h index 533ea9a..856b01f 100644 --- a/Pdf4QtLib/sources/pdftransparencyrenderer.h +++ b/Pdf4QtLib/sources/pdftransparencyrenderer.h @@ -360,7 +360,7 @@ struct PDFInkMapping class Pdf4QtLIBSHARED_EXPORT PDFInkMapper { public: - explicit PDFInkMapper(const PDFDocument* document); + explicit PDFInkMapper(const PDFCMSManager* manager, const PDFDocument* document); struct ColorInfo { @@ -372,6 +372,7 @@ public: bool canBeActive = false; ///< Can spot color be activated? bool active = false; ///< Is spot color active? bool isSpot = true; + QColor color; ///< Spot/process color transformed to RGB color space PDFAbstractColorSpace::ColorSpace colorSpaceType = PDFAbstractColorSpace::ColorSpace::Invalid; }; @@ -436,6 +437,7 @@ public: PDFPixelFormat targetPixelFormat) const; private: + const PDFCMSManager* m_cmsManager; const PDFDocument* m_document; std::vector m_spotColors; std::vector m_deviceColors; ///< Device color space separations diff --git a/Pdf4QtViewerPlugins/OutputPreviewPlugin/outputpreviewdialog.cpp b/Pdf4QtViewerPlugins/OutputPreviewPlugin/outputpreviewdialog.cpp index 72a82c4..f3bbf67 100644 --- a/Pdf4QtViewerPlugins/OutputPreviewPlugin/outputpreviewdialog.cpp +++ b/Pdf4QtViewerPlugins/OutputPreviewPlugin/outputpreviewdialog.cpp @@ -20,6 +20,7 @@ #include "pdfcms.h" #include "pdfrenderer.h" +#include "pdfwidgetutils.h" #include "pdfdrawspacecontroller.h" #include @@ -31,8 +32,8 @@ namespace pdfplugin OutputPreviewDialog::OutputPreviewDialog(const pdf::PDFDocument* document, pdf::PDFWidget* widget, QWidget* parent) : QDialog(parent, Qt::Dialog | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint), ui(new Ui::OutputPreviewDialog), - m_inkMapper(document), - m_inkMapperForRendering(document), + m_inkMapper(widget->getCMSManager(), document), + m_inkMapperForRendering(widget->getCMSManager(), document), m_document(document), m_widget(widget), m_needUpdateImage(false), @@ -51,6 +52,7 @@ OutputPreviewDialog::OutputPreviewDialog(const pdf::PDFDocument* document, pdf:: ui->displayModeComboBox->setCurrentIndex(0); ui->imageWidget->setInkMapper(&m_inkMapper); + ui->inksTreeWidget->setMinimumHeight(pdf::PDFWidgetUtils::scaleDPI_y(ui->inksTreeWidget, 150)); m_inkMapper.createSpotColors(ui->simulateSeparationsCheckBox->isChecked()); connect(ui->simulateSeparationsCheckBox, &QCheckBox::clicked, this, &OutputPreviewDialog::onSimulateSeparationsChecked); @@ -111,6 +113,10 @@ void OutputPreviewDialog::updateInks() spotColorsRoot->setFlags(spotColorsRoot->flags() | Qt::ItemIsUserCheckable); spotColorsRoot->setCheckState(0, Qt::Checked); + QSize iconSize = pdf::PDFWidgetUtils::scaleDPI(ui->inksTreeWidget, QSize(16, 16)); + ui->inksTreeWidget->setIconSize(iconSize); + ui->inksTreeWidget->setRootIsDecorated(true); + int colorIndex = 0; std::vector separations = m_inkMapper.getSeparations(4); for (const auto& colorInfo : separations) @@ -127,6 +133,13 @@ void OutputPreviewDialog::updateInks() item = new QTreeWidgetItem(spotColorsRoot, QStringList(colorInfo.textName)); } + if (colorInfo.color.isValid()) + { + QPixmap icon(iconSize); + icon.fill(colorInfo.color); + item->setIcon(0, QIcon(icon)); + } + item->setFlags(item->flags() | Qt::ItemIsUserCheckable); item->setCheckState(0, Qt::Checked); item->setData(0, Qt::UserRole, colorIndex++); diff --git a/Pdf4QtViewerPlugins/OutputPreviewPlugin/outputpreviewwidget.cpp b/Pdf4QtViewerPlugins/OutputPreviewPlugin/outputpreviewwidget.cpp index 0a311a8..7f5ffb6 100644 --- a/Pdf4QtViewerPlugins/OutputPreviewPlugin/outputpreviewwidget.cpp +++ b/Pdf4QtViewerPlugins/OutputPreviewPlugin/outputpreviewwidget.cpp @@ -35,12 +35,12 @@ OutputPreviewWidget::OutputPreviewWidget(QWidget* parent) : QSize OutputPreviewWidget::sizeHint() const { - return pdf::PDFWidgetUtils::scaleDPI(this, QSize(400, 300)); + return pdf::PDFWidgetUtils::scaleDPI(this, QSize(500, 300)); } QSize OutputPreviewWidget::minimumSizeHint() const { - return pdf::PDFWidgetUtils::scaleDPI(this, QSize(200, 200)); + return pdf::PDFWidgetUtils::scaleDPI(this, QSize(400, 300)); } void OutputPreviewWidget::clear() @@ -244,7 +244,7 @@ void OutputPreviewWidget::buildInfoBoxItems() continue; } - addInfoBoxColoredItem(Qt::green, colorInfo.textName, QString("100 %")); + addInfoBoxColoredItem(colorInfo.color, colorInfo.textName, QString("100 %")); } } @@ -260,7 +260,7 @@ void OutputPreviewWidget::buildInfoBoxItems() continue; } - addInfoBoxColoredItem(Qt::blue, colorInfo.textName, QString("100 %")); + addInfoBoxColoredItem(colorInfo.color, colorInfo.textName, QString("100 %")); } } }