Skip to content

Commit 36d7798

Browse files
committed
Synchronize functionality for all types of IEventData
Add AbstractRenderInfo for convenient work with GraphicsState. DEVSIX-1406
1 parent 38aa505 commit 36d7798

File tree

8 files changed

+302
-224
lines changed

8 files changed

+302
-224
lines changed

kernel/src/main/java/com/itextpdf/kernel/pdf/canvas/parser/IXObjectDoHandler.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,12 @@ This file is part of the iText (R) project.
4343
*/
4444
package com.itextpdf.kernel.pdf.canvas.parser;
4545

46+
import com.itextpdf.kernel.pdf.PdfName;
4647
import com.itextpdf.kernel.pdf.PdfStream;
48+
import com.itextpdf.kernel.pdf.canvas.CanvasTag;
49+
50+
import java.util.Stack;
4751

48-
/**
49-
* @author Kevin Day
50-
*/
5152
public interface IXObjectDoHandler {
52-
void handleXObject(PdfCanvasProcessor processor, PdfStream stream);
53+
void handleXObject(PdfCanvasProcessor processor, Stack<CanvasTag> canvasTagHierarchy, PdfStream stream, PdfName xObjectName);
5354
}

kernel/src/main/java/com/itextpdf/kernel/pdf/canvas/parser/PdfCanvasProcessor.java

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ This file is part of the iText (R) project.
7676
import com.itextpdf.kernel.pdf.PdfString;
7777
import com.itextpdf.kernel.pdf.canvas.CanvasTag;
7878
import com.itextpdf.kernel.pdf.canvas.PdfCanvasConstants;
79+
import com.itextpdf.kernel.pdf.canvas.parser.data.AbstractRenderInfo;
7980
import com.itextpdf.kernel.pdf.canvas.parser.data.ClippingPathInfo;
8081
import com.itextpdf.kernel.pdf.canvas.parser.data.IEventData;
8182
import com.itextpdf.kernel.pdf.canvas.parser.data.ImageRenderInfo;
@@ -297,7 +298,7 @@ public void processContent(byte[] contentBytes, PdfResources resources) {
297298
public void processPageContent(PdfPage page) {
298299
initClippingPath(page);
299300
ParserGraphicsState gs = getGraphicsState();
300-
eventOccurred(new ClippingPathInfo(gs.getClippingPath(), gs.getCtm()), EventType.CLIP_PATH_CHANGED);
301+
eventOccurred(new ClippingPathInfo(gs, gs.getClippingPath(), gs.getCtm()), EventType.CLIP_PATH_CHANGED);
301302
processContent(page.getContentBytes(), page.getResources());
302303
}
303304

@@ -425,14 +426,14 @@ protected void populateOperators() {
425426
* In case it isn't applicable pass any <CODE>byte</CODE> value.
426427
*/
427428
protected void paintPath(int operation, int rule) {
428-
PathRenderInfo renderInfo = new PathRenderInfo(currentPath, operation, rule, isClip, clippingRule, getGraphicsState());
429+
ParserGraphicsState gs = getGraphicsState();
430+
PathRenderInfo renderInfo = new PathRenderInfo(this.markedContentStack, gs, currentPath, operation, rule, isClip, clippingRule);
429431
eventOccurred(renderInfo, EventType.RENDER_PATH);
430432

431433
if (isClip) {
432434
isClip = false;
433-
ParserGraphicsState gs = getGraphicsState();
434435
gs.clip(currentPath, clippingRule);
435-
eventOccurred(new ClippingPathInfo(gs.getClippingPath(), gs.getCtm()), EventType.CLIP_PATH_CHANGED);
436+
eventOccurred(new ClippingPathInfo(gs, gs.getClippingPath(), gs.getCtm()), EventType.CLIP_PATH_CHANGED);
436437
}
437438

438439
currentPath = new Path();
@@ -532,10 +533,8 @@ protected void eventOccurred(IEventData data, EventType type) {
532533
if (supportedEvents == null || supportedEvents.contains(type)) {
533534
eventListener.eventOccurred(data, type);
534535
}
535-
if (data instanceof TextRenderInfo) {
536-
((TextRenderInfo) data).releaseGraphicsState();
537-
} else if (data instanceof PathRenderInfo) {
538-
((PathRenderInfo) data).releaseGraphicsState();
536+
if (data instanceof AbstractRenderInfo) {
537+
((AbstractRenderInfo) data).releaseGraphicsState();
539538
}
540539
}
541540

@@ -553,23 +552,24 @@ private void displayPdfString(PdfString string) {
553552
/**
554553
* Displays an XObject using the registered handler for this XObject's subtype
555554
*
556-
* @param xobjectName the name of the XObject to retrieve from the resource dictionary
555+
* @param resourceName the name of the XObject to retrieve from the resource dictionary
557556
*/
558-
private void displayXObject(PdfName xobjectName) {
559-
PdfStream xobjectStream = getXObjectStream(xobjectName);
557+
private void displayXObject(PdfName resourceName) {
558+
PdfStream xobjectStream = getXObjectStream(resourceName);
560559
PdfName subType = xobjectStream.getAsName(PdfName.Subtype);
561560
IXObjectDoHandler handler = xobjectDoHandlers.get(subType);
562561

563562
if (handler == null) {
564563
handler = xobjectDoHandlers.get(PdfName.Default);
565564
}
566565

567-
handler.handleXObject(this, xobjectStream);
566+
handler.handleXObject(this, this.markedContentStack, xobjectStream, resourceName);
568567
}
569568

570-
private void displayImage(PdfStream imageStream, boolean isInline) {
569+
private void displayImage(Stack<CanvasTag> canvasTagHierarchy, PdfStream imageStream, PdfName resourceName, boolean isInline) {
571570
PdfDictionary colorSpaceDic = getResources().getResource(PdfName.ColorSpace);
572-
ImageRenderInfo renderInfo = new ImageRenderInfo(getGraphicsState().getCtm(), imageStream, colorSpaceDic, isInline);
571+
ImageRenderInfo renderInfo = new ImageRenderInfo(canvasTagHierarchy, getGraphicsState(), getGraphicsState().getCtm(),
572+
imageStream, resourceName, colorSpaceDic, isInline);
573573
eventOccurred(renderInfo, EventType.RENDER_IMAGE);
574574
}
575575

@@ -1054,7 +1054,7 @@ protected static class PopGraphicsStateOperator implements IContentOperator {
10541054
public void invoke(PdfCanvasProcessor processor, PdfLiteral operator, List<PdfObject> operands) {
10551055
processor.gsStack.pop();
10561056
ParserGraphicsState gs = processor.getGraphicsState();
1057-
processor.eventOccurred(new ClippingPathInfo(gs.getClippingPath(), gs.getCtm()), EventType.CLIP_PATH_CHANGED);
1057+
processor.eventOccurred(new ClippingPathInfo(gs, gs.getClippingPath(), gs.getCtm()), EventType.CLIP_PATH_CHANGED);
10581058
}
10591059
}
10601060

@@ -1281,8 +1281,8 @@ private static class DoOperator implements IContentOperator {
12811281
* {@inheritDoc}
12821282
*/
12831283
public void invoke(PdfCanvasProcessor processor, PdfLiteral operator, List<PdfObject> operands) {
1284-
PdfName xobjectName = (PdfName) operands.get(0);
1285-
processor.displayXObject(xobjectName);
1284+
PdfName resourceName = (PdfName) operands.get(0);
1285+
processor.displayXObject(resourceName);
12861286
}
12871287
}
12881288

@@ -1298,7 +1298,7 @@ private static class EndImageOperator implements IContentOperator {
12981298
*/
12991299
public void invoke(PdfCanvasProcessor processor, PdfLiteral operator, List<PdfObject> operands) {
13001300
PdfStream imageStream = (PdfStream) operands.get(0);
1301-
processor.displayImage(imageStream, true);
1301+
processor.displayImage(processor.markedContentStack, imageStream, null, true);
13021302
}
13031303
}
13041304

@@ -1374,9 +1374,10 @@ public void invoke(PdfCanvasProcessor processor, PdfLiteral oper, List<PdfObject
13741374
* An XObject subtype handler for FORM
13751375
*/
13761376
private static class FormXObjectDoHandler implements IXObjectDoHandler {
1377-
public void handleXObject(PdfCanvasProcessor processor, PdfStream stream) {
13781377

1379-
PdfDictionary resourcesDic = stream.getAsDictionary(PdfName.Resources);
1378+
public void handleXObject(PdfCanvasProcessor processor, Stack<CanvasTag> canvasTagHierarchy, PdfStream xObjectStream, PdfName xObjectName) {
1379+
1380+
PdfDictionary resourcesDic = xObjectStream.getAsDictionary(PdfName.Resources);
13801381
PdfResources resources;
13811382
if (resourcesDic == null) {
13821383
resources = processor.getResources();
@@ -1388,8 +1389,8 @@ public void handleXObject(PdfCanvasProcessor processor, PdfStream stream) {
13881389
// this is probably not necessary (if we fail on this, probably the entire content stream processing
13891390
// operation should be rejected
13901391
byte[] contentBytes;
1391-
contentBytes = stream.getBytes();
1392-
final PdfArray matrix = stream.getAsArray(PdfName.Matrix);
1392+
contentBytes = xObjectStream.getBytes();
1393+
final PdfArray matrix = xObjectStream.getAsArray(PdfName.Matrix);
13931394

13941395
new PushGraphicsStateOperator().invoke(processor, null, null);
13951396

@@ -1407,26 +1408,24 @@ public void handleXObject(PdfCanvasProcessor processor, PdfStream stream) {
14071408
processor.processContent(contentBytes, resources);
14081409

14091410
new PopGraphicsStateOperator().invoke(processor, null, null);
1410-
14111411
}
1412-
14131412
}
14141413

14151414
/**
14161415
* An XObject subtype handler for IMAGE
14171416
*/
14181417
private static class ImageXObjectDoHandler implements IXObjectDoHandler {
14191418

1420-
public void handleXObject(PdfCanvasProcessor processor, PdfStream xobjectStream) {
1421-
processor.displayImage(xobjectStream, false);
1419+
public void handleXObject(PdfCanvasProcessor processor, Stack<CanvasTag> canvasTagHierarchy, PdfStream xObjectStream, PdfName resourceName) {
1420+
processor.displayImage(canvasTagHierarchy, xObjectStream, resourceName,false);
14221421
}
14231422
}
14241423

14251424
/**
14261425
* An XObject subtype handler that does nothing
14271426
*/
14281427
private static class IgnoreXObjectDoHandler implements IXObjectDoHandler {
1429-
public void handleXObject(PdfCanvasProcessor processor, PdfStream xobjectStream) {
1428+
public void handleXObject(PdfCanvasProcessor processor, Stack<CanvasTag> canvasTagHierarchy, PdfStream xObjectStream, PdfName xObjectName) {
14301429
// ignore XObject subtype
14311430
}
14321431
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.itextpdf.kernel.pdf.canvas.parser.data;
2+
3+
import com.itextpdf.io.LogMessageConstant;
4+
import com.itextpdf.kernel.pdf.canvas.CanvasGraphicsState;
5+
6+
public class AbstractRenderInfo implements IEventData {
7+
8+
protected CanvasGraphicsState gs;
9+
private boolean graphicsStateIsPreserved;
10+
11+
public AbstractRenderInfo(CanvasGraphicsState gs) {
12+
this.gs = gs;
13+
}
14+
15+
@Override
16+
public CanvasGraphicsState getGraphicsState() {
17+
checkGraphicsState();
18+
return graphicsStateIsPreserved ? gs : new CanvasGraphicsState(gs);
19+
}
20+
21+
public boolean isGraphicsStatePreserved() {
22+
return graphicsStateIsPreserved;
23+
}
24+
25+
public void preserveGraphicsState() {
26+
checkGraphicsState();
27+
this.graphicsStateIsPreserved = true;
28+
gs = new CanvasGraphicsState(gs);
29+
}
30+
31+
public void releaseGraphicsState() {
32+
if (!graphicsStateIsPreserved) {
33+
gs = null;
34+
}
35+
}
36+
37+
38+
// check if graphics state was released
39+
protected void checkGraphicsState() {
40+
if (null == gs) {
41+
throw new IllegalStateException(LogMessageConstant.GRAPHICS_STATE_WAS_DELETED);
42+
}
43+
}
44+
}

kernel/src/main/java/com/itextpdf/kernel/pdf/canvas/parser/data/ClippingPathInfo.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,16 +45,18 @@ This file is part of the iText (R) project.
4545

4646
import com.itextpdf.kernel.geom.Matrix;
4747
import com.itextpdf.kernel.geom.Path;
48+
import com.itextpdf.kernel.pdf.canvas.CanvasGraphicsState;
4849

49-
public class ClippingPathInfo implements IEventData {
50+
public class ClippingPathInfo extends AbstractRenderInfo {
5051
private Path path;
5152
private Matrix ctm;
5253

5354
/**
5455
* @param path The path to be rendered.
5556
* @param ctm The path to be rendered.
5657
*/
57-
public ClippingPathInfo(Path path, Matrix ctm) {
58+
public ClippingPathInfo(CanvasGraphicsState gs, Path path, Matrix ctm) {
59+
super(gs);
5860
this.path = path;
5961
this.ctm = ctm;
6062
}

kernel/src/main/java/com/itextpdf/kernel/pdf/canvas/parser/data/IEventData.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,12 @@ This file is part of the iText (R) project.
4343
*/
4444
package com.itextpdf.kernel.pdf.canvas.parser.data;
4545

46+
import com.itextpdf.kernel.pdf.canvas.CanvasGraphicsState;
47+
4648
/**
4749
* Marker interface for the set of classes used to combine
4850
* parameters required for different types of events.
4951
*/
5052
public interface IEventData {
53+
CanvasGraphicsState getGraphicsState();
5154
}

0 commit comments

Comments
 (0)