[
https://issues.apache.org/jira/browse/FLEX-17337?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14556929#comment-14556929
]
Steve Miller commented on FLEX-17337:
-------------------------------------
This problem is still there in 4.14.1, and is because of a rounding error in
the addObject() function. If the pageWidth is 576, then when the ratio is
calculated and used the result can be something like 576.0000000000001
Then when
var hPages:int = Math.ceil(objWidth / _pageWidth);
is run, hPages becomes 2 when it should be one.
I fixed this locally by rounding objWidth and objHeight before calling
Math.ceil(), ie:
objWidth = Math.round(objWidth);
objHeight = Math.round(objHeight);
// Find the number of pages required in vertical and
horizontal.
var hPages:int = Math.ceil(objWidth / _pageWidth);
var vPages:int = Math.ceil(objHeight / _pageHeight);
> FlexPrintJob making extra blank pages
> -------------------------------------
>
> Key: FLEX-17337
> URL: https://issues.apache.org/jira/browse/FLEX-17337
> Project: Apache Flex
> Issue Type: Bug
> Components: Print Management
> Affects Versions: Adobe Flex SDK 3.2 (Release)
> Environment: Affected OS(s): All OS Platforms
> Affected OS(s): All OS Platforms
> Language Found: English
> Reporter: Adobe JIRA
>
> Let me start by saying that this problem seems to occur randomly between
> machines, but is consistent within each machine. What I mean is that if
> breaks on machine A using Flash 10 and print driver X, it will always break
> using that combination. However, if you go to another machine, it may not
> break with those settings. Though, you will find on another machine it may
> break when you use Flash 9 and print driver Z.
> Luckily, I was able to find a repeatable condition on my development machine
> and was able to debug it into the framework, FlexPrintJob, specifically.
> So here's what's happening. When my app prints, I take full control over the
> paging. That is, I create a UIComponent of each individual page.
> Internally, in FlexPrintJob there is code to determine if your page can fit
> on a printed page and if it can't it creates extra pages. Since I am sizing
> my pages to be exactly the size of the printed page, in theory, this extra
> paging code inside FlexPrintJob should never become active, but it is in a
> bad way and I'll explain why.
> Some background. When dealing with floating point calcuations everyone knows
> that you can't depend on a value exactly equaling another value. Depending
> on how the number was calculated is may be off by a tiny epsilon, as is the
> case here. So, imagine you do some complex calculation and expect to get
> 10.0, but in reality you get 10.000000000000001. Then you have another
> calcuation where you do a Math.ceil on this. We'll you should have gotten
> 10, but you wind up getting 11, and it's unexpected. Likewise, if you use the
> mod (%) function and do x % 10 where x is 10.000000000000001, the result is
> 0.000000000000001, when 0 was expected.
> Well, in FlexPrintJob, this is what's happening. When calculating the number
> of pages in the horizontal and vertical directions, the code divides the
> passed in UICompoent size by the page size. In my case they should be equal
> giving one page. However, because some scaling had been involved in the
> calcuation, under some conditions, the values are "almost" equal. In my
> case, they were off by about 1e-14 or so. This minor amount messed up the
> ceiling calculation and subsequent modulo operation and caused the number of
> pages algorithm to be 2 instead of one, which is what caused the blank pages
> in between.
> Anyway, I addressed the problem by making a copy of FlexPrintJob and storing
> it locally with my code. I modified the ceiling calculation to substract a
> small epsilon prior to performing the ceiling. Likewise, when comparing the
> lastPageWidth and lastPageHeigth to zero, which comes from the modulo,
> instead of comparing it against zero, I take it's absolute value and make
> sure it's greater than epsilon.
> In my experience, I've found that this should be standard practice when
> dealing with floating points. I can't tell you how many times I used this
> same trick in other apps when performing ceiling and floor and modulo.
> Basically, you substract a small epsilon prior to calling ceil and you add a
> small epsilon prior to calling floor.
> I'm attaching my updated code if anyone one is interested. Please don't ask
> for me to attach repeating test case, since it's very device specific. The
> bottom line if anyone cares is that ceil on Number is bound to fail at some
> point if you don't do this, so I think my fix is sound.
> Hope this helps someone.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)