mirror of
				https://github.com/JakubMelka/PDF4QT.git
				synced 2025-06-05 21:59:17 +02:00 
			
		
		
		
	Basic support for transparency
This commit is contained in:
		| @@ -36,6 +36,7 @@ DEFINES += QT_DEPRECATED_WARNINGS | ||||
| DESTDIR = $$OUT_PWD/.. | ||||
|  | ||||
| SOURCES += \ | ||||
|     sources/pdfblendfunction.cpp \ | ||||
|     sources/pdfitemmodels.cpp \ | ||||
|     sources/pdfobject.cpp \ | ||||
|     sources/pdfoptionalcontent.cpp \ | ||||
| @@ -64,6 +65,7 @@ SOURCES += \ | ||||
|     sources/pdfimage.cpp | ||||
|  | ||||
| HEADERS += \ | ||||
|     sources/pdfblendfunction.h \ | ||||
|     sources/pdfitemmodels.h \ | ||||
|     sources/pdfmeshqualitysettings.h \ | ||||
|     sources/pdfobject.h \ | ||||
|   | ||||
							
								
								
									
										132
									
								
								PdfForQtLib/sources/pdfblendfunction.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								PdfForQtLib/sources/pdfblendfunction.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,132 @@ | ||||
| //    Copyright (C) 2019 Jakub Melka | ||||
| // | ||||
| //    This file is part of PdfForQt. | ||||
| // | ||||
| //    PdfForQt is free software: you can redistribute it and/or modify | ||||
| //    it under the terms of the GNU Lesser General Public License as published by | ||||
| //    the Free Software Foundation, either version 3 of the License, or | ||||
| //    (at your option) any later version. | ||||
| // | ||||
| //    PdfForQt is distributed in the hope that it will be useful, | ||||
| //    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| //    GNU Lesser General Public License for more details. | ||||
| // | ||||
| //    You should have received a copy of the GNU Lesser General Public License | ||||
| //    along with PDFForQt.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  | ||||
| #include "pdfblendfunction.h" | ||||
|  | ||||
| namespace pdf | ||||
| { | ||||
|  | ||||
| constexpr const std::pair<const char*, BlendMode> BLEND_MODE_INFOS[] = | ||||
| { | ||||
|     { "Normal", BlendMode::Normal }, | ||||
|     { "Multiply", BlendMode::Multiply }, | ||||
|     { "Screen", BlendMode::Screen }, | ||||
|     { "Overlay", BlendMode::Overlay }, | ||||
|     { "Darken", BlendMode::Darken }, | ||||
|     { "Lighten", BlendMode::Lighten }, | ||||
|     { "ColorDodge", BlendMode::ColorDodge }, | ||||
|     { "ColorBurn", BlendMode::ColorBurn }, | ||||
|     { "HardLight", BlendMode::HardLight }, | ||||
|     { "SoftLight", BlendMode::SoftLight }, | ||||
|     { "Difference", BlendMode::Difference }, | ||||
|     { "Exclusion", BlendMode::Exclusion }, | ||||
|     { "Hue", BlendMode::Hue }, | ||||
|     { "Saturation", BlendMode::Saturation }, | ||||
|     { "Color", BlendMode::Color }, | ||||
|     { "Luminosity", BlendMode::Luminosity }, | ||||
|     { "Compatible", BlendMode::Compatible } | ||||
| }; | ||||
|  | ||||
| BlendMode PDFBlendModeInfo::getBlendMode(const QByteArray& name) | ||||
| { | ||||
|     for (const std::pair<const char*, BlendMode>& info : BLEND_MODE_INFOS) | ||||
|     { | ||||
|         if (info.first == name) | ||||
|         { | ||||
|             return info.second; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return BlendMode::Invalid; | ||||
| } | ||||
|  | ||||
| bool PDFBlendModeInfo::isSupportedByQt(BlendMode mode) | ||||
| { | ||||
|     switch (mode) | ||||
|     { | ||||
|        case BlendMode::Normal: | ||||
|        case BlendMode::Multiply: | ||||
|        case BlendMode::Screen: | ||||
|        case BlendMode::Overlay: | ||||
|        case BlendMode::Darken: | ||||
|        case BlendMode::Lighten: | ||||
|        case BlendMode::ColorDodge: | ||||
|        case BlendMode::ColorBurn: | ||||
|        case BlendMode::HardLight: | ||||
|        case BlendMode::SoftLight: | ||||
|        case BlendMode::Difference: | ||||
|        case BlendMode::Exclusion: | ||||
|        case BlendMode::Compatible: | ||||
|             return true; | ||||
|  | ||||
|         default: | ||||
|             return false; | ||||
|     } | ||||
| } | ||||
|  | ||||
| QPainter::CompositionMode PDFBlendModeInfo::getCompositionModeFromBlendMode(BlendMode mode) | ||||
| { | ||||
|     switch (mode) | ||||
|     { | ||||
|         case BlendMode::Normal: | ||||
|             return QPainter::CompositionMode_SourceOver; | ||||
|         case BlendMode::Multiply: | ||||
|             return QPainter::CompositionMode_Multiply; | ||||
|         case BlendMode::Screen: | ||||
|             return QPainter::CompositionMode_Screen; | ||||
|         case BlendMode::Overlay: | ||||
|             return QPainter::CompositionMode_Overlay; | ||||
|         case BlendMode::Darken: | ||||
|             return QPainter::CompositionMode_Darken; | ||||
|         case BlendMode::Lighten: | ||||
|             return QPainter::CompositionMode_Lighten; | ||||
|         case BlendMode::ColorDodge: | ||||
|             return QPainter::CompositionMode_ColorDodge; | ||||
|         case BlendMode::ColorBurn: | ||||
|             return QPainter::CompositionMode_ColorBurn; | ||||
|         case BlendMode::HardLight: | ||||
|             return QPainter::CompositionMode_HardLight; | ||||
|         case BlendMode::SoftLight: | ||||
|             return QPainter::CompositionMode_SoftLight; | ||||
|         case BlendMode::Difference: | ||||
|             return QPainter::CompositionMode_Difference; | ||||
|         case BlendMode::Exclusion: | ||||
|             return QPainter::CompositionMode_Exclusion; | ||||
|         case BlendMode::Compatible: | ||||
|             return QPainter::CompositionMode_SourceOver; | ||||
|  | ||||
|         default: | ||||
|             break; | ||||
|     } | ||||
|  | ||||
|     return QPainter::CompositionMode_SourceOver; | ||||
| } | ||||
|  | ||||
| QString PDFBlendModeInfo::getBlendModeName(BlendMode mode) | ||||
| { | ||||
|     for (const std::pair<const char*, BlendMode>& info : BLEND_MODE_INFOS) | ||||
|     { | ||||
|         if (info.second == mode) | ||||
|         { | ||||
|             return QString::fromLatin1(info.first); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return "Unknown"; | ||||
| } | ||||
|  | ||||
| }   // namespace pdf | ||||
							
								
								
									
										85
									
								
								PdfForQtLib/sources/pdfblendfunction.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								PdfForQtLib/sources/pdfblendfunction.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | ||||
| //    Copyright (C) 2019 Jakub Melka | ||||
| // | ||||
| //    This file is part of PdfForQt. | ||||
| // | ||||
| //    PdfForQt is free software: you can redistribute it and/or modify | ||||
| //    it under the terms of the GNU Lesser General Public License as published by | ||||
| //    the Free Software Foundation, either version 3 of the License, or | ||||
| //    (at your option) any later version. | ||||
| // | ||||
| //    PdfForQt is distributed in the hope that it will be useful, | ||||
| //    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| //    GNU Lesser General Public License for more details. | ||||
| // | ||||
| //    You should have received a copy of the GNU Lesser General Public License | ||||
| //    along with PDFForQt.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  | ||||
| #ifndef PDFBLENDFUNCTION_H | ||||
| #define PDFBLENDFUNCTION_H | ||||
|  | ||||
| #include "pdfglobal.h" | ||||
|  | ||||
| #include <QPainter> | ||||
|  | ||||
| namespace pdf | ||||
| { | ||||
|  | ||||
| enum class BlendMode | ||||
| { | ||||
|     // Separable blending modes | ||||
|     Normal,     ///< Select source color, backdrop is ignored: B(source, dest) = source | ||||
|     Multiply,   ///< Backdrop and source colors are multiplied: B(source, dest) = source * dest | ||||
|     Screen,     ///< B(source, dest) = 1.0 - (1.0 - source) * (1.0 - dest) + source + dest - source * dest | ||||
|     Overlay,    ///< B(source, dest) = HardLight(dest, source) | ||||
|     Darken,     ///< Selects the darker of the colors. B(source, dest) = qMin(source, dest) | ||||
|     Lighten,    ///< Selects the lighter of the colors. B(source, dest) = qMax(source, dest) | ||||
|     ColorDodge, ///< Brightens the backdrop color reflecting the source color. B(source, dest) = qMin(1.0, dest / (1.0 - source)), or 1.0, if source is 1.0 | ||||
|     ColorBurn,  ///< Darkens the backdrop color reflecting the source color. B(source, dest) = 1.0 - qMin(1.0, (1.0 - dest) / source), or 0.0, if source is 0.0 | ||||
|     HardLight,  ///< Multiply or screen the color, depending on the source value. | ||||
|     SoftLight,  ///< Darkens or lightens the color, depending on the source value. | ||||
|     Difference, ///< Subtract the darker of colors from the lighter color. B(source, dest) = qAbs(source - dest) | ||||
|     Exclusion,  ///< B(source, dest) = source + dest - 2 * source * dest | ||||
|  | ||||
|     // Non-separable blending modes | ||||
|     Hue, | ||||
|     Saturation, | ||||
|     Color, | ||||
|     Luminosity, | ||||
|  | ||||
|     // For compatibility - older PDF specification specifies Compatible mode, which is equal | ||||
|     // to normal. It should be recognized for sake of compatibility. | ||||
|     Compatible, ///< Equals to normal | ||||
|  | ||||
|     // Invalid blending mode - for internal purposes only | ||||
|     Invalid | ||||
| }; | ||||
|  | ||||
| class PDFBlendModeInfo | ||||
| { | ||||
| public: | ||||
|     PDFBlendModeInfo() = delete; | ||||
|  | ||||
|     /// Returns blend mode from the specified string. If string is invalid, | ||||
|     /// then \p Invalid blend mode is returned. | ||||
|     /// \param name Name of the blend mode | ||||
|     static BlendMode getBlendMode(const QByteArray& name); | ||||
|  | ||||
|     /// Returns true, if blend mode is supported by Qt drawing subsystem | ||||
|     /// \param mode Blend mode | ||||
|     static bool isSupportedByQt(BlendMode mode); | ||||
|  | ||||
|     /// Returns composition mode for Qt drawing subsystem from blend mode defined | ||||
|     /// in PDF standard. If blend mode is not supported by Qt drawing subsystem, then default | ||||
|     /// composition mode is returned. | ||||
|     /// \param mode Blend mode | ||||
|     static QPainter::CompositionMode getCompositionModeFromBlendMode(BlendMode mode); | ||||
|  | ||||
|     /// Returns blend mode name | ||||
|     /// \param mode Blend mode | ||||
|     static QString getBlendModeName(BlendMode mode); | ||||
| }; | ||||
|  | ||||
| }   // namespace pdf | ||||
|  | ||||
| #endif // PDFBLENDFUNCTION_H | ||||
| @@ -43,7 +43,8 @@ enum RenderErrorType | ||||
| { | ||||
|     Error, | ||||
|     Warning, | ||||
|     NotImplemented | ||||
|     NotImplemented, | ||||
|     NotSupported | ||||
| }; | ||||
|  | ||||
| struct PDFRenderError | ||||
|   | ||||
| @@ -1592,22 +1592,20 @@ void PDFPageContentProcessor::processApplyGraphicState(const PDFDictionary* grap | ||||
|     const PDFReal flatness = loader.readNumberFromDictionary(graphicStateDictionary, "FL", m_graphicState.getFlatness()); | ||||
|     const PDFReal smoothness = loader.readNumberFromDictionary(graphicStateDictionary, "SM", m_graphicState.getSmoothness()); | ||||
|     const bool textKnockout = loader.readBooleanFromDictionary(graphicStateDictionary, "TK", m_graphicState.getTextKnockout()); | ||||
|     const PDFReal strokingAlpha = loader.readNumberFromDictionary(graphicStateDictionary, "CA", m_graphicState.getAlphaStroking()); | ||||
|     const PDFReal fillingAlpha = loader.readNumberFromDictionary(graphicStateDictionary, "ca", m_graphicState.getAlphaFilling()); | ||||
|     QByteArray blendModeName = loader.readNameFromDictionary(graphicStateDictionary, "BM"); | ||||
|  | ||||
|     // TODO: Implement alpha constant | ||||
|     const PDFReal strokingAlpha = loader.readNumberFromDictionary(graphicStateDictionary, "CA", 1.0); | ||||
|     const PDFReal fillingAlpha = loader.readNumberFromDictionary(graphicStateDictionary, "ca", 1.0); | ||||
|     QByteArray blendMode = loader.readNameFromDictionary(graphicStateDictionary, "BM"); | ||||
|     if (strokingAlpha != 1.0) | ||||
|     if (!blendModeName.isEmpty()) | ||||
|     { | ||||
|         m_errorList.append(PDFRenderError(RenderErrorType::NotImplemented, PDFTranslationContext::tr("Alpha constant %1 for stroking not implemented!").arg(strokingAlpha))); | ||||
|     } | ||||
|     if (fillingAlpha != 1.0) | ||||
|     { | ||||
|         m_errorList.append(PDFRenderError(RenderErrorType::NotImplemented, PDFTranslationContext::tr("Alpha constant %1 for filling not implemented!").arg(fillingAlpha))); | ||||
|     } | ||||
|     if (!blendMode.isEmpty() && blendMode != "Normal") | ||||
|     { | ||||
|         m_errorList.append(PDFRenderError(RenderErrorType::NotImplemented, PDFTranslationContext::tr("Blend mode '%1' not implemented!").arg(QString::fromLatin1(blendMode)))); | ||||
|         BlendMode blendMode = PDFBlendModeInfo::getBlendMode(blendModeName); | ||||
|  | ||||
|         if (blendMode == BlendMode::Invalid) | ||||
|         { | ||||
|             blendMode = BlendMode::Normal; | ||||
|             m_errorList.append(PDFRenderError(RenderErrorType::NotImplemented, PDFTranslationContext::tr("Blend mode '%1' is invalid.").arg(QString::fromLatin1(blendModeName)))); | ||||
|         } | ||||
|         m_graphicState.setBlendMode(blendMode); | ||||
|     } | ||||
|  | ||||
|     m_graphicState.setLineWidth(lineWidth); | ||||
| @@ -1617,6 +1615,8 @@ void PDFPageContentProcessor::processApplyGraphicState(const PDFDictionary* grap | ||||
|     m_graphicState.setFlatness(flatness); | ||||
|     m_graphicState.setSmoothness(smoothness); | ||||
|     m_graphicState.setTextKnockout(textKnockout); | ||||
|     m_graphicState.setAlphaStroking(strokingAlpha); | ||||
|     m_graphicState.setAlphaFilling(fillingAlpha); | ||||
|     updateGraphicState(); | ||||
| } | ||||
|  | ||||
| @@ -2968,6 +2968,9 @@ PDFPageContentProcessor::PDFPageContentProcessorState::PDFPageContentProcessorSt | ||||
|     m_textRenderingMode(TextRenderingMode::Fill), | ||||
|     m_textRise(0.0), | ||||
|     m_textKnockout(true), | ||||
|     m_alphaStroking(1.0), | ||||
|     m_alphaFilling(1.0), | ||||
|     m_blendMode(BlendMode::Normal), | ||||
|     m_stateFlags(StateUnchanged) | ||||
| { | ||||
|     m_fillColorSpace.reset(new PDFDeviceGrayColorSpace); | ||||
| @@ -3005,6 +3008,9 @@ PDFPageContentProcessor::PDFPageContentProcessorState& PDFPageContentProcessor:: | ||||
|     setTextKnockout(other.getTextKnockout()); | ||||
|     setTextMatrix(other.getTextMatrix()); | ||||
|     setTextLineMatrix(other.getTextLineMatrix()); | ||||
|     setAlphaStroking(other.getAlphaStroking()); | ||||
|     setAlphaFilling(other.getAlphaFilling()); | ||||
|     setBlendMode(other.getBlendMode()); | ||||
|     return *this; | ||||
| } | ||||
|  | ||||
| @@ -3161,6 +3167,47 @@ void PDFPageContentProcessor::PDFPageContentProcessorState::setTextLineMatrix(co | ||||
|     } | ||||
| } | ||||
|  | ||||
| void PDFPageContentProcessor::PDFPageContentProcessorState::setAlphaStroking(PDFReal alpha) | ||||
| { | ||||
|     if (m_alphaStroking != alpha) | ||||
|     { | ||||
|         m_alphaStroking = alpha; | ||||
|         m_stateFlags |= StateAlphaStroking; | ||||
|     } | ||||
| } | ||||
|  | ||||
| void PDFPageContentProcessor::PDFPageContentProcessorState::setAlphaFilling(PDFReal alpha) | ||||
| { | ||||
|     if (m_alphaFilling != alpha) | ||||
|     { | ||||
|         m_alphaFilling = alpha; | ||||
|         m_stateFlags |= StateAlphaFilling; | ||||
|     } | ||||
| } | ||||
|  | ||||
| void PDFPageContentProcessor::PDFPageContentProcessorState::setBlendMode(BlendMode mode) | ||||
| { | ||||
|     if (m_blendMode != mode) | ||||
|     { | ||||
|         m_blendMode = mode; | ||||
|         m_stateFlags |= StateBlendMode; | ||||
|     } | ||||
| } | ||||
|  | ||||
| QColor PDFPageContentProcessor::PDFPageContentProcessorState::getStrokeColorWithAlpha() const | ||||
| { | ||||
|     QColor color = getStrokeColor(); | ||||
|     color.setAlphaF(m_alphaStroking); | ||||
|     return color; | ||||
| } | ||||
|  | ||||
| QColor PDFPageContentProcessor::PDFPageContentProcessorState::getFillColorWithAlpha() const | ||||
| { | ||||
|     QColor color = getFillColor(); | ||||
|     color.setAlphaF(m_alphaFilling); | ||||
|     return color; | ||||
| } | ||||
|  | ||||
| void PDFPageContentProcessor::PDFPageContentProcessorState::setTextMatrix(const QMatrix& textMatrix) | ||||
| { | ||||
|     if (m_textMatrix != textMatrix) | ||||
|   | ||||
| @@ -24,6 +24,7 @@ | ||||
| #include "pdffont.h" | ||||
| #include "pdfutils.h" | ||||
| #include "pdfmeshqualitysettings.h" | ||||
| #include "pdfblendfunction.h" | ||||
|  | ||||
| #include <QMatrix> | ||||
| #include <QPainterPath> | ||||
| @@ -211,7 +212,7 @@ protected: | ||||
|         PDFPageContentProcessorState& operator=(PDFPageContentProcessorState&&) = delete; | ||||
|         PDFPageContentProcessorState& operator=(const PDFPageContentProcessorState& other); | ||||
|  | ||||
|         enum StateFlag | ||||
|         enum StateFlag : uint32_t | ||||
|         { | ||||
|             StateUnchanged                      = 0x00000000, | ||||
|             StateCurrentTransformationMatrix    = 0x00000001, | ||||
| @@ -238,7 +239,10 @@ protected: | ||||
|             StateTextRenderingMode              = 0x00200000, | ||||
|             StateTextRise                       = 0x00400000, | ||||
|             StateTextKnockout                   = 0x00800000, | ||||
|             StateAll                            = 0xFFFF | ||||
|             StateAlphaStroking                  = 0x01000000, | ||||
|             StateAlphaFilling                   = 0x02000000, | ||||
|             StateBlendMode                      = 0x04000000, | ||||
|             StateAll                            = 0xFFFFFFFF | ||||
|         }; | ||||
|  | ||||
|         Q_DECLARE_FLAGS(StateFlags, StateFlag) | ||||
| @@ -318,6 +322,21 @@ protected: | ||||
|         const QMatrix& getTextLineMatrix() const { return m_textLineMatrix; } | ||||
|         void setTextLineMatrix(const QMatrix& textLineMatrix); | ||||
|  | ||||
|         PDFReal getAlphaStroking() const { return m_alphaStroking; } | ||||
|         void setAlphaStroking(PDFReal alpha); | ||||
|  | ||||
|         PDFReal getAlphaFilling() const { return m_alphaFilling; } | ||||
|         void setAlphaFilling(PDFReal alpha); | ||||
|  | ||||
|         BlendMode getBlendMode() const { return m_blendMode; } | ||||
|         void setBlendMode(BlendMode mode); | ||||
|  | ||||
|         /// Returns stroke color with alpha channel | ||||
|         QColor getStrokeColorWithAlpha() const; | ||||
|  | ||||
|         /// Returns fill color with alpha channel | ||||
|         QColor getFillColorWithAlpha() const; | ||||
|  | ||||
|     private: | ||||
|         QMatrix m_currentTransformationMatrix; | ||||
|         PDFColorSpacePointer m_strokeColorSpace; | ||||
| @@ -343,6 +362,9 @@ protected: | ||||
|         bool m_textKnockout; | ||||
|         QMatrix m_textMatrix; | ||||
|         QMatrix m_textLineMatrix; | ||||
|         PDFReal m_alphaStroking; | ||||
|         PDFReal m_alphaFilling; | ||||
|         BlendMode m_blendMode; | ||||
|         StateFlags m_stateFlags; | ||||
|     }; | ||||
|  | ||||
|   | ||||
| @@ -154,7 +154,7 @@ void PDFPainter::performMeshPainting(const PDFMesh& mesh) | ||||
| { | ||||
|     m_painter->save(); | ||||
|     m_painter->setWorldMatrix(QMatrix()); | ||||
|     mesh.paint(m_painter); | ||||
|     mesh.paint(m_painter, getGraphicState()->getAlphaFilling()); | ||||
|     m_painter->restore(); | ||||
| } | ||||
|  | ||||
| @@ -173,16 +173,32 @@ void PDFPainter::performUpdateGraphicsState(const PDFPageContentProcessorState& | ||||
|         flags.testFlag(PDFPageContentProcessorState::StateLineCapStyle) || | ||||
|         flags.testFlag(PDFPageContentProcessorState::StateLineJoinStyle) || | ||||
|         flags.testFlag(PDFPageContentProcessorState::StateMitterLimit) || | ||||
|         flags.testFlag(PDFPageContentProcessorState::StateLineDashPattern)) | ||||
|         flags.testFlag(PDFPageContentProcessorState::StateLineDashPattern) || | ||||
|         flags.testFlag(PDFPageContentProcessorState::StateAlphaStroking)) | ||||
|     { | ||||
|         m_currentPen.dirty(); | ||||
|     } | ||||
|  | ||||
|     if (flags.testFlag(PDFPageContentProcessorState::StateFillColor)) | ||||
|     if (flags.testFlag(PDFPageContentProcessorState::StateFillColor) || | ||||
|         flags.testFlag(PDFPageContentProcessorState::StateAlphaFilling)) | ||||
|     { | ||||
|         m_currentBrush.dirty(); | ||||
|     } | ||||
|  | ||||
|     // If current blend mode has changed, then update it | ||||
|     if (flags.testFlag(PDFPageContentProcessorState::StateBlendMode)) | ||||
|     { | ||||
|         const BlendMode blendMode = state.getBlendMode(); | ||||
|         const QPainter::CompositionMode compositionMode = PDFBlendModeInfo::getCompositionModeFromBlendMode(blendMode); | ||||
|  | ||||
|         if (!PDFBlendModeInfo::isSupportedByQt(blendMode)) | ||||
|         { | ||||
|             reportRenderError(RenderErrorType::NotImplemented, PDFTranslationContext::tr("Blend mode '%1' not supported.").arg(PDFBlendModeInfo::getBlendModeName(blendMode))); | ||||
|         } | ||||
|  | ||||
|         m_painter->setCompositionMode(compositionMode); | ||||
|     } | ||||
|  | ||||
|     PDFPageContentProcessor::performUpdateGraphicsState(state); | ||||
| } | ||||
|  | ||||
| @@ -215,7 +231,7 @@ bool PDFPainter::isContentSuppressedByOC(PDFObjectReference ocgOrOcmd) | ||||
| QPen PDFPainter::getCurrentPenImpl() const | ||||
| { | ||||
|     const PDFPageContentProcessorState* graphicState = getGraphicState(); | ||||
|     const QColor& color = graphicState->getStrokeColor(); | ||||
|     const QColor& color = graphicState->getStrokeColorWithAlpha(); | ||||
|     if (color.isValid()) | ||||
|     { | ||||
|         const PDFReal lineWidth = graphicState->getLineWidth(); | ||||
| @@ -253,7 +269,7 @@ QPen PDFPainter::getCurrentPenImpl() const | ||||
| QBrush PDFPainter::getCurrentBrushImpl() const | ||||
| { | ||||
|     const PDFPageContentProcessorState* graphicState = getGraphicState(); | ||||
|     const QColor& color = graphicState->getFillColor(); | ||||
|     const QColor& color = graphicState->getFillColorWithAlpha(); | ||||
|     if (color.isValid()) | ||||
|     { | ||||
|         return QBrush(color, Qt::SolidPattern); | ||||
|   | ||||
| @@ -1002,7 +1002,7 @@ PDFMesh PDFAxialShading::createMesh(const PDFMeshQualitySettings& settings) cons | ||||
|     return mesh; | ||||
| } | ||||
|  | ||||
| void PDFMesh::paint(QPainter* painter) const | ||||
| void PDFMesh::paint(QPainter* painter, PDFReal alpha) const | ||||
| { | ||||
|     if (m_triangles.empty()) | ||||
|     { | ||||
| @@ -1021,7 +1021,9 @@ void PDFMesh::paint(QPainter* painter) const | ||||
|  | ||||
|     if (!m_backgroundPath.isEmpty() && m_backgroundColor.isValid()) | ||||
|     { | ||||
|         painter->setBrush(QBrush(m_backgroundColor, Qt::SolidPattern)); | ||||
|         QColor backgroundColor = m_backgroundColor; | ||||
|         backgroundColor.setAlphaF(alpha); | ||||
|         painter->setBrush(QBrush(backgroundColor, Qt::SolidPattern)); | ||||
|         painter->drawPath(m_backgroundPath); | ||||
|     } | ||||
|  | ||||
| @@ -1032,9 +1034,11 @@ void PDFMesh::paint(QPainter* painter) const | ||||
|     { | ||||
|         if (color != triangle.color) | ||||
|         { | ||||
|             painter->setPen(QColor(triangle.color)); | ||||
|             painter->setBrush(QBrush(triangle.color, Qt::SolidPattern)); | ||||
|             color = triangle.color; | ||||
|             QColor newColor(triangle.color); | ||||
|             newColor.setAlphaF(alpha); | ||||
|             painter->setPen(newColor); | ||||
|             painter->setBrush(QBrush(newColor, Qt::SolidPattern)); | ||||
|             color = newColor; | ||||
|         } | ||||
|  | ||||
|         std::array<QPointF, 3> triangleCorners = { m_vertices[triangle.v1], m_vertices[triangle.v2], m_vertices[triangle.v3] }; | ||||
|   | ||||
| @@ -89,7 +89,8 @@ public: | ||||
|  | ||||
|     /// Paints the mesh on the painter | ||||
|     /// \param painter Painter, onto which is mesh drawn | ||||
|     void paint(QPainter* painter) const; | ||||
|     /// \param alpha Opacity factor | ||||
|     void paint(QPainter* painter, PDFReal alpha) const; | ||||
|  | ||||
|     /// Transforms the mesh according to the matrix transform | ||||
|     /// \param matrix Matrix transform to be performed | ||||
|   | ||||
| @@ -68,6 +68,12 @@ PDFRenderingErrorsWidget::PDFRenderingErrorsWidget(QWidget* parent, PDFWidget* p | ||||
|                     break; | ||||
|                 } | ||||
|  | ||||
|                 case RenderErrorType::NotSupported: | ||||
|                 { | ||||
|                     typeString = tr("Not supported"); | ||||
|                     break; | ||||
|                 } | ||||
|  | ||||
|                 default: | ||||
|                 { | ||||
|                     Q_ASSERT(false); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user