My concern is that  this will get partially done but never completed, and
we'll end up in a situation where we have two styles in place. We have a
bad track record with that sort of thing.

Nick

On Thu, Feb 9, 2017 at 1:45 PM, Jeff Muizelaar <jrmui...@gmail.com> wrote:

> It's not very easy to reason about overflow issues with our current
> representation. This means that we currently just pretend that they
> don't happen. The idea for changing the representation came up in
> response to a security bug where we didn't really have a better
> solution.
>
> Changing to x1, x2, y1, y2 will allow us to match the pixman rectangle
> representation that we use for regions. The region code shows quite a
> bit profiles so even a small improvement in this area is nice to have.
>
> -Jeff
>
> On Wed, Feb 8, 2017 at 9:19 PM, David Major <dma...@mozilla.com> wrote:
> > Is there a specific problem that's being solved by this proposal? It
> would
> > be helpful to make this a bit more concrete, like "these benchmarks go x%
> > faster", or "here's a list of overflow bugs that will just vanish", or
> > "here's some upcoming work that this would facilitate".
> >
> > On Thu, Feb 9, 2017 at 1:56 PM, Botond Ballo <bba...@mozilla.com> wrote:
> >>
> >> Hi everyone!
> >>
> >> I would like to propose changing the internal representation of
> >> rectangles in platform code.
> >>
> >> We currently represent a rectangle by storing the coordinates of its
> >> top-left corner, its width, and its height. I'll refer to this
> >> representation as "x/y/w/h".
> >>
> >> I would like to propose storing instead the coordinates of the
> >> top-left corner, and the coordinates of the bottom-right corner. I'll
> >> refer to this representation as "x1/y1/x2/y2".
> >>
> >> The x1/y1/x2/y2 representation has several advantages over x/y/w/h:
> >>
> >>   - Several operations are more efficient with x1/y1/x2/y2, including
> >> intersection,
> >>     union, and point-in-rect.
> >>   - The representation is more symmetric, since it stores two quantities
> >> of the
> >>     same kind (two points) rather than a point and a dimension
> >> (width/height).
> >>   - The representation is less susceptible to overflow. With x/y/w/h,
> >> computation
> >>     of x2/y2 can overflow for a large range of values of x/y and w/h.
> >> However,
> >>     with x1/y1/x2/y2, computation of w/h cannot overflow if the
> >> coordinates are
> >>     signed and the resulting w/h is unsigned.
> >>
> >> A known disadvantage of x1/y1/x2/y2 is that translating the rectangle
> >> requires translating both points, whereas translating x/y/w/h only
> >> requires translating one point. I think this disadvantage is minor in
> >> comparison to the above advantages.
> >>
> >> The proposed change would affect the class mozilla::gfx::BaseRect, and
> >> classes that derive from it (such as CSSRect, LayoutRect, etc., and,
> >> notably, nsRect and nsIntRect), but NOT other rectangle classes like
> >> DOMRect.
> >>
> >> I would like to propose making the transition as follows:
> >>
> >>   - Replace direct accesses to the 'width' and 'height' fields
> throughout
> >>     the codebase with calls to getter and setter methods. (There aren't
> >>     that many - on the order of a few dozen, last I checked.)
> >>
> >>   - Make the representation change, which is non-breaking now that
> >>     the direct accesses to 'width' and 'height' have been removed.
> >>
> >>   - Examine remaining calls to the getters and setters for width and
> >>     height and see if any can be better expressed using operations
> >>     on the points instead.
> >>
> >> The Graphics team, which owns this code, is supportive of this change.
> >> However, since this is a fundamental utility type that's used by a
> >> variety of platform code, I would like to ask the wider platform
> >> development community for feedback before proceeding. Please let me
> >> know if you have any!
> >>
> >> Thanks,
> >> Botond
> >>
> >> [1]
> >> http://searchfox.org/mozilla-central/rev/672c83ed65da286b68be1d02799c35
> fdd14d0134/gfx/2d/BaseRect.h#46
> >> _______________________________________________
> >> dev-platform mailing list
> >> dev-platform@lists.mozilla.org
> >> https://lists.mozilla.org/listinfo/dev-platform
> >
> >
> _______________________________________________
> dev-platform mailing list
> dev-platform@lists.mozilla.org
> https://lists.mozilla.org/listinfo/dev-platform
>
_______________________________________________
dev-platform mailing list
dev-platform@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-platform

Reply via email to