[CSSWG] Minutes Seattle F2F 2017-01-12 Part I: FX Breakout - Transforms [css-transforms]

=========================================
  These are the official CSSWG minutes.
  Unless you're correcting the minutes,
 Please respond by starting a new thread
   with an appropriate subject line.
=========================================


FX Track
++++++++

Transforms
----------

  - shane will investigate fixing the quaternation algorithm to
      address issue 33
(https://drafts.csswg.org/css-transforms-1/issues-wd-2013#issue-33)
      and the interpolation algorithm to address issue 40
      (https://drafts.csswg.org/css-transforms-1/issues-wd-2013#issue-40)
  - RESOLVED: For animation/rendering purposes, canonicalize
              perspective(0) to perspective(inf).
  - RESOLVED: Add transform-origin-x/y/z to the level 2 spec. (Issue
              29:
https://drafts.csswg.org/css-transforms-1/issues-wd-2013#issue-29)
  - RESOLVED: Close issue 31
(https://drafts.csswg.org/css-transforms-1/issues-wd-2013#issue-31)
              no change, as the relevant feature has been removed
              already.
  - RESOLVED: Issue 32
(https://drafts.csswg.org/css-transforms-1/issues-wd-2013#issue-32)
              is closed due to Sydney resolution, change has already
              been made to V&U.
  - RESOLVED: A zero-degree rotate() is treated like an identity
              transform, relative to other rotation functions.
              (Similar to how perspective(0) is now being treated.)
              Issue 34
(https://drafts.csswg.org/css-transforms-1/issues-wd-2013#issue-34).
  - RESOLVED: Issue 38
(https://drafts.csswg.org/css-transforms-1/issues-wd-2013#issue-38)
              - just accept that transitions will run whenever the
              functions differ, even if the endpoints are
              functionally identical.
  - RESOLVED: Reject issue 41
(https://drafts.csswg.org/css-transforms-1/issues-wd-2013#issue-41).
  - RESOLVED: Issue 42
(https://drafts.csswg.org/css-transforms-1/issues-wd-2013#issue-42)
              - respond that while this does look better, for web
              compat reasons we can't change, and we'll continue to
              push things that make it easier to avoid matrix
              interpolation.
  - Discussion on naming identity function will happen over github.
  - RESOLVED: Close issue 43
(https://drafts.csswg.org/css-transforms-1/issues-wd-2013#issue-43)
              as invalid, now that all transforms decompose with a
              4x4 matrix.
  - RESOLVED: Issue 45
(https://drafts.csswg.org/css-transforms-1/issues-wd-2013#issue-45)
              is a Geometry issue, with a warning that this function
              doesn't work with flattening anyway and should be
              dropped.
  - RESOLVED: The scale described in issue 44
              (https://drafts.csswg.org/css-transforms-1/issues-wd-2013#issue-44)
              doesn't belong in the transform specification as it
              isn't used by CSS transforms - instead the fairly
              simple functions that describe how to extract a scale
              from a matrix should be described directly in SVG.
  - RESOLVED: Issue 46
(https://drafts.csswg.org/css-transforms-1/issues-wd-2013#issue-46)
              - change the spec to instead use a UA stylesheet rule
              to give SVG elements a default transform-box value of
              view-box (rather than trying to map border-box to
              view-box).
  - Issue 48 (https://drafts.csswg.org/css-transforms-1/issues-wd-2013#issue-48)
      had several resolutions:
      - RESOLVED: Static transforms that overflow parent bounds do
                  cause a scrollbar.
      - RESOLVED: An animation that is in fill (finished, or not yet
                  started) is treated same as static, for purposes
                  of transform/bounds/scrollbars computation.
      - RESOLVED: Animated transforms that go out of bounds MAY show
                  a scrollbar during the animation.
      - There was a proposed resolution of "Overflow bounds are
          computed at end of layout, can be increased but not
          decreased by the effects of paint-level things like
          transforms." but the group decided to discuss over the
          lunch break.

===== FULL MINUTES BELOW ======

Agenda: https://wiki.csswg.org/planning/seattle-2017
Note: The group split the morning of the 12 January on two
      tracks: FX and Text.

Present:
  Rachel Andrew, Invited Expert
  Rossen Atanassov, Microsoft
  David Baron, Mozilla
  Bert Bos (W3C)
  Dave Cramer, Hachette Livre
  Emil A Eklund, Google
  Elika Etemad, Invited Expert
  Simon Fraser, Apple
  David Grogan, Google
  Koji Ishii, Google
  Peter Linss, Invited Expert
  Myles C. Maxfield, Apple
  Simon Pieters, Opera Software
  Naina Raisinghani, Google
  Melanie Richards, Microsoft
  Hiroshi Sakakibara (BPS, Beyond Perspective Solutions)
  Jen Simmons, Mozilla
  Geoffrey Sneddon, Invited Expert
  Alan Stearns, Adobe
  Surma, Google
  Jet Villegas, Mozilla
  Greg Whitworth, Microsoft
  Steve Zilles, Adobe

Scribe: TabAtkins

FX Track
++++++++

Transforms
==========

  Transforms issue list:
https://drafts.csswg.org/css-transforms-1/issues-wd-2013

perspective(0)
--------------

  <smfr> https://github.com/w3c/csswg-drafts/issues/886
  <dbaron> https://bugzilla.mozilla.org/show_bug.cgi?id=1009150
  smfr: We should revisit the perspective(0) issue.
  jet: Our Nightly code had clamping to float epsilon; we were
       testing our old code previously which made it invalid.
  dbaron: There was a site that needed perspective(0) to work.
  TabAtkins: But wk/blink has dramatically different behavior than a
             float-epsilon clamp.
  dbaron: They just needed the transform to be valid to hide the
          element with a big translate. It didn't matter that it got
          super skewed.

  smfr: So do we think this one example is enough to change our
        decision from yesterday?
  smfr: Clamping is a behavior change, because it makes things
        skewed that weren't skewed before.
  smfr: Have we seen people animate to it?
  RachelNabors: I've seen perspective get animated.
  smfr: To/from 0?
  RachelNabors: Dunno.
  <smfr> https://bugzilla.mozilla.org/show_bug.cgi?id=1316236
  <dbaron> https://bugzilla.mozilla.org/show_bug.cgi?id=1009150#c2
           says m.clippercard.com had transform:perspective(0)
           translate(-260px, 0);
  <smfr> lots of perspective(0) in http://s.imgur.com/min/global.css

  TabAtkins: So it looks like people need perspective(0) to be
             valid, but don't particularly care what it *does*.
  TabAtkins: So the imgur bug is them setting to perspective(0).
             Firefox previously made it invalid, which was fine; wk/
             blink make it no-op, which is fine; new Firefox
             clamping behavior is what makes it glitch.
  smfr: So that's a point against.
  TabAtkins: Yeah, one each way.
  dbaron: Looks like they're using perspective(0) just to pad out
          their transform lists.
  <dbaron> some of it was, not all
  <dbaron> just based on looking at
https://bugzilla.mozilla.org/show_bug.cgi?id=1316236#c15
  <smfr> https://jsfiddle.net/97smsycy/
  <smfr> https://jsfiddle.net/97smsycy/1/

  TabAtkins: We can evangelize to tell them to use
             perspective(100000in), same effect.
  TabAtkins: Their current code will start looking wrong once we fix
             our perspective() animation bug, which we resolved on
             yesterday. Their animations will start going to
             wacky-distortion-land before finally becoming normal.
  dbaron: How about treating perspective(0) like an identity
          function?
  smfr: That would preserve the current wk/blink animation behavior
        after we fix our perspective animation behavior.
  TabAtkins: It's still numerically discontinuous, but not
             behaviorally discontinuous in any given example. It's
             not ideal, but it's ok if we can't avoid it.

  RESOLVED: For animation/rendering purposes, canonicalize
            perspective(0) to perspective(inf).

  <gregwhitworth> regarding dbaron comment - Rachel and I don't
                  think id() is the best name for this function. Now
                  is probably not the best time to bikeshed - but it
                  would be good to open an issue once id() is
                  specified. cc: TabAtkins smfr shane

  Rossen: Do we still need to worry about the clamping part of
          yesterday's resolution?
  TabAtkins: Yes, that's needed to give calc() a defined behavior -
             when it results in an invalid value, it instead gets
             the min or max, and "first number larger than zero"
             doesn't exist; the clamping gives us an actual min
             value.
  smfr: So perspective(0) gets treated as perspective(inf), but
        perspective(calc(0)) is treated as perspective(epsilon)?
  TabAtkins: Yes.
  smfr: Weird.

Issue 29 - should transform-origin-x/y be in the spec?
------------------------------------------------------

  Rossen: Issue 29 - should transform-origin-x/y be in the spec?
  TabAtkins: And -z?
  smfr: If background-position has -x/y, we should match.

  RESOLVED: Add transform-origin-x/y/z to the level 2 spec. (Issue
            29:
https://drafts.csswg.org/css-transforms-1/issues-wd-2013#issue-29)

Issue 31 - exact definition of origin argument to rotate()
----------------------------------------------------------

  smfr: Issue 31 is talking about something that's been removed.
  TabAtkins: Looks like rotate() at some point had an optional
             rotation origin?
  RESOLVED: Close issue 31
(https://drafts.csswg.org/css-transforms-1/issues-wd-2013#issue-31)
            no change, as the relevant feature has been removed
            already.

Issue 32 - Unitless zero rotation
---------------------------------

  smfr: Issue 32, unitless zero in rotate()
  TabAtkins: Against my better judgment, the WG resolved that all
             units have unitless-zero.

  RESOLVED: Issue 32
(https://drafts.csswg.org/css-transforms-1/issues-wd-2013#issue-32)
            is closed due to Sydney resolution, change has already
            been made to V&U.

  <shane> resolution for unitless angles in these minutes:
          https://lists.w3.org/Archives/Public/www-style/2016Mar/0205.html
  <shane> the resolution was "RESOLVED: Angles can drop unit when
          value is 0"

Issue 33 - Make Rotation Less Weird in 3D transforms
----------------------------------------------------

  TabAtkins: So issue 33 is a 3d transform issue - there's a
             division by 0 in quaternion slerping in one particular
             case.
  <TabAtkins> https://software.hixie.ch/utilities/js/live-dom-viewer/?<!DOCTYPE%20html>%0A<body>%0A<p>foo%0A<style>%0A%40keyframes%20foo%20%7B%0A%20from%20%7B%20transform%3A%20rotate3d(0%2C%201%2C%200%2C%200deg)%3B%20%7D%0A%20to%20%7B%20transform%3A%20rotate3d(0%2C%20-1%2C%200%2C%200deg)%3B%20%7D%0A%7D%0Ap%20%7B%20animation%3A%20foo%202s%20alternate%20infinite%3B%20perspective%3A%20200px%3B%20background%3A%20red%3B%20width%3A%20100px%3B%20height%3A%20100px%3B%20%7D%0Ap%3Ahover%20%7B%20%20%7D%0A<%2Fstyle>%0A<script>%0Aw(getComputedStyle(document.querySelector("p")).transform)%3B%0A<%2Fscript>
  <TabAtkins> https://software.hixie.ch/utilities/js/live-dom-viewer/?saved=4803

  ACTION Shane to figure out wtf is up the the quaternion algo and
         see what needs fixing.
  <trackbot> Created ACTION-96

  TabAtkins: That algo is super broken anyway. It's clamping wrong (
             always sets the product to -1), it's using
             uninitialized vars (dot), it's got a zero division...

Issue 34 - Reduce matrix decomposition when rotation axis has zero
           coordinates
------------------------------------------------------------------

  shane: Issue 34.
  shane: In the example in the email, rotate3d(1, 0, 0, 0deg) to
         rotate3d(0, 0, 1, 2.25turn).
  shane: Per spec, these have non-matching axises, so they should
         matrix and decompose, resulting in a 1/4 turn around the z
         axis.
  shane: Firefox does this. WebKit/Blink instead snap the first axis
         to 0,0,1 and then interpolate numerically.
  smfr: Transforms 2 says there's a matrix decomp if the axises
        don't match.
  <smfr> https://drafts.csswg.org/css-transforms-2/#interpolation-of-transform-functions
  shane: So the example:
  shane: Given the previous values, you'll end up doing a
         quarter-turn around the z-axis.
  shane: But if you interrupt it partway, the intermediate value is
         a rotation around the z-axis.
  shane: Reverse it, and you'll continue rotating around z back to
         0deg.
  shane: Then interrupt and resume going to the original endpoint,
         and *now* the axises match, so you get the full 2.25 turn
         and it starts rotating wildly.
  shane: This *only* happens when one of the endpoints is a zero-deg
         rotation. Positive rotation gives you axis interpolation.
  shane: Proposal is to have a zero-deg endpoint just use the other
         endpoint's axis, so you get consistent behavior.
  <smfr> fiddle for this: http://jsfiddle.net/2vLyydzv/4/

  dbaron: Would this be just for the rotate property, or also the
          rotate3d() function?
  shane: Might as well do both.
  shane: And the id() function *must* take the other end-point's
         axis.
  smfr: Like perspective(0) being id().
  shane: Right, like that. Any zero-deg rotation acts like the id()
         function.
  dbaron: Id() relative to other rotates (e.g., rotate3d, rotateX,
          etc.), not to translate/etc?
  shane: Yes.

  RESOLVED: A zero-degree rotate() is treated like an id()
            transform, relative to other rotation functions. (
            Similar to how perspective(0) is now being treated.)
            Issue 34.

Issue 38 - Transform interpolation problem
------------------------------------------

  RESOLVED: Issue 38 - just accept that transitions will run
            whenever the functions differ, even if the endpoints are
            functionally identical.

Issue 40 - Bugs in interpolation algorithm
------------------------------------------

  ACTION smfr figure out issue 40 / GH #483 edits.
  <trackbot> Created ACTION-97

Issue 41 - Matrix Interpolation
-------------------------------

  Shane: Issue 41, I was proposing that instead of matrix
         interpolation we do a 50% flip. But I think we have to
         reject it, it's too late.

  RESOLVED: Reject issue 41.

Issue 42 - Use better matrix interpolation method
-------------------------------------------------

  shane: Issue 42 - we could maybe do this, if it gives similar
         results for matrix interpolation people are already using,
         and better results in places people are avoiding due to
         terribleness.
  <bradwerth> benoit example live at
https://lists.w3.org/Archives/Public/public-fx/2014JanMar/att-0084/transform-animation-not-covariant.html
  shane: As a non-binding question, say we showed up in April with a
         survey of matrix decomposition cases, and examples of how
         they'd change. If they were 90% equal or positive, would be
         adopt a new interpolation algorithm, or would we say it's
         too much effort?
  smfr: We're stuck by CoreAnimation, so if we did change we'd have
        to wait for it to update anyway.
  smfr: Generally authors shouldn't be doing matrix interpolation
        anyway.

  RESOLVED: Issue 42 - respond that while this does look better, for
            web compat reasons we can't change, and we'll continue
            to push things that make it easier to avoid matrix
            interpolation.

  <br dur=10min>

  RachelNabors: So what is id() specifically?
  TabAtkins: The transform that does nothing.
  smfr: A wildcard that auto-matches functions in another list when
        animating.
  smfr: So if you have "rotate(10deg)" and "rotate(20deg) scale(2)",
        that won't match - you'll get matrix interpolation.
  smfr: But if you write the first one as "rotate(10deg) id()",
        it'll match up and you'll get numerical interpolation.
  RachelNabors: Ah, "id" doesn't speak to me that way. Too much
                alternate meanings in the web platform.
  <smfr> one option is identity()
  (move to GH for bikeshedding)
  <RachelNabors> From the CSS perspective, I kinda expect inherit in
                 place of id(). Means something different, but at
                 the same time, is understood.

Issue 43 - Matrix Decomposition
-------------------------------

  shane: This is 4 years old. I think it predates the spec change
         that uses the same interpolation method for 2d and 3d
         transforms. So this would just be closed invalid.
  smfr: I think this came from when the spec allowed impls to only
        implement 2d transforms.
  shane: The spec currently uses the same 3d decomposition for 2d
         matrixes.
  smfr: Should the 2d level even mention 4x4 matrices?
  TabAtkins: In my abandoned split, I left the 3d math alone - too
             annoying to avoid mentioning 3d math.
  smfr: Agreed.

  RESOLVED: Close issue 43 as invalid, now that all transforms
            decompose with a 4x4 matrix.

Issue 45 - getTransformToElement needs more detail
--------------------------------------------------

  <smfr> https://www.chromestatus.com/feature/5736166087196672
  TabAtkins: SVG had a getTransformToElement() method. It was
             underdefined, and they removed it. It looks like it may
             have been moved to Geometry at some point, but it's no
             longer there.

  RESOLVED: Issue 45 is a Geometry issue, with a warning that this
            function doesn't work with flattening anyway and should
            be dropped.

Issue 44 - Include Tagaki-san's definition of linear scale
----------------------------------------------------------

  (looking over the issue)
  shane: I don't think he's asking for a change in behavior. He's
         looking for an editorial addition of how to generate a
         unified scale value for a new SVG feature (non-scaling
         objects).
  (Rossen demonstrates Tagaki-san's proposal.)
  Rossen: Looks good to me. Seems to make it look better.
  <smfr> https://svgwg.org/svg2-draft/coords.html#VectorEffects
  smfr: So this is a behavior change for SVG?
  shane: I don't think this really belongs in Transforms. We don't
         use it in the spec, and it's trivial to describe how to
         recover the unified scale from the matrix.
  shane: So they can just describe it in SVG.
  <smfr> dbaron: https://bugzilla.mozilla.org/show_bug.cgi?id=1318208
  <dbaron> smfr: yes, but the feedback on dev-platform in the intent
           thread was interesting...
  <dbaron> smfr,
https://groups.google.com/d/topic/mozilla.dev.platform/T_7HTTdt-Es/discussion

  RESOLVED: The scale described in issue 44 doesn't belong in the
            transform specification as it isn't used by CSS
            transforms - instead the fairly simple functions that
            describe how to extract a scale from a matrix should be
            described directly in SVG.

Issue 46 - transform-box values & correspondence to SVG vs CSS
--------------------------------------------------------------

  <smfr> DOC says to see also https://drafts.fxtf.org/paint/#fill-origin
  <smfr> https://drafts.csswg.org/css-transforms-1/#transform-box
  TabAtkins: We already have a consistent mapping between CSS *-box
             terms and SVG ones.
  TabAtkins: Mapping border-box to view-box for this one property
             would be bad - it's consistently mapped to stroke-box
             for SVG.
  TabAtkins: Instead we can just use the UA stylesheet to set the
             default SVG transform-box value to view-box.
  <TabAtkins> svg|* { transform-box: view-box; }

  RESOLVED: Issue 46 - change the spec to instead use a UA
            stylesheet rule to give SVG elements a default
            transform-box value of view-box (rather than trying to
            map border-box to view-box)

Issue 48 - Impact of transforms on scrollable area (multiple threads)
---------------------------------------------------------------------

  Rossen: So say you have a 100x100 box, fits in its container, no
          scrollbars.
  Rossen: Then you scale(5), it overflows, you get a scrollbar.
  TabAtkins: But wk/blink don't do that *during a transition* - it
             you animate from scale(1) to scale(5), you won't pop
             scrollbars until the animation is over.
  Rossen: Edge does add scrollbars as soon as it overflows.
  <gregwhitworth> http://jsbin.com/diwufurito/edit?html,css,output
  <Rossen> http://jsbin.com/diwufurito/edit?html,css,output
  <gregwhitworth> http://jsbin.com/diwufurito/edit?html,css,output
  <dbaron> Gecko attempts to update scrollbars every 200ms during a
           transform animation on the compositor.

  shane: Looks like Windows!Chrome and Android!Chrome update
         scrollbars live, but Mac!Chrome doesn't do scrollbars at
         all - animations don't update the geometry at all.
  TabAtkins: So it looks like, aside from Mac!Chrome, animated
             transforms do affect the scrollable area, so we should
             spec that.
  smfr: WebKit only updates at the end of the transition.
  Rossen: So in the non-animated transform case, we all agree -
          scrollable area is affected.
  Rossen: So if you translate an element out of bounds, you can
          scroll to it.
  Rossen: Question is what if you animate a transform that would pop
          a scrollbar at some point in the interpolation.
  <smfr> https://www.w3.org/mid/CAOp6jLZZrmwZ1xZG2AzF+VTzn+zFUFa0EpSXp1T-fSc7ZhNa7A@mail.gmail.com
  <smfr> https://bug1236386.bmoattachments.org/attachment.cgi?id=8703469

  (talking about scale-down transforms)
  TabAtkins: So you've got a small parent. A large child which would
             overflow, but it's scaled down to not visibly overflow.
             Scrollbars or not?
  TabAtkins: Roc says it shouldn't pop scrollbars.
  TabAtkins: My argument that scrollbars should happen is that if
             the large child has a sibling, it's positioned relative
             to the original geometry, outside of the parent's
             bounds, and scrollbars pop. It's weird to me that the
             first child's geometry causes a scrollbar if something
             else is around, but not if it's by itself.
  shane: I don't think that's a big deal.
  TabAtkins: I'm fine with that, it was just my original argument.
             I'm fine with taking roc's argument.
  Rossen: Another scenario: small parent. Child is width:auto, big
          height, then it's scaled down to fit inside the parent.
  <TabAtkins> Exact numbers: parent is 100x100, child is autox200,
              then scale(.5) is applied. Is the child 50px wide, or
              42px (100 - 16px scrollbar / 2)?
  smfr: This is a separate issue entirely. Rossen, file a GH issue?
  smfr: Popping stack, do scrollbars depend on union of
        pre-transform and post-transform geometry, or just
        post-transform?
  Rossen: Popping more: static transform that causes overflow,
          scrollbars or not?
  TabAtkins: Everyone agrees on that.
  Rossen: So let's resolve on that.

  RESOLVED: Static transforms that overflow parent bounds do cause a
            scrollbar.

  <gregwhitworth> I threw together rossen's testcase:
                  https://jsfiddle.net/gpqkzth1/

  TabAtkins: Next case - a forward-fill animation that transforms to
             out of bounds.

  RESOLVED: An animation that is in fill (finished, or not yet
            started) is treated same as static, for purposes of
            transform/bounds/scrollbars computation.

  TabAtkins: So next - an animated transform that goes out of bounds
             at some point - scrollbars or no?
  shane: Behavior is inconsistent between browsers. Most Chrome
         platforms show them, Firefox shows them throttled in time,
         WebKit doesn't show them at all until animation is done.
  Rossen: So, MAY sounds good?

  RESOLVED: Animated transforms that go out of bounds MAY show a
            scrollbar during the animation.

  <smfr> https://jsfiddle.net/gpqkzth1/1/

  PROPOSED RESOLUTION: Overflow bounds are computed at end of
      layout, can be increased but not decreased by the effects of
      paint-level things like transforms.

  (Discussing over break.)
  <br type=lunch><div id="DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2"><br />
<table style="border-top: 1px solid #D3D4DE;">
 <tr>
        <td style="width: 55px; padding-top: 13px;"><a
href="https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail&utm_term=icon"
target="_blank"><img
src="https://ipmcdn.avast.com/images/icons/icon-envelope-tick-round-orange-animated-no-repeat-v1.gif"
width="46" height="29" style="width: 46px; height: 29px;" /></a></td>
  <td style="width: 470px; padding-top: 12px; color: #41424e;
font-size: 13px; font-family: Arial, Helvetica, sans-serif;
line-height: 18px;">Virus-free. <a
href="https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail&utm_term=link"
target="_blank" style="color: #4453ea;">www.avast.com</a>
  </td>
 </tr>
</table><a href="#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2" width="1"
height="1"></a></div>

Received on Tuesday, 14 February 2017 01:59:13 UTC