OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * Copyright (C) 2004, 2005, 2006, 2009, 2011 Apple Inc. All rights reserved. | 4 * Copyright (C) 2004, 2005, 2006, 2009, 2011 Apple Inc. All rights reserved. |
5 * | 5 * |
6 * This library is free software; you can redistribute it and/or | 6 * This library is free software; you can redistribute it and/or |
7 * modify it under the terms of the GNU Library General Public | 7 * modify it under the terms of the GNU Library General Public |
8 * License as published by the Free Software Foundation; either | 8 * License as published by the Free Software Foundation; either |
9 * version 2 of the License, or (at your option) any later version. | 9 * version 2 of the License, or (at your option) any later version. |
10 * | 10 * |
(...skipping 10 matching lines...) Expand all Loading... |
21 | 21 |
22 #include "core/html/HTMLAreaElement.h" | 22 #include "core/html/HTMLAreaElement.h" |
23 | 23 |
24 #include "core/HTMLNames.h" | 24 #include "core/HTMLNames.h" |
25 #include "core/dom/ElementTraversal.h" | 25 #include "core/dom/ElementTraversal.h" |
26 #include "core/html/HTMLImageElement.h" | 26 #include "core/html/HTMLImageElement.h" |
27 #include "core/html/HTMLMapElement.h" | 27 #include "core/html/HTMLMapElement.h" |
28 #include "core/layout/HitTestResult.h" | 28 #include "core/layout/HitTestResult.h" |
29 #include "core/layout/LayoutImage.h" | 29 #include "core/layout/LayoutImage.h" |
30 #include "core/layout/LayoutView.h" | 30 #include "core/layout/LayoutView.h" |
31 #include "platform/LengthFunctions.h" | |
32 #include "platform/graphics/Path.h" | 31 #include "platform/graphics/Path.h" |
33 #include "platform/transforms/AffineTransform.h" | 32 #include "platform/transforms/AffineTransform.h" |
34 | 33 |
35 namespace blink { | 34 namespace blink { |
36 | 35 |
| 36 namespace { |
| 37 |
| 38 // Adapt a Length to the allowed range of a LayoutUnit. |
| 39 float clampCoordinate(const Length& length) |
| 40 { |
| 41 ASSERT(length.isFixed()); |
| 42 return LayoutUnit(length.value()).toFloat(); |
| 43 } |
| 44 |
| 45 } |
| 46 |
37 using namespace HTMLNames; | 47 using namespace HTMLNames; |
38 | 48 |
39 inline HTMLAreaElement::HTMLAreaElement(Document& document) | 49 inline HTMLAreaElement::HTMLAreaElement(Document& document) |
40 : HTMLAnchorElement(areaTag, document) | 50 : HTMLAnchorElement(areaTag, document) |
41 , m_lastSize(-1, -1) | 51 , m_lastSize(-1, -1) |
42 , m_shape(Unknown) | 52 , m_shape(Unknown) |
43 { | 53 { |
44 } | 54 } |
45 | 55 |
46 // An explicit empty destructor should be in HTMLAreaElement.cpp, because | 56 // An explicit empty destructor should be in HTMLAreaElement.cpp, because |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 LayoutRect HTMLAreaElement::computeRect(const LayoutObject* obj) const | 129 LayoutRect HTMLAreaElement::computeRect(const LayoutObject* obj) const |
120 { | 130 { |
121 return enclosingLayoutRect(computePath(obj).boundingRect()); | 131 return enclosingLayoutRect(computePath(obj).boundingRect()); |
122 } | 132 } |
123 | 133 |
124 Path HTMLAreaElement::getRegion(const LayoutSize& size) const | 134 Path HTMLAreaElement::getRegion(const LayoutSize& size) const |
125 { | 135 { |
126 if (m_coords.isEmpty() && m_shape != Default) | 136 if (m_coords.isEmpty() && m_shape != Default) |
127 return Path(); | 137 return Path(); |
128 | 138 |
129 LayoutUnit width = size.width(); | |
130 LayoutUnit height = size.height(); | |
131 | |
132 // If element omits the shape attribute, select shape based on number of coo
rdinates. | 139 // If element omits the shape attribute, select shape based on number of coo
rdinates. |
133 Shape shape = m_shape; | 140 Shape shape = m_shape; |
134 if (shape == Unknown) { | 141 if (shape == Unknown) { |
135 if (m_coords.size() == 3) | 142 if (m_coords.size() == 3) |
136 shape = Circle; | 143 shape = Circle; |
137 else if (m_coords.size() == 4) | 144 else if (m_coords.size() == 4) |
138 shape = Rect; | 145 shape = Rect; |
139 else if (m_coords.size() >= 6) | 146 else if (m_coords.size() >= 6) |
140 shape = Poly; | 147 shape = Poly; |
141 } | 148 } |
142 | 149 |
143 Path path; | 150 Path path; |
144 switch (shape) { | 151 switch (shape) { |
145 case Poly: | 152 case Poly: |
146 if (m_coords.size() >= 6) { | 153 if (m_coords.size() >= 6) { |
147 int numPoints = m_coords.size() / 2; | 154 int numPoints = m_coords.size() / 2; |
148 path.moveTo(FloatPoint(minimumValueForLength(m_coords[0], width).toF
loat(), minimumValueForLength(m_coords[1], height).toFloat())); | 155 path.moveTo(FloatPoint(clampCoordinate(m_coords[0]), clampCoordinate
(m_coords[1]))); |
149 for (int i = 1; i < numPoints; ++i) | 156 for (int i = 1; i < numPoints; ++i) |
150 path.addLineTo(FloatPoint(minimumValueForLength(m_coords[i * 2],
width).toFloat(), minimumValueForLength(m_coords[i * 2 + 1], height).toFloat())
); | 157 path.addLineTo(FloatPoint(clampCoordinate(m_coords[i * 2]), clam
pCoordinate(m_coords[i * 2 + 1]))); |
151 path.closeSubpath(); | 158 path.closeSubpath(); |
152 } | 159 } |
153 break; | 160 break; |
154 case Circle: | 161 case Circle: |
155 if (m_coords.size() >= 3) { | 162 if (m_coords.size() >= 3) { |
156 Length radius = m_coords[2]; | 163 float r = clampCoordinate(m_coords[2]); |
157 float r = std::min(minimumValueForLength(radius, width).toFloat(), m
inimumValueForLength(radius, height).toFloat()); | 164 path.addEllipse(FloatRect(clampCoordinate(m_coords[0]) - r, clampCoo
rdinate(m_coords[1]) - r, 2 * r, 2 * r)); |
158 path.addEllipse(FloatRect(minimumValueForLength(m_coords[0], width).
toFloat() - r, minimumValueForLength(m_coords[1], height).toFloat() - r, 2 * r,
2 * r)); | |
159 } | 165 } |
160 break; | 166 break; |
161 case Rect: | 167 case Rect: |
162 if (m_coords.size() >= 4) { | 168 if (m_coords.size() >= 4) { |
163 float x0 = minimumValueForLength(m_coords[0], width).toFloat(); | 169 float x0 = clampCoordinate(m_coords[0]); |
164 float y0 = minimumValueForLength(m_coords[1], height).toFloat(); | 170 float y0 = clampCoordinate(m_coords[1]); |
165 float x1 = minimumValueForLength(m_coords[2], width).toFloat(); | 171 float x1 = clampCoordinate(m_coords[2]); |
166 float y1 = minimumValueForLength(m_coords[3], height).toFloat(); | 172 float y1 = clampCoordinate(m_coords[3]); |
167 path.addRect(FloatRect(x0, y0, x1 - x0, y1 - y0)); | 173 path.addRect(FloatRect(x0, y0, x1 - x0, y1 - y0)); |
168 } | 174 } |
169 break; | 175 break; |
170 case Default: | 176 case Default: |
171 path.addRect(FloatRect(0, 0, width.toFloat(), height.toFloat())); | 177 path.addRect(FloatRect(FloatPoint(0, 0), FloatSize(size))); |
172 break; | 178 break; |
173 case Unknown: | 179 case Unknown: |
174 break; | 180 break; |
175 } | 181 } |
176 | 182 |
177 return path; | 183 return path; |
178 } | 184 } |
179 | 185 |
180 HTMLImageElement* HTMLAreaElement::imageElement() const | 186 HTMLImageElement* HTMLAreaElement::imageElement() const |
181 { | 187 { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 void HTMLAreaElement::updateFocusAppearance(SelectionBehaviorOnFocus selectionBe
havior) | 230 void HTMLAreaElement::updateFocusAppearance(SelectionBehaviorOnFocus selectionBe
havior) |
225 { | 231 { |
226 if (!isFocusable()) | 232 if (!isFocusable()) |
227 return; | 233 return; |
228 | 234 |
229 if (HTMLImageElement* imageElement = this->imageElement()) | 235 if (HTMLImageElement* imageElement = this->imageElement()) |
230 imageElement->updateFocusAppearance(selectionBehavior); | 236 imageElement->updateFocusAppearance(selectionBehavior); |
231 } | 237 } |
232 | 238 |
233 } | 239 } |
OLD | NEW |