I agree with Scott, it seems bad if gradient doesn't match stroke bounds when 
applied to stroke. 

Jasper

> On Nov 18, 2013, at 9:36 PM, Scott Palmer <swpal...@gmail.com> wrote:
> 
> It wasn't clear from your original message that the stroke bounds were much 
> more expensive. Given that additional info I don't think my idea is 
> practical.  That makes it harder to decide. I like your choice of fill bounds 
> to ease the ability to align the gradients, but I don't like the idea of not 
> being able to use a gradient that goes to the edge of the stroke.  Depending 
> on the stroke width that could be a significant and very visible limitation. 
> 
> I wonder how frequently aligning the gradient in the stroke and the fill 
> comes up?  It seems using the stroke bounds for the stroke and the fill 
> bounds for the fill is more correct, even if it makes aligning the gradients 
> more difficult.  That alignment is nice, but having the gradient work 
> consistently in terms of what 0% and 100% mean is probably important.
> 
> Scott
> 
>> On Nov 18, 2013, at 8:17 PM, Jim Graham <james.gra...@oracle.com> wrote:
>> 
>> Hi Scott,
>> 
>> That's an odd take on it.  It wouldn't be readily obvious to a developer why 
>> their background rectangle had the gradient a little off if they never 
>> planned to ever stroke it.
>> 
>> Also, keep in mind that while it might be slightly more expensive to 
>> calculate tight bounds than loose bounds, it is MUCH more expensive to 
>> calculate stroke bounds on a shape.  It's not a trivial "OK, add a few 
>> pixels for the stroke" type of case, you have to trace out the path and 
>> compute the perpendicular extensions in many cases.  So, basically you are 
>> saying "always do the most expensive bounds operation for ever shape that is 
>> filled even if the extra work would never come into play"...?
>> 
>>           ...jim
>> 
>>> On 11/18/2013 4:58 PM, Scott Palmer wrote:
>>> I would lean towards using the stroke bounds for both.  Those being the 
>>> "real" bounds, and resulting in less mis-aligned gradients.  Always 
>>> calculate the stroke bounds as if the shape will be stroked, so it doesn't 
>>> affect Canvas.
>>> If you don't want that to affect the bounds used for a gradient fill when 
>>> you aren't stroking, set the stoke width to 0.
>>> 
>>> 
>>> Scott
>>> 
>>>> On Nov 18, 2013, at 5:58 PM, Jim Graham <james.gra...@oracle.com> wrote:
>>>> 
>>>> Felipe mentioned recently that we encountered some issues in fixing a bug 
>>>> with SVGPath.
>>>> 
>>>> The outcome of this fix could be a significant change in how your 
>>>> proportional gradient fills look and so we'd like to get feedback on the 
>>>> various ideas.  You can read about them in that Jira issue, but I'll also 
>>>> summarize below.  Discussion would probably be better on the mailing list, 
>>>> but we eventually need to work the salient points back into the Jira issue 
>>>> for future maintenance.
>>>> 
>>>> The basic issue is that we had a disagreement between the way that the 
>>>> shape caching code worked and the way that uncached shapes were filled 
>>>> with proportional paints.
>>>> 
>>>> First, there is the concept of tight and loose bounds.  Loose bounds are 
>>>> very cheap to calculate, but can contain area not strictly inside the 
>>>> shape.  Tight bounds are more careful to figure out exactly how far curved 
>>>> sections of the shape reach, but a fair number of calculations and 
>>>> recursions are needed to accurately calculate those extents.
>>>> 
>>>> Our current code will use loose bounds of the basic shape (i.e. the part 
>>>> that is filled) to calculate the bounds for proportional paints when you 
>>>> first paint a shape - whether you stroke it, fill it, or both.
>>>> 
>>>> But, if you ran with shape mask caching (the default mode) then after a 
>>>> rendering or 2 we would decide to cache the antialias coverage mask and we 
>>>> would then use the node's content bounds to figure the bounds for the 
>>>> proportional paint.  The content bounds are calculated more precisely as 
>>>> tight bounds, though, so they didn't always agree with the bounds used in 
>>>> those first few uncached renderings.
>>>> 
>>>> The net result is that the proportional paint would shift after the first 
>>>> couple of frames unless you animated the shape and then it would revert 
>>>> while you were animating and then shift back when it was stable.
>>>> 
>>>> There is also the Canvas object that can also render proportional paints, 
>>>> and it does so using the same code that the shape nodes use when they 
>>>> don't have their coverage mask cached (i.e. loose fill bounds).
>>>> 
>>>> We'd like to make all of this as consistent as possible.  Here are the 
>>>> various decisions and how they'd impact code:
>>>> 
>>>> - Loose bounds are faster to calculate for shapes that aren't likely to be 
>>>> reused.  The uncached shape rendering used them because the shapes may 
>>>> change before we need the bounds again.  Canvas uses it because it is an 
>>>> immediate mode API with no input on how often it may see a particular 
>>>> shape again.
>>>> 
>>>> - Tight bounds would likely be less suprising to developers and users, 
>>>> though.  They are better for hit testing and damage management because 
>>>> they generate fewer false positive hits.  They are also fairly fast to 
>>>> calculate for most shapes and it is a rare shape that we'd have to recurse 
>>>> much to get it right.  Also, for straight edges there is no difference in 
>>>> performance to calculate tight or loose bounds.
>>>> 
>>>> All in all, it would probably be better for the FX API to standardize on 
>>>> tight bounds and treat any cases where we noticeably affect performance 
>>>> (which should be very rare) as opportunities for tuning.  This may not be 
>>>> compatible with the first rendering of current Shape nodes, but they would 
>>>> shift back and forth anyway so we aren't worried about incompatibility 
>>>> with an inconsistent system.
>>>> 
>>>> The other part of the decision is which bounds to use.
>>>> 
>>>> Currently uncached rendering uses fill bounds, and mask-cached rendering 
>>>> uses the content bounds which depends on whether you supply a stroke or a 
>>>> fill paint so it could be either fill bounds or stroke bounds.
>>>> 
>>>> - For filled-only shapes we obviously want to use the "fill bounds".
>>>> 
>>>> - For stroked and filled shapes, we have 3 choices:
>>>> 
>>>> - - use fill bounds for both paints so that the geometry used for 
>>>> proportional stroke and fill paints are similar for both parts of those 
>>>> nodes.  This helps line up any color discontinuities or highlights between 
>>>> the two.
>>>> 
>>>> - - use stroke bounds for both which also means the two are consistent, 
>>>> but Canvas can't really do this because it doesn't know if you are filling 
>>>> and stroking until it sees the latter operation
>>>> 
>>>> - - use fill bounds for fill and stroke bounds for stroke which means the 
>>>> geometries of the two are different and it makes it harder to line up the 
>>>> transitions of proportional stroke+fill shapes, but Canvas can do this so 
>>>> Canvas vs. Shape node remain consistent
>>>> 
>>>> I'm not sure which of the above is the best, but I lean towards "fill 
>>>> bounds for both" because it allows consistent geometry for stroke+fill and 
>>>> it allows consistent behavior between Canvas and Shape node, at the 
>>>> possible expense of "0% on a stroke isn't at the edge of the stroke".
>>>> 
>>>> Thoughts?
>>>> 
>>>>           ...jim

Reply via email to