Hi Jim. > breakPtsAtTs - [whine]I sort of feel as if this method is trying to > abstract something that is not really that bad to just do inline and > in > trying to apply the abstraction it might make the calling code > slightly > simpler, but it created a mess here by trying to shoehorn a natural > inline process into an "Iterator" paradigm. :-( [/whine] Having said > that, the new changes to this look good. ;-)
I agree that the complexity of the abstraction is higher than what it saves in the calling code (but I also think it makes the calling code more than slightly simpler since it saves us one or two local variables in the caller). The reason I wrote this method was because I was hoping to perhaps use it in Dasher too (like I describe in the TODO), and I think I was using it in some other place at the time. Now the only calling function is in Stroker, so I could inline it if you want, but I'm not too eager to do that, because what we have works, and we wouldn't gain much from inlining. > LengthIterator comment - any reason to delete it? Too hard to keep it > up to date? I reintroduced it. I don't even remember deleting it, or why I did so :/ > line 342 - 0/0 == NaN which fails all tests, but should be considered > to > have low acceleration, no? Also, what about the test: > within(len1, len2, len2*err) > would that have similar properties? The only advantage here is that > multiplies are usually faster than divides. They are equivalent. I'm using your version now. This also fixes the 0/0 problem. > line 176 and 183-186 - does Math.scalb() go faster for these? scalb is slightly slower on my machine (by about 5%). > line 190 - what happened to the adjustment that used to be at line 359 > (i.e. dx,dy greater than INC_BND)? Did it not save very many lines in > the output? I eliminated it because of how the dx and ddx values change for quadratic curves. I don't remember exactly what was going on, but one of them stays constant so every test had the same outcome and was therefore a waste. A better explanation can be found in ProcesPath.c (which is one of the palces from where I got the algorithm). > line 80 - technically "ecur >= 0" would work as well and would > probably > be cheaper on most architectures if the condition codes are already > set > by the fetch - if not then comparing to 0 is usually cheaper than > comparing to a number. Though, I prefer using 0 as the terminator > since > it doesn't require an Arrays.fill() (though it does require biasing > the > stored indices by +1 so that they aren't null which may offset some of > the array fill savings). I didn't implement this because of your last point. I could, if you think the benefits would definitely be worth it. I've implemented all your other suggestions. Thank you, Denis. ----- Original Message ----- > Hi Denis, > > Curve.java > > line 242 - remove "both" > > > Dasher.java > > > > line 385 - cache the "haveLowAccel" return value until the curve is > redivided? > > caching flatLeafCoef - If you add cache[3] and save the value to > muliply > by t (either -z or -y) then you wouldn't need to recalculate x,y,z > every > time: > if (cache[2] < 0) { > float x = ..., y = ...; > if (type == 8) { > float z = ...; > cache[0..2] = ...; > cache[3] = -z; > } else { > cache[0..2] = ...; > cache[3] = -y; > } > } > float a=...; > float b=...; > float c=...; > float d=t*...; > > Helpers.java > > line 147 {} > > PiscesRE.java > > lines 286,288 - (dog whimpers) I noticed that the two lines you've > modified are the only 2 lines in the comment that have apostrophes > that > my gnuemacs is allergic to. Any chance you'd get rid of them for me? > ;-) > > Renderer.java > > > line 87 - should this be commented out at some point? > > line 135 - "NEXT and OR" and "indices" > > > line 188 - it might look cleaner to just declare these inside the loop > and add them from x0,y0 rather than +=. I'm not sure if it will make a > difference in performance, though, given the vagaries of FPU > scheduling. > > > line 286 - in my version I moved the calculation of slope up above > here > and just used the sign of the slope as the test for x ordering. Note > that if the slope calculations immediately precedes the "if (slope < > 0)" > test then the condition codes are likely already set as a side effect > of > the previous operation. I also just put the "edgeMinMaxX" tests in the > two halves of the "if" statement and avoided the need for the extra > minX,maxX variables, though with a slight duplication of code. > > line 442 - the code actually adds "2" > > line 480 - interesting math trick which avoids a conditional: > crorientation = ((curxo & 0x1) << 1) - 1; > > ...jim > > On 2/1/2011 6:16 PM, Denis Lila wrote: > > Ah, I'm sorry. I forgot to CC the list. > > > > ----- Forwarded Message ----- > > From: "Denis Lila"<dl...@redhat.com> > > To: "Jim Graham"<james.gra...@oracle.com> > > Sent: Tuesday, February 1, 2011 6:04:09 PM > > Subject: Re: [OpenJDK 2D-Dev] CubicCurve2D.solveCubic and > > containment/intersection bugs. > > > > Hi Jim. > > > > The webrev for the performance improvement is here: > > http://icedtea.classpath.org/~dlila/webrevs/perfWebrev/webrev/ > > > > I have changed a few things since the last time you looked at it. > > The largest change is in Curve.java in breakPtsAtTs. I changed its > > return > > from an Iterator<float[]> to an Iterator<Integer>, which allowed me > > to > > change middle in Stroker from a float[2][8] to a float[16]. I also > > eliminated the call to updateTs and the bouncing back and forth of > > the > > subdivided curves in breakPtsAtTs. > > > > The other major change is the implementation of the cubic solver in > > Helpers.java (which is used in Dasher.LengthIterator). It's almost > > identical to what I just commited to awt.geom.CubicCurve2D. I'm not > > using the version in awt.geom because I want to avoid the array > > creations > > but most importantly because we don't need anything even close to > > the > > accuracy that CubicCurve2D provides. In fact, most of the time*, > > LengthIterator's arguments to solveCubic are such that there is only > > one solution, so I considered removing the 2 root case altogether > > just > > to skip the within(D, 0, 1e-8) call (I haven't done this yet because > > I wanted to check with you first). > > > > * "most of the time" is a bit of an understatement. I've tested this > > with > > tens of thousands of Dasher.curveTo calls, and I've never seen a > > case > > where there is more than one root. > > > > Regards, > > Denis. > > > > ----- Original Message ----- > >> Actually, if you just want to type up a quick "description" I'll > >> file > >> the bug... > >> > >> ...jim > >> > >> On 1/27/2011 2:26 PM, Jim Graham wrote: > >>> On 1/27/2011 2:03 PM, Denis Lila wrote: > >>>> Well, it is pushed. Now all that's left on my end is the > >>>> performance > >>>> improvement for pisces (dashing in particular). Could you please > >>>> file > >>>> a performance regression bug for it? > >>> > >>> What are we regressing from? Is it slower than the previous > >>> OpenJDK > >>> rasterizer?