[ 
https://issues.apache.org/jira/browse/XGC-99?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14648931#comment-14648931
 ] 

Carsten Pfeiffer commented on XGC-99:
-------------------------------------

Yes, the image is valid. It happens with any PNG though. The reason is that 
that the streamVec only holds parts of the actual bytes of the png file. 
Specifically, the magic header is missing.

Here's a stacktrace of how it's used in FOP:

{code}
Thread [ModalContext] (Suspended (breakpoint at line 71 in PNGFile))    
        PNGFile.<init>(InputStream) line: 71    
        ImageLoaderRawPNG.loadImage(ImageInfo, Map, ImageSessionContext) line: 
73       
        CompositeImageLoader.loadImage(ImageInfo, Map, ImageSessionContext) 
line: 84    
        ImageProviderPipeline.execute(ImageInfo, Image, Map, 
ImageSessionContext) line: 154     
        ImageProviderPipeline.execute(ImageInfo, Map, ImageSessionContext) 
line: 99     
        ImageManager.getImage(ImageInfo, ImageFlavor[], Map, 
ImageSessionContext) line: 269     
        RTFHandler.putGraphic(AbstractGraphics, ImageInfo) line: 1192   
        RTFHandler.image(ExternalGraphic) line: 1108    
        RTFHandler.invokeDeferredEvent(FONode, boolean) line: 1561      
        RTFHandler.recurseFONode(FONode) line: 1728     
        RTFHandler.recurseFONode(FONode) line: 1803     
        RTFHandler.recurseFONode(FONode) line: 1803     
        RTFHandler.recurseFONode(FONode) line: 1803     
        RTFHandler.recurseFONode(FONode) line: 1803     
        RTFHandler.recurseFONode(FONode) line: 1751     
        RTFHandler.endPageSequence(PageSequence) line: 270      
        PageSequence.endOfNode() line: 130      
        FOTreeBuilder$MainFOHandler.endElement(String, String, String) line: 
360        
        FOTreeBuilder.endElement(String, String, String) line: 190      
{code}

This is where it reads the PNG contents from the ImageRawPNG in 
RTFHandler.putGraphic():
{code}
        if (image instanceof ImageRawStream) {
            ImageRawStream rawImage = (ImageRawStream)image;
            InputStream in = rawImage.createInputStream();
            try {
                rawData = IOUtils.toByteArray(in);
            } finally {
                IOUtils.closeQuietly(in);
            }
        }

Thread [ModalContext] (Suspended (breakpoint at line 1260 in RTFHandler))       
        RTFHandler.putGraphic(AbstractGraphics, Image) line: 1260       
        RTFHandler.putGraphic(AbstractGraphics, ImageInfo) line: 1194   
        RTFHandler.image(ExternalGraphic) line: 1108    
        RTFHandler.invokeDeferredEvent(FONode, boolean) line: 1561      
        RTFHandler.recurseFONode(FONode) line: 1728     
{code}

And eventually it fails when checking for the PNG magic header:
{code}
Thread [ModalContext] (Suspended (breakpoint at line 207 in 
RtfExternalGraphic$FormatPNG))      
        owns: RtfFile  (id=713) 
        RtfExternalGraphic$FormatPNG.isFormat(byte[]) line: 207 
        RtfExternalGraphic$FormatBase.determineFormat(byte[]) line: 111 
        RtfExternalGraphic.writeRtfContentWithException() line: 379     
        RtfExternalGraphic.writeRtfContent() line: 322  
        RtfExternalGraphic(RtfElement).writeRtf() line: 87      
        RtfTextrun.writeRtfContent() line: 483  
{code}


> PNGFile.getImageRawPNG() returns broken image data
> --------------------------------------------------
>
>                 Key: XGC-99
>                 URL: https://issues.apache.org/jira/browse/XGC-99
>             Project: XMLGraphicsCommons
>          Issue Type: Bug
>          Components: image codecs
>    Affects Versions: 2.0.1, trunk
>            Reporter: Carsten Pfeiffer
>
> The ImageRawPNG returned by PNGFile.getImageRawPNG() is broken because the 
> provided InputStream (streamVec) contains only part of the raw image data. 
> For a start the magic header is missing, but it's not enough to add it.
> To fix this, I copied the entire stream in the PNGFile constructor like this:
> {code}
>         stream.mark(Integer.MAX_VALUE);
>         ByteArrayOutputStream out = new ByteArrayOutputStream();
>         IOUtils.copy(stream, out);
>         rawStream = new ByteArrayInputStream(out.toByteArray());
>         out = null;
>         stream.reset();
> {code}
> and use the rawStream in favor of streamVec, which can be removed then.
> Testcases still run successful. This fixes RTF output not working with PNG 
> files in FOP because it checks for (missing) the PNG magic header.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to