mBlur creates and owns an A8 data buffer that we pass to mImageSurface,
targeted by mContext.
Sometimes, when we remove the last reference to mContext cairo wants to
take a snapshot copy of the data buffer. If this happens after we've
deleted mBlur in ~gfxAlphaBoxBlur, we may crash due to the data
buffer having been deleted already.
A partial solution is to clear mContext and mImageSurface to force
those snapshots to be taken before deleting mBlur. This is only a
partial solution since in principle the client of gfxAlphaBoxBlur
may have kept mContext alive with its own reference. In practice
we don't do that though.
A complete solution would require making the data buffer be owned
by mImageSurface, either directly or indirectly.
This fixes the multiplication by 1.5 in
gfxAlphaBoxBlur::CalculateBlurRadius (originally added in changeset
ce9f05b57b95 for bug 467518) to work correctly. It was previously a
multiplication by 1 due to integer division. CalculateBlurRadius
previously multiplied by 1.880; it now multiplies by 2.820.
This changes canvas shadow handling to multiply shadowBlur by 2 before
taking its square root, as described in the spec. This means that
canvas shadow blurs 8px or smaller are 1.5 times larger than they were
previously (due to the CalculateBlurRadius change), and canvas shadow
blurs larger than 8px are 2.121 times larger than they were previously
(due to the CalculateBlurRadius change *and* the additional factor of
sqrt(2)).
This changes text-shadow and -moz-box-shadow handling to use
CalculateBlurRadius on half of the value given instead of passing the
value through directly. This means that text-shadow and box-shadow
blurs are multiplied by 1.410 relative to their old sizes. It also
means that we round rather than floor, so that the effect that used to
be drawn by a blur in the range 1px to 1.99px is now drawn by a blur
anywhere in the range 0.36px to 1.05px, the effect that used to be drawn
by a blur in the range 2px to 2.99px is now drawn by a blur anywhere in
the range 1.06px to 1.77px, what used to be a drawn by a blur in the
range 3px to 3.99px is now drawn by a blur anywhere in the range 1.78px
to 2.47px, etc.