[reportlab-users] A Bug in TextObject.moveCursor?
Ian
reportlab-users@reportlab.com
Mon, 15 Mar 2004 22:43:03 -0000
Now I just feel like I'm spamming the list :)
A bugfix in my bugfix:
line 118 should read:
self._y0 -= lastDy
not
sefl._y0 -= lastDy
!
The downside of not having a compler, eh? (And also a good sign that my
handful of test cases wern't covering all my edits, which is more
concerning!)
Ian.
----- Original Message -----
From: "Ian" <reportlab-user@agon.com>
To: <reportlab-users@reportlab.com>
Sent: Monday, March 15, 2004 10:36 PM
Subject: Re: [reportlab-users] A Bug in TextObject.moveCursor?
> Okay, here are the bugfixes / patch for the TextObject class as a diff.
>
> Notes:
> 1. It is well commented (overly perhaps), so it should speak for itself.
> 2. It is still not perfect with respect to the cursor location matching
> where text will be drawn. In particular it doesn't fix the problems with
> setting different rise amounts, or using more complex text matrices.
> 3. I've tested it on all my reportlab applications, but it could benefit
> from a wider testing, so feel free to run in against your stuff. Make sure
> if it doesn't work, it isn't because your code was naturally working
around
> the bug (a couple of my code snippets were doing this).
>
> 61,62d57
> <
> < # The current cursor position is at the text origin
> 65,68c60
> <
> < # Keep track of the start of the current line
> < self._x0 = x
> < self._y0 = y
> ---
> > self._x0 = x #the margin
> 76,86c68,70
> <
> < # The current cursor position is at the text origin Note that
> < # we aren't keeping track of all the transform on these
> < # coordinates: they are relative to the rotations/sheers
> < # defined in the matrix.
> < self._x = x
> < self._y = y
> <
> < # Keep track of the start of the current line
> < self._x0 = x
> < self._y0 = y
> ---
> > #we only measure coords relative to present text matrix
> > self._x = e
> > self._y = f
> 89,98c73,75
> <
> < """Starts a new line at an offset dx,dy from the start of the
> < current line. This does not move the cursor relative to the
> < current position, and it changes the current offset of every
> < future line drawn (i.e. if you next do a textLine() call, it
> < will move the cursor to a position one line lower than the
> < position specificied in this call. """
> <
> < # Check if we have a previous move cursor call, and combine
> < # them if possible.
> ---
> > """Moves to a point dx, dy away from the start of the
> > current line - NOT from the current point! So if
> > you call it in mid-sentence, watch out."""
> 105,120c82,83
> <
> < # Work out the last movement
> < lastDx = float(L[-3])
> < lastDy = float(L[-2])
> <
> < # Combine the two movement
> < dx = dx + lastDx
> < dy = dy - lastDy
> <
> < # We will soon add the movement to the line origin, so if
> < # we've already done this for lastDx, lastDy, remove it
> < # first (so it will be right when added back again).
> < self._x0 -= lastDx
> < sefl._y0 -= lastDy
> <
> < # Output the move text cursor call.
> ---
> > dx = dx + float(L[-3])
> > dy = dy - float(L[-2])
> 123,128d85
> < # Keep track of the new line offsets and the cursor position
> < self._x0 += dx
> < self._y0 += dy
> < self._x = self._x0
> < self._y = self._y0
> <
> 130c87
> < """Starts a new line dx away from the start of the
> ---
> > """Moves to a point dx away from the start of the
> 317,318d273
> <
> < # Update the coordinates of the cursor
> 324,329d278
> <
> < # Update the location of the start of the line
> < # self._x0 is unchanged
> < self._y0 = self._y
> <
> < # Output the text followed by a PDF newline command
> 349,350d297
> < # Output each line one at a time. This used to be a long-hand
> < # copy of the textLine code, now called as a method.
> 352c299,304
> < self.textLine(line)
> ---
> > self._code.append('%s T*' % self._formatText(line))
> > if self._canvas.bottomup:
> > self._y = self._y - self._leading
> > else:
> > self._y = self._y + self._leading
> > self._x = self._x0
>
>
>
>
>
>
> ----- Original Message -----
> From: "Ian" <reportlab-user@agon.com>
> To: <reportlab-users@reportlab.com>
> Sent: Monday, March 15, 2004 9:33 PM
> Subject: Re: [reportlab-users] A Bug in TextObject.moveCursor?
>
>
> > Right, I've done some investigation and moveCursor is buggy (or at least
> > incorrect)
> >
> > A. The bug in moveCursor
> >
> > moveCursor appears to do two things:
> > 1. It checks if the previous command was also a move cursor ('Td' in
PDF),
> > if so it combines the two commands into one (which it SHOULDN'T DO, if
the
> > move cursor is relative to the start of the line! - coimbining two calls
> > both relative to the start of the line, is equivalent to ignoring the
> first
> > call all together - BUT see part B of this mail).
> > 2. It outputs the 'Td' command into PDF.
> >
> > Nowhere does it change the cursor position: _x and _y members of the
> > TextObject class. As the following interactive session shows:
> >
> > >>> to = c.beginText()
> > >>> to.setTextOrigin(100,500)
> > >>> to.textOut('hello')
> > >>> to.getCursor()
> > (124.0, 500)
> > >>> to.moveCursor(100,0)
> > >>> to.getCursor()
> > (124.0, 500) <-- should be (200,500)
> > >>> to.textOut('there')
> > >>> to.getCursor()
> > (147.988, 500) <-- should be (223.988,500)
> >
> > So at the very least, it needs to be updated to add the lines:
> > _x = _xo + dx
> > _y = _y + dy
> >
> > But this alone won't work if the setRise function is used mid-line and
not
> > reset before the moveCursor is used.
> >
> >
> > B. The problem with multiple moveCursor calls
> >
> > This still doesn't solve the problem of multiple moveCursor calls not
> > working properly on the same line.
> >
> > That problem is to do with the Td operator in PDF. Td, according to
5.3.1
> of
> > the PDF specification, should "Move to the start of the next line,
offset
> > from the start of the current line by (tx , ty )." Which means that
> multiple
> > calls are effectively resetting the line offsets each time, So the
> > moveCursor call is offsetting relative to the 'start of the line, OR the
> > last moveCursor command on this line.' (hence why my example worked the
> > first time).
> >
> > All this means that, with my suggested change in A above, I can get my
> > application working. But it does mean that the documentation for
> moveCursor
> > is flawed. I would suggest that it is either updated, or a new method is
> > added that does a slightly more logical cursor movement operation.
> >
> > Either way something needs to be done to stop getCursor reporting the
> wrong
> > position after any moveCursor command.
> >
> > Ian.
> >
> > _______________________________________________
> > reportlab-users mailing list
> > reportlab-users@reportlab.com
> > http://two.pairlist.net/mailman/listinfo/reportlab-users
> >
>
> _______________________________________________
> reportlab-users mailing list
> reportlab-users@reportlab.com
> http://two.pairlist.net/mailman/listinfo/reportlab-users
>