1 /* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
2  * This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 
6 package org.mozilla.gecko.gfx;
7 
8 import android.graphics.PointF;
9 import android.graphics.RectF;
10 import android.util.DisplayMetrics;
11 
12 import org.json.JSONException;
13 import org.json.JSONObject;
14 
15 /**
16  * ViewportMetrics manages state and contains some utility functions related to
17  * the page viewport for the Gecko layer client to use.
18  */
19 public class ViewportMetrics {
20     private static final String LOGTAG = "GeckoViewportMetrics";
21 
22     private RectF mPageRect;
23     private RectF mCssPageRect;
24     private RectF mViewportRect;
25     private float mZoomFactor;
26 
ViewportMetrics(DisplayMetrics metrics)27     public ViewportMetrics(DisplayMetrics metrics) {
28         mPageRect = new RectF(0, 0, metrics.widthPixels, metrics.heightPixels);
29         mCssPageRect = new RectF(0, 0, metrics.widthPixels, metrics.heightPixels);
30         mViewportRect = new RectF(0, 0, metrics.widthPixels, metrics.heightPixels);
31         mZoomFactor = 1.0f;
32     }
33 
ViewportMetrics(ViewportMetrics viewport)34     public ViewportMetrics(ViewportMetrics viewport) {
35         mPageRect = new RectF(viewport.getPageRect());
36         mCssPageRect = new RectF(viewport.getCssPageRect());
37         mViewportRect = new RectF(viewport.getViewport());
38         mZoomFactor = viewport.getZoomFactor();
39     }
40 
ViewportMetrics(ImmutableViewportMetrics viewport)41     public ViewportMetrics(ImmutableViewportMetrics viewport) {
42         mPageRect = new RectF(viewport.pageRectLeft,
43                 viewport.pageRectTop,
44                 viewport.pageRectRight,
45                 viewport.pageRectBottom);
46         mCssPageRect = new RectF(viewport.cssPageRectLeft,
47                 viewport.cssPageRectTop,
48                 viewport.cssPageRectRight,
49                 viewport.cssPageRectBottom);
50         mViewportRect = new RectF(viewport.viewportRectLeft,
51                 viewport.viewportRectTop,
52                 viewport.viewportRectRight,
53                 viewport.viewportRectBottom);
54         mZoomFactor = viewport.zoomFactor;
55     }
56 
ViewportMetrics(JSONObject json)57     public ViewportMetrics(JSONObject json) throws JSONException {
58         float x = (float)json.getDouble("x");
59         float y = (float)json.getDouble("y");
60         float width = (float)json.getDouble("width");
61         float height = (float)json.getDouble("height");
62         float pageLeft = (float)json.getDouble("pageLeft");
63         float pageTop = (float)json.getDouble("pageTop");
64         float pageRight = (float)json.getDouble("pageRight");
65         float pageBottom = (float)json.getDouble("pageBottom");
66         float cssPageLeft = (float)json.getDouble("cssPageLeft");
67         float cssPageTop = (float)json.getDouble("cssPageTop");
68         float cssPageRight = (float)json.getDouble("cssPageRight");
69         float cssPageBottom = (float)json.getDouble("cssPageBottom");
70         float zoom = (float)json.getDouble("zoom");
71 
72         mPageRect = new RectF(pageLeft, pageTop, pageRight, pageBottom);
73         mCssPageRect = new RectF(cssPageLeft, cssPageTop, cssPageRight, cssPageBottom);
74         mViewportRect = new RectF(x, y, x + width, y + height);
75         mZoomFactor = zoom;
76     }
77 
ViewportMetrics(float x, float y, float width, float height, float pageLeft, float pageTop, float pageRight, float pageBottom, float cssPageLeft, float cssPageTop, float cssPageRight, float cssPageBottom, float zoom)78     public ViewportMetrics(float x, float y, float width, float height,
79                            float pageLeft, float pageTop, float pageRight, float pageBottom,
80                            float cssPageLeft, float cssPageTop, float cssPageRight, float cssPageBottom,
81                            float zoom) {
82         mPageRect = new RectF(pageLeft, pageTop, pageRight, pageBottom);
83         mCssPageRect = new RectF(cssPageLeft, cssPageTop, cssPageRight, cssPageBottom);
84         mViewportRect = new RectF(x, y, x + width, y + height);
85         mZoomFactor = zoom;
86     }
87 
getOrigin()88     public PointF getOrigin() {
89         return new PointF(mViewportRect.left, mViewportRect.top);
90     }
91 
getSize()92     public FloatSize getSize() {
93         return new FloatSize(mViewportRect.width(), mViewportRect.height());
94     }
95 
getViewport()96     public RectF getViewport() {
97         return mViewportRect;
98     }
99 
getCssViewport()100     public RectF getCssViewport() {
101         return RectUtils.scale(mViewportRect, 1/mZoomFactor);
102     }
103 
getPageRect()104     public RectF getPageRect() {
105         return mPageRect;
106     }
107 
getCssPageRect()108     public RectF getCssPageRect() {
109         return mCssPageRect;
110     }
111 
getZoomFactor()112     public float getZoomFactor() {
113         return mZoomFactor;
114     }
115 
setPageRect(RectF pageRect, RectF cssPageRect)116     public void setPageRect(RectF pageRect, RectF cssPageRect) {
117         mPageRect = pageRect;
118         mCssPageRect = cssPageRect;
119     }
120 
setViewport(RectF viewport)121     public void setViewport(RectF viewport) {
122         mViewportRect = viewport;
123     }
124 
setOrigin(PointF origin)125     public void setOrigin(PointF origin) {
126         mViewportRect.set(origin.x, origin.y,
127                           origin.x + mViewportRect.width(),
128                           origin.y + mViewportRect.height());
129     }
130 
setSize(FloatSize size)131     public void setSize(FloatSize size) {
132         mViewportRect.right = mViewportRect.left + size.width;
133         mViewportRect.bottom = mViewportRect.top + size.height;
134     }
135 
setZoomFactor(float zoomFactor)136     public void setZoomFactor(float zoomFactor) {
137         mZoomFactor = zoomFactor;
138     }
139 
toJSON()140     public String toJSON() {
141         // Round off height and width. Since the height and width are the size of the screen, it
142         // makes no sense to send non-integer coordinates to Gecko.
143         int height = Math.round(mViewportRect.height());
144         int width = Math.round(mViewportRect.width());
145 
146         StringBuffer sb = new StringBuffer(512);
147         sb.append("{ \"x\" : ").append(mViewportRect.left)
148           .append(", \"y\" : ").append(mViewportRect.top)
149           .append(", \"width\" : ").append(width)
150           .append(", \"height\" : ").append(height)
151           .append(", \"pageLeft\" : ").append(mPageRect.left)
152           .append(", \"pageTop\" : ").append(mPageRect.top)
153           .append(", \"pageRight\" : ").append(mPageRect.right)
154           .append(", \"pageBottom\" : ").append(mPageRect.bottom)
155           .append(", \"cssPageLeft\" : ").append(mCssPageRect.left)
156           .append(", \"cssPageTop\" : ").append(mCssPageRect.top)
157           .append(", \"cssPageRight\" : ").append(mCssPageRect.right)
158           .append(", \"cssPageBottom\" : ").append(mCssPageRect.bottom)
159           .append(", \"zoom\" : ").append(mZoomFactor)
160           .append(" }");
161         return sb.toString();
162     }
163 
164     @Override
toString()165     public String toString() {
166         StringBuffer buff = new StringBuffer(256);
167         buff.append("v=").append(mViewportRect.toString())
168             .append(" p=").append(mPageRect.toString())
169             .append(" c=").append(mCssPageRect.toString())
170             .append(" z=").append(mZoomFactor);
171         return buff.toString();
172     }
173 }
174