OLD | NEW |
| (Empty) |
1 // Copyright 2014 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 #include "config.h" | |
6 #include "core/css/MediaValuesCached.h" | |
7 | |
8 #include "core/css/CSSHelper.h" | |
9 #include "core/css/CSSPrimitiveValue.h" | |
10 #include "core/dom/Document.h" | |
11 #include "core/rendering/RenderObject.h" | |
12 | |
13 namespace WebCore { | |
14 | |
15 PassRefPtr<MediaValues> MediaValuesCached::create(MediaValuesCachedData& data) | |
16 { | |
17 return adoptRef(new MediaValuesCached(data)); | |
18 } | |
19 | |
20 PassRefPtr<MediaValues> MediaValuesCached::create(Document& document) | |
21 { | |
22 Document* executingDocument = getExecutingDocument(document); | |
23 return MediaValuesCached::create(executingDocument->frame(), executingDocume
nt->renderer()->style()); | |
24 } | |
25 | |
26 PassRefPtr<MediaValues> MediaValuesCached::create(LocalFrame* frame, RenderStyle
* style) | |
27 { | |
28 return adoptRef(new MediaValuesCached(frame, style)); | |
29 } | |
30 | |
31 MediaValuesCached::MediaValuesCached(LocalFrame* frame, RenderStyle* style) | |
32 { | |
33 ASSERT(frame && style); | |
34 m_data.viewportWidth = calculateViewportWidth(frame, style); | |
35 m_data.viewportHeight = calculateViewportHeight(frame, style); | |
36 m_data.deviceWidth = calculateDeviceWidth(frame); | |
37 m_data.deviceHeight = calculateDeviceHeight(frame); | |
38 m_data.devicePixelRatio = calculateDevicePixelRatio(frame); | |
39 m_data.colorBitsPerComponent = calculateColorBitsPerComponent(frame); | |
40 m_data.monochromeBitsPerComponent = calculateMonochromeBitsPerComponent(fram
e); | |
41 m_data.pointer = calculateLeastCapablePrimaryPointerDeviceType(frame); | |
42 m_data.defaultFontSize = calculateDefaultFontSize(style); | |
43 m_data.computedFontSize = calculateComputedFontSize(style); | |
44 m_data.hasXHeight = calculateHasXHeight(style); | |
45 m_data.xHeight = calculateXHeight(style); | |
46 m_data.zeroWidth = calculateZeroWidth(style); | |
47 m_data.threeDEnabled = calculateThreeDEnabled(frame); | |
48 m_data.scanMediaType = calculateScanMediaType(frame); | |
49 m_data.screenMediaType = calculateScreenMediaType(frame); | |
50 m_data.printMediaType = calculatePrintMediaType(frame); | |
51 m_data.strictMode = calculateStrictMode(frame); | |
52 } | |
53 | |
54 MediaValuesCached::MediaValuesCached(const MediaValuesCachedData& data) | |
55 : m_data(data) | |
56 { | |
57 } | |
58 | |
59 PassRefPtr<MediaValues> MediaValuesCached::copy() const | |
60 { | |
61 return adoptRef(new MediaValuesCached(m_data)); | |
62 } | |
63 | |
64 bool MediaValuesCached::computeLength(double value, unsigned short type, int& re
sult) const | |
65 { | |
66 // We're running in a background thread, so RenderStyle is not available. | |
67 // Nevertheless, we can evaluate lengths using cached values. | |
68 // | |
69 // The logic in this function is duplicated from CSSPrimitiveValue::computeL
engthDouble | |
70 // because MediaValues::computeLength needs nearly identical logic, but we h
aven't found a way to make | |
71 // CSSPrimitiveValue::computeLengthDouble more generic (to solve both cases)
without hurting performance. | |
72 | |
73 // FIXME - Unite the logic here with CSSPrimitiveValue is a performant way. | |
74 int factor = 0; | |
75 switch (type) { | |
76 case CSSPrimitiveValue::CSS_EMS: | |
77 case CSSPrimitiveValue::CSS_REMS: | |
78 factor = m_data.defaultFontSize; | |
79 break; | |
80 case CSSPrimitiveValue::CSS_PX: | |
81 factor = 1; | |
82 break; | |
83 case CSSPrimitiveValue::CSS_EXS: | |
84 // FIXME: We have a bug right now where the zoom will be applied twice t
o EX units. | |
85 // We really need to compute EX using fontMetrics for the original speci
fiedSize and not use | |
86 // our actual constructed rendering font. | |
87 if (m_data.hasXHeight) | |
88 factor = m_data.xHeight; | |
89 else | |
90 factor = m_data.defaultFontSize / 2.0; | |
91 break; | |
92 case CSSPrimitiveValue::CSS_CHS: | |
93 factor = m_data.zeroWidth; | |
94 break; | |
95 case CSSPrimitiveValue::CSS_VW: | |
96 factor = m_data.viewportWidth / 100; | |
97 break; | |
98 case CSSPrimitiveValue::CSS_VH: | |
99 factor = m_data.viewportHeight / 100; | |
100 break; | |
101 case CSSPrimitiveValue::CSS_VMIN: | |
102 factor = std::min(m_data.viewportWidth, m_data.viewportHeight) / 100; | |
103 break; | |
104 case CSSPrimitiveValue::CSS_VMAX: | |
105 factor = std::max(m_data.viewportWidth, m_data.viewportHeight) / 100; | |
106 break; | |
107 case CSSPrimitiveValue::CSS_CM: | |
108 factor = cssPixelsPerCentimeter; | |
109 break; | |
110 case CSSPrimitiveValue::CSS_MM: | |
111 factor = cssPixelsPerMillimeter; | |
112 break; | |
113 case CSSPrimitiveValue::CSS_IN: | |
114 factor = cssPixelsPerInch; | |
115 break; | |
116 case CSSPrimitiveValue::CSS_PT: | |
117 factor = cssPixelsPerPoint; | |
118 break; | |
119 case CSSPrimitiveValue::CSS_PC: | |
120 factor = cssPixelsPerPica; | |
121 break; | |
122 default: | |
123 return false; | |
124 } | |
125 | |
126 ASSERT(factor > 0); | |
127 result = roundForImpreciseConversion<int>(value*factor); | |
128 return true; | |
129 } | |
130 | |
131 bool MediaValuesCached::isSafeToSendToAnotherThread() const | |
132 { | |
133 return hasOneRef(); | |
134 } | |
135 | |
136 int MediaValuesCached::viewportWidth() const | |
137 { | |
138 return m_data.viewportWidth; | |
139 } | |
140 | |
141 int MediaValuesCached::viewportHeight() const | |
142 { | |
143 return m_data.viewportHeight; | |
144 } | |
145 | |
146 int MediaValuesCached::deviceWidth() const | |
147 { | |
148 return m_data.deviceWidth; | |
149 } | |
150 | |
151 int MediaValuesCached::deviceHeight() const | |
152 { | |
153 return m_data.deviceHeight; | |
154 } | |
155 | |
156 float MediaValuesCached::devicePixelRatio() const | |
157 { | |
158 return m_data.devicePixelRatio; | |
159 } | |
160 | |
161 int MediaValuesCached::colorBitsPerComponent() const | |
162 { | |
163 return m_data.colorBitsPerComponent; | |
164 } | |
165 | |
166 int MediaValuesCached::monochromeBitsPerComponent() const | |
167 { | |
168 return m_data.monochromeBitsPerComponent; | |
169 } | |
170 | |
171 MediaValues::PointerDeviceType MediaValuesCached::pointer() const | |
172 { | |
173 return m_data.pointer; | |
174 } | |
175 | |
176 bool MediaValuesCached::threeDEnabled() const | |
177 { | |
178 return m_data.threeDEnabled; | |
179 } | |
180 | |
181 bool MediaValuesCached::scanMediaType() const | |
182 { | |
183 return m_data.scanMediaType; | |
184 } | |
185 | |
186 bool MediaValuesCached::screenMediaType() const | |
187 { | |
188 return m_data.screenMediaType; | |
189 } | |
190 | |
191 bool MediaValuesCached::printMediaType() const | |
192 { | |
193 return m_data.printMediaType; | |
194 } | |
195 | |
196 bool MediaValuesCached::strictMode() const | |
197 { | |
198 return m_data.strictMode; | |
199 } | |
200 | |
201 Document* MediaValuesCached::document() const | |
202 { | |
203 return 0; | |
204 } | |
205 | |
206 bool MediaValuesCached::hasValues() const | |
207 { | |
208 return true; | |
209 } | |
210 | |
211 } // namespace | |
OLD | NEW |