[CSS Shapes] Accept the new <box> value for shape-outside
[WebKit-https.git] / Source / WebCore / rendering / shapes / ShapeInfo.cpp
1 /*
2  * Copyright (C) 2012 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 HOLDER "AS IS" AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
21  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
25  * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
26  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  */
29
30 #include "config.h"
31 #include "ShapeInfo.h"
32
33 #if ENABLE(CSS_SHAPES)
34
35 #include "LengthFunctions.h"
36 #include "RenderBlock.h"
37 #include "RenderBox.h"
38 #include "RenderRegion.h"
39 #include "RenderStyle.h"
40 #include "Shape.h"
41
42 namespace WebCore {
43
44
45 bool checkShapeImageOrigin(Document& document, CachedImage& cachedImage)
46 {
47     if (cachedImage.isOriginClean(document.securityOrigin()))
48         return true;
49
50     const URL& url = cachedImage.url();
51     String urlString = url.isNull() ? "''" : url.stringCenterEllipsizedToLength();
52     document.addConsoleMessage(SecurityMessageSource, ErrorMessageLevel, "Unsafe attempt to load URL " + urlString + ".");
53
54     return false;
55 }
56
57 template<class RenderType>
58 const Shape* ShapeInfo<RenderType>::computedShape() const
59 {
60     if (Shape* shape = m_shape.get())
61         return shape;
62
63     WritingMode writingMode = m_renderer->style().writingMode();
64     Length margin = m_renderer->style().shapeMargin();
65     Length padding = m_renderer->style().shapePadding();
66     float shapeImageThreshold = m_renderer->style().shapeImageThreshold();
67     const ShapeValue* shapeValue = this->shapeValue();
68     ASSERT(shapeValue);
69
70     switch (shapeValue->type()) {
71     case ShapeValue::Shape:
72         ASSERT(shapeValue->shape());
73         m_shape = Shape::createShape(shapeValue->shape(), m_shapeLogicalSize, writingMode, margin, padding);
74         break;
75     case ShapeValue::Image:
76         ASSERT(shapeValue->image());
77         m_shape = Shape::createShape(shapeValue->image(), shapeImageThreshold, m_shapeLogicalSize, writingMode, margin, padding);
78         break;
79     case ShapeValue::Box: {
80         ASSERT(shapeValue->box());
81         // Bug 124228: Need to derive proper radii from border-radii
82         m_shape = Shape::createShape(m_shapeLogicalSize, LayoutSize(), writingMode, margin, padding);
83         break;
84     }
85     case ShapeValue::Outside:
86         // Outside should have already resolved to a different shape value
87         ASSERT_NOT_REACHED();
88     }
89
90     ASSERT(m_shape);
91     return m_shape.get();
92 }
93
94 template<class RenderType>
95 SegmentList ShapeInfo<RenderType>::computeSegmentsForLine(LayoutUnit lineTop, LayoutUnit lineHeight) const
96 {
97     ASSERT(lineHeight >= 0);
98     SegmentList segments;
99
100     getIntervals((lineTop - logicalTopOffset()), std::min(lineHeight, shapeLogicalBottom() - lineTop), segments);
101
102     for (size_t i = 0; i < segments.size(); i++) {
103         segments[i].logicalLeft += logicalLeftOffset();
104         segments[i].logicalRight += logicalLeftOffset();
105     }
106
107     return segments;
108 }
109
110 template class ShapeInfo<RenderBlock>;
111 template class ShapeInfo<RenderBox>;
112 }
113 #endif