Closed
Bug 1036967
(apz-css-trans-stage3)
Opened 10 years ago
Closed 10 years ago
Make APZ code properly handle transforms and scales that are different on the x- and y-axes
Categories
(Core :: Panning and Zooming, defect)
Tracking
()
RESOLVED
FIXED
mozilla39
Tracking | Status | |
---|---|---|
firefox39 | --- | fixed |
People
(Reporter: kats, Assigned: botond)
References
Details
Attachments
(3 files, 4 obsolete files)
If you build gecko at mercurial cset cc20208a6eb4 (i.e. with the original patch for bug 1034247) and using it on B2G on a Nexus 4, the layers dump ends up looking like [1] on the homescreen. This has a container layer with preScale=1,2 which demonstrates one way that we can end up with scaling factors that are not the same on the x- and y-axes. The APZ code needs to be able to deal with this stuff, and I don't think it currently does handle this case properly.
More generally, we assume an axis-uniform LayoutDeviceToLayerPixel scale, but that may not be the case.
[1] https://bug1034247.bugzilla.mozilla.org/attachment.cgi?id=8453779
Assignee | ||
Comment 1•10 years ago
|
||
This will be Stage 3 of the apz-css-transforms work [1].
[1] https://bugzilla.mozilla.org/show_bug.cgi?id=993525#c3
Alias: apz-css-trans-stage3
Assignee | ||
Comment 2•10 years ago
|
||
I'm going to take this to finish off the apz-css-transforms work.
Assignee: nobody → botond
Assignee | ||
Comment 3•10 years ago
|
||
These are WIP patches. They need testing.
Assignee | ||
Comment 4•10 years ago
|
||
Assignee | ||
Comment 5•10 years ago
|
||
Assignee | ||
Comment 6•10 years ago
|
||
/r/4733 - Bug 1036967 - Introduce ScaleFactors2D. r=kats,Bas
/r/4735 - Bug 1036967 - Use ScaleFactors2D instead of ScaleFactor where appropriate in APZ and surrounding code. r=kats
/r/4737 - Bug 1036967 - Remove ScaleFactor::ScaleFactor(float, float). r=kats
Pull down these commits:
hg pull review -r 2f880cbe012ce9d3b5e1207bab8b88f6ecd2a07a
Attachment #8572911 -
Flags: review?(bugmail.mozilla)
Attachment #8572911 -
Flags: review?(bas)
Assignee | ||
Comment 7•10 years ago
|
||
Comment on attachment 8571648 [details] [diff] [review]
Part 1 - Introduce ScaleFactors2D
I updated the patches to fix a few mistakes and to get them to compile on Android.
Local testing looks good with a page like http://people.mozilla.org/~bballo/divtrans.html. The bug 1071018 STR also aren't problematic any more (with the workaround removed).
For getting the patches reviewed, I thought I'd try out MozReview. Updated patches posted there.
Attachment #8571648 -
Attachment is obsolete: true
Assignee | ||
Updated•10 years ago
|
Attachment #8571649 -
Attachment is obsolete: true
Assignee | ||
Updated•10 years ago
|
Attachment #8571650 -
Attachment is obsolete: true
Assignee | ||
Comment 8•10 years ago
|
||
Assignee | ||
Comment 9•10 years ago
|
||
I should note that there remains one set of places in the code where Layout provides both x- and y-resolution, but I only use the x-resolution: for the pres shell resolution (and derived quantities, like the cumulative pres shell resolution [not to be confused with FrameMetrics::mCumulativeResolution, which includes a css-driven component and is thus 2D]).
This is because the pres shell resolution should never have different x- and y-scales. I filed a follow-up, bug 1139675, to modify the relevant APIs to reflect this.
Reporter | ||
Comment 10•10 years ago
|
||
https://reviewboard.mozilla.org/r/4733/#review3861
A few suggestions but I'd be fine with it landing as-is too.
::: gfx/2d/ScaleFactors2D.h
(Diff revision 1)
> + std::streamsize oldPrecision = aStream.precision(3);
I'm not a fan of hard-coding a precision like this; in general I'd prefer the caller do that if they want a specific precision. I don't feel too strongly about this though, I suspect in practice it won't matter much.
::: gfx/2d/ScaleFactors2D.h
(Diff revision 1)
> + return ScaleFactors2D<src, other>(xScale * aOther.scale, yScale * aOther.scale);
Could probably also do this as |return this * ScaleFactor2D(aOther);| if you prefer. I find that a bit less repetitive but I'm fine either way.
::: gfx/2d/ScaleFactors2D.h
(Diff revision 1)
> + return fabs(xScale - yScale) < 1e-6;
I'd rather use FuzzyEqualsMultiplicative from mfbt/FloatingPoint.h here
::: gfx/2d/ScaleFactors2D.h
(Diff revision 1)
> + // Divide two scales of the same units, yielding a scale with no units,
Do we need this one? I'd rather not add it until we need it, and would also prefer if it returned a ScaleFactor2D<src, src> or a ScaleFactor2D<dst, dst>. Either of those would be better than a gfxSize, I think. Note that in layout/base/Units.h we do have a ParentLayerToParentLayerScale so it's not without precedent.
Reporter | ||
Comment 11•10 years ago
|
||
https://reviewboard.mozilla.org/r/4735/#review3865
::: gfx/layers/FrameMetrics.h
(Diff revision 1)
> - mZoom.scale *= aFactor;
> + ZoomBy(gfxSize(aScale, aScale));
Can we use a ParentLayerToParentLayerScale2D here?
::: gfx/layers/LayersLogging.cpp
(Diff revision 1)
> - aStream << nsPrintfCString("] [z=%.3f] }", m.GetZoom().scale).get();
> + aStream << nsPrintfCString("] [z=%s] }", ToString(m.GetZoom()).c_str()).get();
AppendToString(aStream, m.GetZoom(), "] [z=", "] }");
(You'll need to add an AppendToString overload for ScaleFactor2D)
::: gfx/layers/LayersLogging.cpp
(Diff revision 1)
> - aStream << nsPrintfCString("] [z=(ld=%.3f r=%.3f cr=%.3f z=%.3f er=%.3f)",
> + aStream << nsPrintfCString("] [z=(ld=%.3f r=%.3f cr=%s z=%s er=%s)",
Break this up into a handful of AppendToString calls
::: gfx/tests/gtest/TestAsyncPanZoomController.cpp
(Diff revision 1)
> - EXPECT_EQ(2.5f, fm.GetZoom().scale);
> + EXPECT_EQ(2.5f, fm.GetZoom().xScale);
If you do fm.GetZoom().ToScaleFactor().scale here it will also check that the x- and y-scales are equal which is probably better. Ditto for the others below.
Reporter | ||
Comment 12•10 years ago
|
||
Reporter | ||
Comment 13•10 years ago
|
||
Reporter | ||
Comment 14•10 years ago
|
||
Comment on attachment 8572911 [details]
MozReview Request: bz://1036967/botond
Hm, I think I screwed up the MozReview flow on the second patch. I meant to "Ship it" with comments but accidentally opened issues, which I think blocks the auto-r+ process. I've dropped the issues (hopefully you can still see the comments though). This is basically an r+ with comments addressed.
Attachment #8572911 -
Flags: review?(bugmail.mozilla) → review+
Assignee | ||
Comment 15•10 years ago
|
||
Comment on attachment 8572911 [details]
MozReview Request: bz://1036967/botond
/r/4733 - Bug 1036967 - Introduce ScaleFactors2D. r=kats,Bas
/r/4735 - Bug 1036967 - Use ScaleFactors2D instead of ScaleFactor where appropriate in APZ and surrounding code. r=kats
/r/4737 - Bug 1036967 - Remove ScaleFactor::ScaleFactor(float, float). r=kats
Pull down these commits:
hg pull review -r 353e24eccb1a214d4d3c8e5db689c699b6fe5e2b
Attachment #8572911 -
Flags: review+ → review?(bugmail.mozilla)
Assignee | ||
Comment 16•10 years ago
|
||
(In reply to Kartikaya Gupta (email:kats@mozilla.com) from comment #10)
> ::: gfx/2d/ScaleFactors2D.h
> (Diff revision 1)
> > + std::streamsize oldPrecision = aStream.precision(3);
>
> I'm not a fan of hard-coding a precision like this; in general I'd prefer
> the caller do that if they want a specific precision. I don't feel too
> strongly about this though, I suspect in practice it won't matter much.
The idea was to preserve the precision used to print scales in LayersLogging. I ended up changing LayersLogging to use a custom AppendToString overload instead of ToString, and moving the precision-setting code, so I removed it from here. (I kept ToString() itself because it had a non-LayersLogging call site.)
> ::: gfx/2d/ScaleFactors2D.h
> (Diff revision 1)
> > + return ScaleFactors2D<src, other>(xScale * aOther.scale, yScale * aOther.scale);
>
> Could probably also do this as |return this * ScaleFactor2D(aOther);| if you
> prefer. I find that a bit less repetitive but I'm fine either way.
Good idea - done.
> ::: gfx/2d/ScaleFactors2D.h
> (Diff revision 1)
> > + return fabs(xScale - yScale) < 1e-6;
>
> I'd rather use FuzzyEqualsMultiplicative from mfbt/FloatingPoint.h here
Done.
> ::: gfx/2d/ScaleFactors2D.h
> (Diff revision 1)
> > + // Divide two scales of the same units, yielding a scale with no units,
>
> Do we need this one? I'd rather not add it until we need it, and would also
> prefer if it returned a ScaleFactor2D<src, src> or a ScaleFactor2D<dst,
> dst>. Either of those would be better than a gfxSize, I think. Note that in
> layout/base/Units.h we do have a ParentLayerToParentLayerScale so it's not
> without precedent.
We use it in AsyncPanZoomController::GetTransformToLastDispatchedPaint(), and to compute the resolution change in NotifyLayersUpdated().
I'm not convinced about returning a typed ScaleFactor2D here. First, we'd have to make an arbitrary choice between <dst, dst> and <src, src>. Second, as discussed on IRC, we've found that using a typed scale in the past for the zoom change between two frames doesn't work very well (see https://bugzilla.mozilla.org/show_bug.cgi?id=923431#c9 where we removed it, a ScreenToScreenScale at the time).
(In reply to Kartikaya Gupta (email:kats@mozilla.com) from comment #11)
> ::: gfx/layers/FrameMetrics.h
> (Diff revision 1)
> > - mZoom.scale *= aFactor;
> > + ZoomBy(gfxSize(aScale, aScale));
>
> Can we use a ParentLayerToParentLayerScale2D here?
As per the above, staying with untyped units here.
> ::: gfx/layers/LayersLogging.cpp
> (Diff revision 1)
> > - aStream << nsPrintfCString("] [z=%.3f] }", m.GetZoom().scale).get();
> > + aStream << nsPrintfCString("] [z=%s] }", ToString(m.GetZoom()).c_str()).get();
>
> AppendToString(aStream, m.GetZoom(), "] [z=", "] }");
>
> (You'll need to add an AppendToString overload for ScaleFactor2D)
Done. (I'm not thrilled about the code duplication between AppendToString and ToString. We should probably unify these at some point.)
> ::: gfx/layers/LayersLogging.cpp
> (Diff revision 1)
> > - aStream << nsPrintfCString("] [z=(ld=%.3f r=%.3f cr=%.3f z=%.3f er=%.3f)",
> > + aStream << nsPrintfCString("] [z=(ld=%.3f r=%.3f cr=%s z=%s er=%s)",
>
> Break this up into a handful of AppendToString calls
Done.
> ::: gfx/tests/gtest/TestAsyncPanZoomController.cpp
> (Diff revision 1)
> > - EXPECT_EQ(2.5f, fm.GetZoom().scale);
> > + EXPECT_EQ(2.5f, fm.GetZoom().xScale);
>
> If you do fm.GetZoom().ToScaleFactor().scale here it will also check that
> the x- and y-scales are equal which is probably better. Ditto for the others
> below.
Done.
Assignee | ||
Comment 17•10 years ago
|
||
Comment on attachment 8572911 [details]
MozReview Request: bz://1036967/botond
Carrying r+ from Kats (not sure what the proper MozReview workflow is for doing that).
Attachment #8572911 -
Flags: review?(bugmail.mozilla) → review+
Assignee | ||
Updated•10 years ago
|
Attachment #8572911 -
Flags: review+ → review?(bugmail.mozilla)
Assignee | ||
Comment 18•10 years ago
|
||
Comment on attachment 8572911 [details]
MozReview Request: bz://1036967/botond
/r/4733 - Bug 1036967 - Introduce ScaleFactors2D. r=kats,Bas
/r/4735 - Bug 1036967 - Use ScaleFactors2D instead of ScaleFactor where appropriate in APZ and surrounding code. r=kats
/r/4737 - Bug 1036967 - Remove ScaleFactor::ScaleFactor(float, float). r=kats
Pull down these commits:
hg pull review -r fe3604d3c095aa8fb8e40275e723d05334d34387
Assignee | ||
Comment 19•10 years ago
|
||
Comment on attachment 8572911 [details]
MozReview Request: bz://1036967/botond
While working on bug 1139675, I realized that I missed a 1D -> 2D conversion in a couple of spots. Updated patch to add these in. Carrying r+ from Kats.
Attachment #8572911 -
Flags: review?(bugmail.mozilla) → review+
Comment 20•10 years ago
|
||
Updated•10 years ago
|
Attachment #8572911 -
Flags: review?(bas) → review+
Assignee | ||
Comment 21•10 years ago
|
||
Comment 22•10 years ago
|
||
https://hg.mozilla.org/mozilla-central/rev/fa4b3571ae88
https://hg.mozilla.org/mozilla-central/rev/78dcb3a426f2
https://hg.mozilla.org/mozilla-central/rev/faf1d0ec530e
Status: NEW → RESOLVED
Closed: 10 years ago
status-firefox39:
--- → fixed
Resolution: --- → FIXED
Target Milestone: --- → mozilla39
Reporter | ||
Comment 23•10 years ago
|
||
Follow-up to fix debug logging:
https://hg.mozilla.org/integration/mozilla-inbound/rev/96482314a464
Comment 24•10 years ago
|
||
Reporter | ||
Comment 25•10 years ago
|
||
Follow-up to fix wacky FrameMetrics output in layer dumps where it was showing things like "[scrollId=21.5]":
https://hg.mozilla.org/integration/mozilla-inbound/rev/834936a75fb2
Assignee | ||
Comment 26•10 years ago
|
||
(In reply to Kartikaya Gupta (email:kats@mozilla.com) from comment #25)
> Follow-up to fix wacky FrameMetrics output in layer dumps where it was
> showing things like "[scrollId=21.5]":
>
> https://hg.mozilla.org/integration/mozilla-inbound/rev/834936a75fb2
Whoops! Thanks for catching that.
Comment 28•10 years ago
|
||
Weird.. I just got bugzilla e-mail for the review request from this bug..
Assignee | ||
Comment 29•10 years ago
|
||
(In reply to Bas Schouten (:bas.schouten) from comment #28)
> Weird.. I just got bugzilla e-mail for the review request from this bug..
From https://groups.google.com/d/msg/mozilla.dev.version-control/M65guOWfERs/E0Q1Ty7D3jQJ:
"You may have received some bugmail about changes to MozReview
attachments; no actual changes were committed, so please ignore them.
Apologies for the inconvenience."
Assignee | ||
Comment 30•9 years ago
|
||
Attachment #8572911 -
Attachment is obsolete: true
Attachment #8618225 -
Flags: review+
Attachment #8618226 -
Flags: review+
Attachment #8618227 -
Flags: review+
Assignee | ||
Comment 31•9 years ago
|
||
Assignee | ||
Comment 32•9 years ago
|
||
Assignee | ||
Comment 33•9 years ago
|
||
You need to log in
before you can comment on or make changes to this bug.
Description
•