mirror of
				https://github.com/JakubMelka/PDF4QT.git
				synced 2025-06-05 21:59:17 +02:00 
			
		
		
		
	Text knockout implementation
This commit is contained in:
		| @@ -2596,12 +2596,13 @@ void PDFPageContentProcessor::operatorTextBegin() | |||||||
|     updateGraphicState(); |     updateGraphicState(); | ||||||
|  |  | ||||||
|     ++m_textBeginEndState; |     ++m_textBeginEndState; | ||||||
|     performTextBegin(ProcessOrder::AfterOperation); |  | ||||||
|  |  | ||||||
|     if (m_textBeginEndState > 1) |     if (m_textBeginEndState > 1) | ||||||
|     { |     { | ||||||
|         throw PDFRendererException(RenderErrorType::Error, PDFTranslationContext::tr("Text object already started.")); |         throw PDFRendererException(RenderErrorType::Error, PDFTranslationContext::tr("Text object already started.")); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     performTextBegin(ProcessOrder::AfterOperation); | ||||||
| } | } | ||||||
|  |  | ||||||
| void PDFPageContentProcessor::operatorTextEnd() | void PDFPageContentProcessor::operatorTextEnd() | ||||||
|   | |||||||
| @@ -697,6 +697,7 @@ void PDFTransparencyRenderer::beginPaint(QSize pixelSize) | |||||||
| const PDFFloatBitmap& PDFTransparencyRenderer::endPaint() | const PDFFloatBitmap& PDFTransparencyRenderer::endPaint() | ||||||
| { | { | ||||||
|     Q_ASSERT(m_active); |     Q_ASSERT(m_active); | ||||||
|  |     m_textTransparencyGroupGuard.reset(); // Just safeguard - ET operator may not be present | ||||||
|     m_pageTransparencyGroupGuard.reset(); |     m_pageTransparencyGroupGuard.reset(); | ||||||
|     m_active = false; |     m_active = false; | ||||||
|     m_painterStateStack.pop(); |     m_painterStateStack.pop(); | ||||||
| @@ -882,6 +883,7 @@ void PDFTransparencyRenderer::collapseSpotColorsToDeviceColors(PDFFloatBitmapWit | |||||||
|  |  | ||||||
| void PDFTransparencyRenderer::performPathPainting(const QPainterPath& path, bool stroke, bool fill, bool text, Qt::FillRule fillRule) | void PDFTransparencyRenderer::performPathPainting(const QPainterPath& path, bool stroke, bool fill, bool text, Qt::FillRule fillRule) | ||||||
| { | { | ||||||
|  |     Q_UNUSED(text); | ||||||
|     Q_UNUSED(fillRule); |     Q_UNUSED(fillRule); | ||||||
|  |  | ||||||
|     QMatrix worldMatrix = getCurrentWorldMatrix(); |     QMatrix worldMatrix = getCurrentWorldMatrix(); | ||||||
| @@ -1031,10 +1033,7 @@ void PDFTransparencyRenderer::performPathPainting(const QPainterPath& path, bool | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (!text || !getGraphicState()->getTextKnockout()) |  | ||||||
|     { |  | ||||||
|     flushDrawBuffer(); |     flushDrawBuffer(); | ||||||
|     } |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void PDFTransparencyRenderer::performClipping(const QPainterPath& path, Qt::FillRule fillRule) | void PDFTransparencyRenderer::performClipping(const QPainterPath& path, Qt::FillRule fillRule) | ||||||
| @@ -1229,11 +1228,22 @@ void PDFTransparencyRenderer::performEndTransparencyGroup(ProcessOrder order, co | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void PDFTransparencyRenderer::performTextBegin(ProcessOrder order) | ||||||
|  | { | ||||||
|  |     if (order == ProcessOrder::AfterOperation && getGraphicState()->getTextKnockout()) | ||||||
|  |     { | ||||||
|  |         // In a case of text knockout, use text transparency group of type knockout | ||||||
|  |         PDFTransparencyGroup transparencyGroup; | ||||||
|  |         transparencyGroup.knockout = true; | ||||||
|  |         m_textTransparencyGroupGuard.reset(new PDFTransparencyGroupGuard(this, qMove(transparencyGroup))); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| void PDFTransparencyRenderer::performTextEnd(ProcessOrder order) | void PDFTransparencyRenderer::performTextEnd(ProcessOrder order) | ||||||
| { | { | ||||||
|     if (order == ProcessOrder::AfterOperation) |     if (order == ProcessOrder::BeforeOperation) | ||||||
|     { |     { | ||||||
|         flushDrawBuffer(); |         m_textTransparencyGroupGuard.reset(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -562,6 +562,7 @@ public: | |||||||
|     virtual void performRestoreGraphicState(ProcessOrder order) override; |     virtual void performRestoreGraphicState(ProcessOrder order) override; | ||||||
|     virtual void performBeginTransparencyGroup(ProcessOrder order, const PDFTransparencyGroup& transparencyGroup) override; |     virtual void performBeginTransparencyGroup(ProcessOrder order, const PDFTransparencyGroup& transparencyGroup) override; | ||||||
|     virtual void performEndTransparencyGroup(ProcessOrder order, const PDFTransparencyGroup& transparencyGroup) override; |     virtual void performEndTransparencyGroup(ProcessOrder order, const PDFTransparencyGroup& transparencyGroup) override; | ||||||
|  |     virtual void performTextBegin(ProcessOrder order) override; | ||||||
|     virtual void performTextEnd(ProcessOrder order) override; |     virtual void performTextEnd(ProcessOrder order) override; | ||||||
|     virtual void performImagePainting(const QImage& image) override; |     virtual void performImagePainting(const QImage& image) override; | ||||||
|     virtual void performMeshPainting(const PDFMesh& mesh); |     virtual void performMeshPainting(const PDFMesh& mesh); | ||||||
| @@ -689,6 +690,7 @@ private: | |||||||
|     PDFColorSpacePointer m_deviceColorSpace;    ///< Device color space (color space for final result) |     PDFColorSpacePointer m_deviceColorSpace;    ///< Device color space (color space for final result) | ||||||
|     PDFColorSpacePointer m_processColorSpace;   ///< Process color space (color space, in which is page graphic's blended) |     PDFColorSpacePointer m_processColorSpace;   ///< Process color space (color space, in which is page graphic's blended) | ||||||
|     std::unique_ptr<PDFTransparencyGroupGuard> m_pageTransparencyGroupGuard; |     std::unique_ptr<PDFTransparencyGroupGuard> m_pageTransparencyGroupGuard; | ||||||
|  |     std::unique_ptr<PDFTransparencyGroupGuard> m_textTransparencyGroupGuard; | ||||||
|     std::vector<PDFTransparencyGroupPainterData> m_transparencyGroupDataStack; |     std::vector<PDFTransparencyGroupPainterData> m_transparencyGroupDataStack; | ||||||
|     std::stack<PDFTransparencyPainterState> m_painterStateStack; |     std::stack<PDFTransparencyPainterState> m_painterStateStack; | ||||||
|     const PDFInkMapper* m_inkMapper; |     const PDFInkMapper* m_inkMapper; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user