[CSS Shapes] CORS-enabled fetch for shape image values
[WebKit-https.git] / Source / WebCore / rendering / shapes / ShapeOutsideInfo.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
32 #if ENABLE(CSS_SHAPES)
33
34 #include "ShapeOutsideInfo.h"
35
36 #include "FloatingObjects.h"
37 #include "RenderBlockFlow.h"
38 #include "RenderBox.h"
39
40 namespace WebCore {
41 bool ShapeOutsideInfo::isEnabledFor(const RenderBox* box)
42 {
43     ShapeValue* shapeValue = box->style()->shapeOutside();
44     if (!box->isFloating() || !shapeValue)
45         return false;
46
47     switch (shapeValue->type()) {
48     case ShapeValue::Shape:
49         return shapeValue->shape();
50     case ShapeValue::Image:
51         return shapeValue->isImageValid() && checkShapeImageOrigin(box->document(), *(shapeValue->image()->cachedImage()));
52     default:
53         return false;
54     }
55 }
56
57 void ShapeOutsideInfo::updateDeltasForContainingBlockLine(const RenderBlockFlow* containingBlock, const FloatingObject* floatingObject, LayoutUnit lineTop, LayoutUnit lineHeight)
58 {
59     LayoutUnit shapeTop = containingBlock->logicalTopForFloat(floatingObject) + std::max(LayoutUnit(), containingBlock->marginBeforeForChild(*m_renderer));
60     LayoutUnit lineTopInShapeCoordinates = lineTop - shapeTop + logicalTopOffset();
61
62     if (shapeSizeDirty() || m_lineTop != lineTopInShapeCoordinates || m_lineHeight != lineHeight) {
63         m_lineTop = lineTopInShapeCoordinates;
64         m_shapeLineTop = lineTopInShapeCoordinates - logicalTopOffset();
65         m_lineHeight = lineHeight;
66
67         LayoutUnit floatMarginBoxWidth = containingBlock->logicalWidthForFloat(floatingObject);
68
69         if (lineOverlapsShapeBounds()) {
70             SegmentList segments = computeSegmentsForLine(lineTopInShapeCoordinates, lineHeight);
71             if (segments.size()) {
72                 LayoutUnit rawLeftMarginBoxDelta = segments.first().logicalLeft + containingBlock->marginStartForChild(*m_renderer);
73                 m_leftMarginBoxDelta = clampTo<LayoutUnit>(rawLeftMarginBoxDelta, LayoutUnit(), floatMarginBoxWidth);
74
75                 LayoutUnit rawRightMarginBoxDelta = segments.last().logicalRight - containingBlock->logicalWidthForChild(*m_renderer) - containingBlock->marginEndForChild(*m_renderer);
76                 m_rightMarginBoxDelta = clampTo<LayoutUnit>(rawRightMarginBoxDelta, -floatMarginBoxWidth, LayoutUnit());
77                 return;
78             }
79         }
80
81         // Lines that do not overlap the shape should act as if the float
82         // wasn't there for layout purposes. So we set the deltas to remove the
83         // entire width of the float. 
84         // FIXME: The latest CSS Shapes spec says that in this case, the
85         // content should interact with previously stacked floats on the line
86         // as if this outermost float did not exist. Perhaps obviously, this
87         // solution cannot do that, and will be revisted with bug 122576.
88         m_leftMarginBoxDelta = floatMarginBoxWidth;
89         m_rightMarginBoxDelta = -floatMarginBoxWidth;
90     }
91 }
92
93 ShapeValue* ShapeOutsideInfo::shapeValue() const
94 {
95     return m_renderer->style()->shapeOutside();
96 }
97
98 }
99 #endif