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 "core/rendering/shapes/ShapeOutsideInfo.h" 32 33 #include "core/rendering/RenderBox.h" 34 35 namespace WebCore { 36 bool ShapeOutsideInfo::isEnabledFor(const RenderBox* box) 37 { 38 ShapeValue* value = box->style()->shapeOutside(); 39 return box->isFloatingWithShapeOutside() && value->type() == ShapeValue::Shape && value->shape(); 40 } 41 42 bool ShapeOutsideInfo::computeSegmentsForContainingBlockLine(LayoutUnit lineTop, LayoutUnit floatTop, LayoutUnit lineHeight) 43 { 44 LayoutUnit lineTopInShapeCoordinates = lineTop - floatTop + logicalTopOffset(); 45 return computeSegmentsForLine(lineTopInShapeCoordinates, lineHeight); 46 } 47 48 bool ShapeOutsideInfo::computeSegmentsForLine(LayoutUnit lineTop, LayoutUnit lineHeight) 49 { 50 if (shapeSizeDirty() || m_lineTop != lineTop || m_lineHeight != lineHeight) { 51 if (ShapeInfo<RenderBox, &RenderStyle::shapeOutside, &Shape::getExcludedIntervals>::computeSegmentsForLine(lineTop, lineHeight)) { 52 m_leftSegmentMarginBoxDelta = m_segments[0].logicalLeft + m_renderer->marginStart(); 53 m_rightSegmentMarginBoxDelta = m_segments[m_segments.size()-1].logicalRight - m_renderer->logicalWidth() - m_renderer->marginEnd(); 54 } else { 55 m_leftSegmentMarginBoxDelta = m_renderer->logicalWidth() + m_renderer->marginStart(); 56 m_rightSegmentMarginBoxDelta = -m_renderer->logicalWidth() - m_renderer->marginEnd(); 57 } 58 m_lineTop = lineTop; 59 } 60 61 return m_segments.size(); 62 } 63 64 } 65