Avoid copying of ViewportArguments in computeViewportAttributes function
[WebKit-https.git] / Source / WebCore / dom / ViewportArguments.h
1 /*
2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4  *           (C) 2001 Dirk Mueller (mueller@kde.org)
5  *           (C) 2006 Alexey Proskuryakov (ap@webkit.org)
6  * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
7  * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
8  * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Library General Public
12  * License as published by the Free Software Foundation; either
13  * version 2 of the License, or (at your option) any later version.
14  *
15  * This library is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * Library General Public License for more details.
19  *
20  * You should have received a copy of the GNU Library General Public License
21  * along with this library; see the file COPYING.LIB.  If not, write to
22  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
23  * Boston, MA 02110-1301, USA.
24  *
25  */
26
27 #ifndef ViewportArguments_h
28 #define ViewportArguments_h
29
30 #include "FloatSize.h"
31 #include <wtf/Forward.h>
32
33 namespace WebCore {
34
35 class Document;
36
37 enum ViewportErrorCode {
38     UnrecognizedViewportArgumentKeyError,
39     UnrecognizedViewportArgumentValueError,
40     TruncatedViewportArgumentValueError,
41     MaximumScaleTooLargeError,
42     TargetDensityDpiUnsupported
43 };
44
45 struct ViewportAttributes {
46     FloatSize layoutSize;
47
48     float initialScale;
49     float minimumScale;
50     float maximumScale;
51
52     float userScalable;
53 };
54
55 struct ViewportArguments {
56
57     enum Type {
58         // These are ordered in increasing importance.
59         Implicit,
60 #if ENABLE(LEGACY_VIEWPORT_ADAPTION)
61         XHTMLMobileProfile,
62         HandheldFriendlyMeta,
63         MobileOptimizedMeta,
64 #endif
65         ViewportMeta
66     } type;
67
68     enum {
69         ValueAuto = -1,
70         ValueDeviceWidth = -2,
71         ValueDeviceHeight = -3,
72     };
73
74     ViewportArguments(Type type = Implicit)
75         : type(type)
76         , width(ValueAuto)
77         , height(ValueAuto)
78         , zoom(ValueAuto)
79         , minZoom(ValueAuto)
80         , maxZoom(ValueAuto)
81         , userZoom(ValueAuto)
82     {
83     }
84
85     // All arguments are in CSS units.
86     ViewportAttributes resolve(const FloatSize& initialViewportSize, const FloatSize& deviceSize, int defaultWidth) const;
87
88     float width;
89     float height;
90     float zoom;
91     float minZoom;
92     float maxZoom;
93     float userZoom;
94
95     bool operator==(const ViewportArguments& other) const
96     {
97         // Used for figuring out whether to reset the viewport or not,
98         // thus we are not taking type into account.
99         return width == other.width
100             && height == other.height
101             && zoom == other.zoom
102             && minZoom == other.minZoom
103             && maxZoom == other.maxZoom
104             && userZoom == other.userZoom;
105     }
106
107     bool operator!=(const ViewportArguments& other) const
108     {
109         return !(*this == other);
110     }
111
112     // FIXME: We're going to keep this constant around until all embedders
113     // refactor their code to no longer need it.
114     static const float deprecatedTargetDPI;
115 };
116
117 ViewportAttributes computeViewportAttributes(const ViewportArguments& args, int desktopWidth, int deviceWidth, int deviceHeight, float devicePixelRatio, IntSize visibleViewport);
118
119 void restrictMinimumScaleFactorToViewportSize(ViewportAttributes& result, IntSize visibleViewport, float devicePixelRatio);
120 void restrictScaleFactorToInitialScaleIfNotUserScalable(ViewportAttributes& result);
121 float computeMinimumScaleFactorForContentContained(const ViewportAttributes& result, const IntSize& viewportSize, const IntSize& contentSize, float devicePixelRatio);
122
123 void setViewportFeature(const String& keyString, const String& valueString, Document*, void* data);
124 void reportViewportWarning(Document*, ViewportErrorCode, const String& replacement1, const String& replacement2);
125
126 } // namespace WebCore
127
128 #endif // ViewportArguments_h