Round 3...

On 10/6/2010 1:36 PM, Denis Lila wrote:

webrev:
http://icedtea.classpath.org/~dlila/webrevs/noflatten/webrev/

I'm going to set the rest of Stroker.java aside for a moment and focus on other areas where I have some better knowledge...

Renderer.java:

lines 83, 91, 99: can't these be folded into the prior loops? You can update their Y while searching for the [eqc]hi value.

lines 178,192: indent to the preceding "("? (Also, I'm a big fan of moving the "{" to a line by itself if an conditional or argument list was wrapped to more than 1 line - the 2D team tends to use that style everywhere in the 2D code...)

line 193: add fieldForCmp here instead of every time in the loop? (The compiler will probably/hopefully do that anyway)

line 238: If X0,Y0,XL,COUNT were bumped up by 1 then you could just reuse "SLOPE" from the linear indices - just a thought.

lines 521,527,533: Why are these executed twice? You call these methods again after the "initialize common fields" code. That seems like double the work just to maybe save 4 lines of shared code? Maybe put the 4 lines of shared code in a helper function that all of the init() methods call?

line 574: indentation?

line 566: shouldn't horizontal lines be ignored? they don't affect rasterization.

line 612: delete?  Or will this be making a comeback sometime?

lines 624,626: indentation?

lines 724,725: doesn't the assert false omit these? I usually throw an InternalError in cases like this with a description of what went wrong.

I've read up through the use of the cache in emitRow(). I'll continue with reviewing the cache in the next set, meanwhile I also took a look at the helper classes...

Helpers.java:

line 37: If it can't be instantiated, why does it take arguments?

getTransformedPoints isn't used?
getUntransformedPoints isn't used?
fillWithIndxes(float) isn't used?
evalQuad isn't used? (Though it does provide symmetry with evalCubic which is used)
getFlatness* aren't used?
ptSegDistSq isn't used?

line 105: There is a closed form solution to cubic roots. I unfortunately used a bad version in CubicCurve2D.solveCubic and I don't remember if I ever went back and fixed it (it may even have been "Cardano's method" for all I know). There are versions out there which do work better. The problem with the one in CC2D was that I copied it out of Numerical Recipes in C and apparently the author somehow assumed that all cubics would have 1 or 3 roots, but a cubic of the form (x-a)(x-a)(x-b) has 2 roots. D'oh! While I did find other implementations out there on the net, in the end fixing the closed form solution seemed wrought with issues since many of the tests would use radically different approaches depending on tiny changes in one of the intermediate results and so I worried about FP error even in doubles possibly skewing the results. I think you should leave your code in there, but I wanted to fill you in on other possibities.

BezCurve.java:

Didn't you get a complaint that this class is defined in a file of the wrong name? Maybe the compiler doesn't complain because the class isn't public, but one of the names should change to match.

line 59: I'd throw an internal error and the compiler would be appeased.

line 35: If you make this a "create" factory then it can leverage the code in the existing constructors - just a thought.

I'll stop here and hit send - not much left after this round...

                ...jim

Reply via email to