• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 package org.chromium.content.browser;
6 
7 /**
8  * Cached copy of all positions and scales (CSS-to-DIP-to-physical pixels)
9  * reported from the renderer.
10  * Provides wrappers and a utility class to help with coordinate transforms on the client side.
11  * Provides the internally-visible set of update methods (called from ContentViewCore).
12  *
13  * Unless stated otherwise, all coordinates are in CSS (document) coordinate space.
14  */
15 public class RenderCoordinates {
16 
17     // Scroll offset from the native in CSS.
18     private float mScrollXCss;
19     private float mScrollYCss;
20 
21     // Content size from native in CSS.
22     private float mContentWidthCss;
23     private float mContentHeightCss;
24 
25     // Last-frame render-reported viewport size in CSS.
26     private float mLastFrameViewportWidthCss;
27     private float mLastFrameViewportHeightCss;
28 
29     // Cached page scale factor from native.
30     private float mPageScaleFactor = 1.0f;
31     private float mMinPageScaleFactor = 1.0f;
32     private float mMaxPageScaleFactor = 1.0f;
33 
34     // Cached device density.
35     private float mDeviceScaleFactor;
36 
37     private float mContentOffsetYPix;
38 
39     // Internally-visible set of update methods (used by ContentViewCore).
reset()40     void reset() {
41         mScrollXCss = mScrollYCss = 0;
42         mPageScaleFactor = 1.0f;
43     }
44 
updateContentSizeCss(float contentWidthCss, float contentHeightCss)45     void updateContentSizeCss(float contentWidthCss, float contentHeightCss) {
46         mContentWidthCss = contentWidthCss;
47         mContentHeightCss = contentHeightCss;
48     }
49 
setDeviceScaleFactor(float deviceScaleFactor)50     void setDeviceScaleFactor(float deviceScaleFactor) {
51         mDeviceScaleFactor = deviceScaleFactor;
52     }
53 
updateFrameInfo( float scrollXCss, float scrollYCss, float contentWidthCss, float contentHeightCss, float viewportWidthCss, float viewportHeightCss, float pageScaleFactor, float minPageScaleFactor, float maxPageScaleFactor, float contentOffsetYPix)54     void updateFrameInfo(
55             float scrollXCss, float scrollYCss,
56             float contentWidthCss, float contentHeightCss,
57             float viewportWidthCss, float viewportHeightCss,
58             float pageScaleFactor, float minPageScaleFactor, float maxPageScaleFactor,
59             float contentOffsetYPix) {
60         mScrollXCss = scrollXCss;
61         mScrollYCss = scrollYCss;
62         mPageScaleFactor = pageScaleFactor;
63         mMinPageScaleFactor = minPageScaleFactor;
64         mMaxPageScaleFactor = maxPageScaleFactor;
65         mContentOffsetYPix = contentOffsetYPix;
66 
67         updateContentSizeCss(contentWidthCss, contentHeightCss);
68         mLastFrameViewportWidthCss = viewportWidthCss;
69         mLastFrameViewportHeightCss = viewportHeightCss;
70     }
71 
72     /**
73      * Handles conversion of a point from window-relative-local-dip or screen-pix
74      * to document-absolute-CSS space and vice versa.
75      */
76     public class NormalizedPoint {
77         private float mXAbsoluteCss, mYAbsoluteCss;
78 
NormalizedPoint()79         private NormalizedPoint() {
80         }
81 
82         /**
83          * @return Absolute CSS (document) X coordinate of the point.
84          */
getXAbsoluteCss()85         public float getXAbsoluteCss() { return mXAbsoluteCss; }
86 
87         /**
88          * @return Absolute CSS (document) Y coordinate of the point.
89          */
getYAbsoluteCss()90         public float getYAbsoluteCss() { return mYAbsoluteCss; }
91 
92         /**
93          * @return Local device-scale-unadjusted X coordinate of the point.
94          */
getXLocalDip()95         public float getXLocalDip() { return (mXAbsoluteCss - mScrollXCss) * mPageScaleFactor; }
96 
97         /**
98          * @return Local device-scale-unadjusted Y coordinate of the point.
99          */
getYLocalDip()100         public float getYLocalDip() { return (mYAbsoluteCss - mScrollYCss) * mPageScaleFactor; }
101 
102         /**
103          * @return Physical (screen) X coordinate of the point.
104          */
getXPix()105         public float getXPix() { return getXLocalDip() * mDeviceScaleFactor; }
106 
107         /**
108          * @return Physical (screen) Y coordinate of the point.
109          */
getYPix()110         public float getYPix() { return getYLocalDip() * mDeviceScaleFactor + mContentOffsetYPix; }
111 
112         /**
113          * Sets the point to the given absolute CSS (document) coordinates.
114          */
setAbsoluteCss(float xCss, float yCss)115         public void setAbsoluteCss(float xCss, float yCss) {
116             mXAbsoluteCss = xCss;
117             mYAbsoluteCss = yCss;
118         }
119 
120         /**
121          * Sets the point to the given local device-scale-unadjusted coordinates.
122          */
setLocalDip(float xDip, float yDip)123         public void setLocalDip(float xDip, float yDip) {
124             setAbsoluteCss(
125                     xDip / mPageScaleFactor + mScrollXCss,
126                     yDip / mPageScaleFactor + mScrollYCss);
127         }
128 
129         /**
130          * Sets the point to the given physical (screen) coordinates.
131          */
setScreen(float xPix, float yPix)132         public void setScreen(float xPix, float yPix) {
133             setLocalDip(xPix / mDeviceScaleFactor, yPix / mDeviceScaleFactor);
134         }
135     }
136 
137     /**
138      * @return A helper to convert a point between between absolute CSS and local DIP spaces.
139      */
createNormalizedPoint()140     public NormalizedPoint createNormalizedPoint() {
141         return new NormalizedPoint();
142     }
143 
144     /**
145      * @return Horizontal scroll offset in CSS pixels.
146      */
getScrollX()147     public float getScrollX() { return mScrollXCss; }
148 
149     /**
150      * @return Vertical scroll offset in CSS pixels.
151      */
getScrollY()152     public float getScrollY() { return mScrollYCss; }
153 
154     /**
155      * @return Horizontal scroll offset in physical pixels.
156      */
getScrollXPix()157     public float getScrollXPix() { return fromLocalCssToPix(mScrollXCss); }
158 
159     /**
160      * @return Vertical scroll offset in physical pixels.
161      */
getScrollYPix()162     public float getScrollYPix() { return fromLocalCssToPix(mScrollYCss); }
163 
164     /**
165      * @return Horizontal scroll offset in physical pixels (approx, integer).
166      */
getScrollXPixInt()167     public int getScrollXPixInt() { return (int) Math.floor(getScrollXPix()); }
168 
169     /**
170      * @return Vertical scroll offset in physical pixels (approx, integer).
171      */
getScrollYPixInt()172     public int getScrollYPixInt() { return (int) Math.floor(getScrollYPix()); }
173 
174     /**
175      * @return Width of the content in CSS pixels.
176      */
getContentWidthCss()177     public float getContentWidthCss() { return mContentWidthCss; }
178 
179     /**
180      * @return Height of the content in CSS pixels.
181      */
getContentHeightCss()182     public float getContentHeightCss() { return mContentHeightCss; }
183 
184     /**
185      * @return Approximate width of the content in physical pixels.
186      */
getContentWidthPix()187     public float getContentWidthPix() { return fromLocalCssToPix(mContentWidthCss); }
188 
189     /**
190      * @return Approximate height of the content in physical pixels.
191      */
getContentHeightPix()192     public float getContentHeightPix() { return fromLocalCssToPix(mContentHeightCss); }
193 
194     /**
195      * @return Approximate width of the content in physical pixels (integer).
196      */
getContentWidthPixInt()197     public int getContentWidthPixInt() { return (int) Math.ceil(getContentWidthPix()); }
198 
199     /**
200      * @return Approximate height of the content in physical pixels (integer).
201      */
getContentHeightPixInt()202     public int getContentHeightPixInt() { return (int) Math.ceil(getContentHeightPix()); }
203 
204     /**
205      * @return Render-reported width of the viewport in CSS pixels.
206      */
getLastFrameViewportWidthCss()207     public float getLastFrameViewportWidthCss() { return mLastFrameViewportWidthCss; }
208 
209     /**
210      * @return Render-reported height of the viewport in CSS pixels.
211      */
getLastFrameViewportHeightCss()212     public float getLastFrameViewportHeightCss() { return mLastFrameViewportHeightCss; }
213 
214     /**
215      * @return Render-reported width of the viewport in physical pixels (approximate).
216      */
getLastFrameViewportWidthPix()217     public float getLastFrameViewportWidthPix() {
218         return fromLocalCssToPix(mLastFrameViewportWidthCss);
219     }
220 
221     /**
222      * @return Render-reported height of the viewport in physical pixels (approximate).
223      */
getLastFrameViewportHeightPix()224     public float getLastFrameViewportHeightPix() {
225         return fromLocalCssToPix(mLastFrameViewportHeightCss);
226     }
227 
228     /**
229      * @return Render-reported width of the viewport in physical pixels (approx, integer).
230      */
getLastFrameViewportWidthPixInt()231     public int getLastFrameViewportWidthPixInt() {
232         return (int) Math.ceil(getLastFrameViewportWidthPix());
233     }
234 
235     /**
236      * @return Render-reported height of the viewport in physical pixels (approx, integer).
237      */
getLastFrameViewportHeightPixInt()238     public int getLastFrameViewportHeightPixInt() {
239         return (int) Math.ceil(getLastFrameViewportHeightPix());
240     }
241 
242     /**
243      * @return The Physical on-screen Y offset amount below the top controls.
244      */
getContentOffsetYPix()245     public float getContentOffsetYPix() {
246         return mContentOffsetYPix;
247     }
248 
249     /**
250      * @return Current page scale factor (maps CSS pixels to DIP pixels).
251      */
getPageScaleFactor()252     public float getPageScaleFactor() { return mPageScaleFactor; }
253 
254     /**
255      * @return Minimum page scale factor to be used with the content.
256      */
getMinPageScaleFactor()257     public float getMinPageScaleFactor() { return mMinPageScaleFactor; }
258 
259     /**
260      * @return Maximum page scale factor to be used with the content.
261      */
getMaxPageScaleFactor()262     public float getMaxPageScaleFactor() { return mMaxPageScaleFactor; }
263 
264     /**
265      * @return Current device scale factor (maps DIP pixels to physical pixels).
266      */
getDeviceScaleFactor()267     public float getDeviceScaleFactor() { return mDeviceScaleFactor; }
268 
269     /**
270      * @return Maximum possible horizontal scroll in physical pixels.
271      */
getMaxHorizontalScrollPix()272     public float getMaxHorizontalScrollPix() {
273         return getContentWidthPix() - getLastFrameViewportWidthPix();
274     }
275 
276     /**
277      * @return Maximum possible vertical scroll in physical pixels.
278      */
getMaxVerticalScrollPix()279     public float getMaxVerticalScrollPix() {
280         return getContentHeightPix() - getLastFrameViewportHeightPix();
281     }
282 
283     /**
284      * @return Maximum possible horizontal scroll in physical pixels (approx, integer).
285      */
getMaxHorizontalScrollPixInt()286     public int getMaxHorizontalScrollPixInt() {
287         return (int) Math.floor(getMaxHorizontalScrollPix());
288     }
289 
290     /**
291      * @return Maximum possible vertical scroll in physical pixels (approx, integer).
292      */
getMaxVerticalScrollPixInt()293     public int getMaxVerticalScrollPixInt() {
294         return (int) Math.floor(getMaxVerticalScrollPix());
295     }
296 
297     /**
298      * @return Physical on-screen coordinate converted to local DIP.
299      */
fromPixToDip(float pix)300     public float fromPixToDip(float pix) {
301         return pix / mDeviceScaleFactor;
302     }
303 
304     /**
305      * @return Local DIP converted to physical coordinates.
306      */
fromDipToPix(float dip)307     public float fromDipToPix(float dip) {
308         return dip * mDeviceScaleFactor;
309     }
310 
311     /**
312      * @return Physical coordinate converted to local CSS.
313      */
fromPixToLocalCss(float pix)314     public float fromPixToLocalCss(float pix) {
315         return pix / (mDeviceScaleFactor * mPageScaleFactor);
316     }
317 
318     /**
319      * @return Local CSS converted to physical coordinates.
320      */
fromLocalCssToPix(float css)321     public float fromLocalCssToPix(float css) {
322         return css * mPageScaleFactor * mDeviceScaleFactor;
323     }
324 }
325