0222e794595a7b317fd6334224163041e47ec079
[WebKit-https.git] / Source / WebCore / rendering / shapes / BoxShape.cpp
1 /*
2  * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1. Redistributions of source code must retain the above
9  *    copyright notice, this list of conditions and the following
10  *    disclaimer.
11  * 2. Redistributions in binary form must reproduce the above
12  *    copyright notice, this list of conditions and the following
13  *    disclaimer in the documentation and/or other materials
14  *    provided with the distribution.
15  * 
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
19  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
20  * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
21  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
25  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
27  * OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30 #include "config.h"
31 #include "BoxShape.h"
32
33 #include <wtf/MathExtras.h>
34
35 namespace WebCore {
36
37 BoxShape::BoxShape(const FloatRoundedRect& bounds)
38     : Shape()
39     , m_bounds(bounds)
40     , m_marginBounds(bounds)
41     , m_paddingBounds(bounds)
42 {
43     if (shapeMargin() > 0) {
44         m_marginBounds.inflate(shapeMargin());
45         m_marginBounds.expandRadii(shapeMargin());
46     }
47     if (shapePadding() > 0) {
48         m_paddingBounds.inflate(-shapePadding());
49         m_paddingBounds.expandRadii(-shapePadding());
50     }
51 }
52
53 void BoxShape::getExcludedIntervals(LayoutUnit logicalTop, LayoutUnit logicalHeight, SegmentList& result) const
54 {
55     if (m_marginBounds.isEmpty())
56         return;
57
58     float y1 = logicalTop;
59     float y2 = logicalTop + logicalHeight;
60     const FloatRect& rect = m_marginBounds.rect();
61
62     if (y2 <= rect.y() || y1 >= rect.maxY())
63         return;
64
65     if (!m_marginBounds.isRounded()) {
66         result.append(LineSegment(m_marginBounds.rect().x(), m_marginBounds.rect().maxX()));
67         return;
68     }
69
70     float x1 = rect.maxX();
71     float x2 = rect.x();
72     float minXIntercept;
73     float maxXIntercept;
74
75     if (m_marginBounds.xInterceptsAtY(y1, minXIntercept, maxXIntercept)) {
76         x1 = std::min<float>(x1, minXIntercept);
77         x2 = std::max<float>(x2, maxXIntercept);
78     }
79
80     if (m_marginBounds.xInterceptsAtY(y1, minXIntercept, maxXIntercept)) {
81         x1 = std::min<float>(x1, minXIntercept);
82         x2 = std::max<float>(x2, maxXIntercept);
83     }
84
85     ASSERT(x2 >= x1);
86     result.append(LineSegment(x1, x2));
87 }
88
89 void BoxShape::getIncludedIntervals(LayoutUnit logicalTop, LayoutUnit logicalHeight, SegmentList& result) const
90 {
91     if (m_paddingBounds.isEmpty())
92         return;
93
94     const FloatRect& rect = m_paddingBounds.rect();
95     if (logicalTop < rect.y() || logicalTop + logicalHeight > rect.maxY())
96         return;
97
98     // FIXME: this method is only a stub, https://bugs.webkit.org/show_bug.cgi?id=124605.
99
100     result.append(LineSegment(rect.x(), rect.maxX()));
101 }
102
103 bool BoxShape::firstIncludedIntervalLogicalTop(LayoutUnit minLogicalIntervalTop, const LayoutSize&, LayoutUnit& result) const
104 {
105     // FIXME: this method is only a stub, https://bugs.webkit.org/show_bug.cgi?id=124606.
106
107     result = minLogicalIntervalTop;
108     return true;
109 }
110
111 } // namespace WebCore