Hi John, we're fine.
Maruan Am 30.12.2014 um 00:30 schrieb John Hewson <j...@jahewson.com>: > Hi Maruan, > >> On 28 Dec 2014, at 02:54, Maruan Sahyoun <sahy...@fileaffairs.de> wrote: >> >> OK - I think the Matrix code is wrong in getting the shear values compared >> to the description in the PDF spec. >> >> eg. using a text matrix to produce an 'italic' text >> >> AffineTransform transform = AffineTransform.getShearInstance(0, 0.5); >> contentStream.setTextMatrix(transform); >> >> produces the same result as >> >> contentStream.setTextMatrix(1, 0, 0.5, 1, 0, 0); >> >> >> Which is inline with the spec as c is the sy value. >> > > Yes. > >> Now getShearX, getShearY and create AffineTransform in Matrix are wrong IMHO >> as they have the extraction flipped between sx and sy. > > That’s what was puzzling me. I think what we’re doing is fine based on > AffineTransform’s definition of shear x/y, but that the terminology is simply > different from PDF, i.e. an x-skew is described in terms of a y-factor, so > it’s easy to see how the naming could be ambiguous. > >> e.g. printing the values of >> >> AffineTransform transform = AffineTransform.getShearInstance(0, 0.5); > > Ok, so that’s hx = 0, hy = 0.5 > >> produces >> >> AffineTransform[[1.0, 0.0, 0.0], [0.5, 1.0, 0.0]] >> >> where >> >> printing the values of >> >> Matrix matrix = new Matrix(); >> matrix.setValue(1, 0, 0.5f); > > Element (1,0) is hx, so you’re doing hx = 0.5, hy = 0, which is the opposite > of your example above. > >> produces >> >> AffineTransform[[1.0, 0.5, 0.0], [0.0, 1.0, 0.0]] >> >> which is wrong as it should produce AffineTransform[[1.0, 0.0, 0.0], [0.5, >> 1.0, 0.0]] > > Which would make sense for hx = 0.5 but what you wanted was: > > matrix.setValue(0, 1, 0.5f) > > which produces the expected result: > > AffineTransform[[1.0, 0.0, 0.0], [0.5, 1.0, 0.0]] > > So I think we’re ok. > > — John > >> >> BR >> >> Maruan >> >> Am 27.12.2014 um 23:47 schrieb John Hewson <j...@jahewson.com>: >> >>> Yes, the pure matrix code seems to work fine. As do the examples which >>> Tilman mentioned. I can’t find any issue with the code itself. However, we >>> make use the following Matrix method: >>> >>> public AffineTransform createAffineTransform() >>> { >>> AffineTransform retval = new AffineTransform( >>> single[0], single[1], // m00 m10 = scaleX shearY >>> single[3], single[4], // m01 m11 = shearX scaleY >>> single[6], single[7] ); // m02 m12 = tx ty >>> return retval; >>> } >>> >>> Recall that single[] is the array: >>> >>> | sx hy 0 | >>> | hx sy 0 | >>> | tx ty 1 | >>> >>> Which is fine, except that shear-x and shear-y are flipped vs. the wording >>> in the PDF spec, namely: >>> >>> "Skew shall be specified by [1 tan a tan b 1 0 0], which skews the x axis >>> by an angle a and the y axis by >>> an angle b.” >>> >>> But the AffineTransform constructor uses the following parameters: >>> >>> "m00 - the X coordinate scaling element of the 3x3 matrix >>> m10 - the Y coordinate shearing element of the 3x3 matrix >>> m01 - the X coordinate shearing element of the 3x3 matrix >>> m11 - the Y coordinate scaling element of the 3x3 matrix >>> m02 - the X coordinate translation element of the 3x3 matrix >>> m12 - the Y coordinate translation element of the 3x3 matrix" >>> >>> At this point I’m left thinking that Java and PDF have chosen different >>> meanings of “x” and “y” when talking about skew, indeed this appears to be >>> the case, as the PDF spec defines the x-coordinate transform on p120 as: >>> >>> x’ = a*x + c*y + e >>> >>> while the AffineTransform documentation defines the same transform as: >>> >>> x' = [ m00*x + m01*y + m02 ] >>> >>> which might seem different until one realises that m00 = a, m01 = c, m02 = >>> e. The only difference appears to be the description that c "skews the y >>> axis” in PDF and m01 is "the X coordinate shearing" in AffineTransform. It >>> seems like PDF is weird in this regard? >>> >>> -- John >>> >>>> On 27 Dec 2014, at 16:51, Maruan Sahyoun <sahy...@fileaffairs.de> wrote: >>>> >>>> Hi, >>>> >>>> I tried the following with skew being [1 tan a tan b 1 0 0] according to >>>> the spec. >>>> >>>> Matrix matrix = new Matrix(); >>>> >>>> which gives me [1.0,0.0,0.0,1.0,0.0,0.0] >>>> >>>> then >>>> >>>> matrix.setValue(0, 1, 0.5f); >>>> matrix.setValue(1, 0, 0.7f); >>>> >>>> which shall set the tan a and tan b values >>>> >>>> which gave me >>>> >>>> [1.0,0.5,0.7,1.0,0.0,0.0] >>>> >>>> then >>>> >>>> Matrix matrix2 = new Matrix() >>>> >>>> again being [1.0,0.0,0.0,1.0,0.0,0.0] >>>> >>>> then >>>> >>>> matrix.concatenate(matrix2) >>>> >>>> resulting in [1.0,0.5,0.7,1.0,0.0,0.0] >>>> >>>> To me that indicates that the pure matrix class is fine for that case. >>>> What are the arguments to the Concatenate operator in your case? Could it >>>> be that reading the values is not OK? >>>> >>>> BR >>>> >>>> Maruan >>>> >>>> Am 27.12.2014 um 14:16 schrieb John Hewson <j...@jahewson.com>: >>>> >>>>> Hi All, >>>>> >>>>> I’ve been looking at the Matrix class and trying to understand if it has >>>>> some problems. The Matrix class >>>>> in PDFBox uses the following matrix: >>>>> >>>>> | sx hy 0 | >>>>> | hx sy 0 | >>>>> | tx ty 1 | >>>>> >>>>> In a PDF file this matrix is represented as the 6-element array [a, b, c, >>>>> d, e, f] where the meaning of >>>>> the values comes from p118 and is [sx, hx, hy, sy, tx, ty]. Note that h >>>>> is used to mean shear/skew. >>>>> >>>>> The Concatenate operator class populates the Matrix as follows: >>>>> PDFBox PDF Spec >>>>> newMatrix.setValue(0, 0, a.floatValue()); sx a = sx >>>>> newMatrix.setValue(0, 1, b.floatValue()); hy c = hx <- Flipped? >>>>> newMatrix.setValue(1, 0, c.floatValue()); hx b = hy <- Flipped? >>>>> newMatrix.setValue(1, 1, d.floatValue()); sy d = sy >>>>> newMatrix.setValue(2, 0, e.floatValue()); tx e = tx >>>>> newMatrix.setValue(2, 1, f.floatValue()); ty f = ty >>>>> >>>>> I’ve annotated what PDFBox does on the left, compared to the PDF spec, >>>>> the x and y skew elements >>>>> (hx and hy) are flipped in PDFBox. This flip matches the order in which >>>>> AWT’s AffineTransform’s >>>>> constructor expects its elements but does not match the arrays used in >>>>> the PDF spec. >>>>> >>>>> Are we accidentally flipping skew-x and skew-y in the Concatenate >>>>> operator? >>>>> >>>>> -- John >>>>> >>>> >>> >> >