You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@pdfbox.apache.org by "Tilman Hausherr (JIRA)" <ji...@apache.org> on 2015/07/15 23:04:05 UTC

[jira] [Reopened] (PDFBOX-2881) Radial and Axial shading steps are calculated incorrectly

     [ https://issues.apache.org/jira/browse/PDFBOX-2881?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Tilman Hausherr reopened PDFBOX-2881:
-------------------------------------

Reopening, now the radial shading fail. Try e.g. the files asy-ring.pdf, asy-shadestroke.pdf, color_gradient.pdf, eci_altona-test-suite-v2_technical_H.pdf

> Radial and Axial shading steps are calculated incorrectly
> ---------------------------------------------------------
>
>                 Key: PDFBOX-2881
>                 URL: https://issues.apache.org/jira/browse/PDFBOX-2881
>             Project: PDFBox
>          Issue Type: Bug
>          Components: Rendering
>    Affects Versions: 2.0.0
>            Reporter: John Hewson
>            Assignee: John Hewson
>              Labels: shading
>             Fix For: 2.0.0
>
>
> I found a shading bug while writing some code to dump all shadings in a PDF. I don't know if this affects PDF rendering within PageDrawer or not.
> RadialShadingContext and AxialShadingContext use the following code in their constructors to calculate the number of steps (pixels) in the shading and build a lookup table for each step:
> {code}
> // transform the distance to actual pixel space
> // use transform, because xform.getScaleX() does not return correct scaling on 90° rotated matrix
> Point2D point = new Point2D.Double(longestDistance, longestDistance);
> matrix.transform(point);
> xform.transform(point, point);
> factor = (int) Math.max(Math.abs(point.getX()), Math.abs(point.getY()));
> colorTable = calcColorTable();
> {code}
> The variable "factor" is the number of steps and "matrix" is the parent stream's matrix + the pattern matrix, so this code is taking the current scale and assuming that that is equal to the number of pixels. This works when a pattern is painted onto a 0...1 scaled surface, but otherwise it produces incorrect results.
> There's no way to calculate the number of pixels in the device from its scale, or its matrix. Paint#createContext() provides the device bounds Rectangle, which is what we should be using. Indeed, this is handled correctly in the other shading contexts.



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

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: dev-help@pdfbox.apache.org