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#ifndef ShapeInsideInfo_h 31#define ShapeInsideInfo_h 32 33#if ENABLE(CSS_SHAPES) 34 35#include "ShapeInfo.h" 36#include <wtf/PassOwnPtr.h> 37#include <wtf/Vector.h> 38 39namespace WebCore { 40 41class InlineIterator; 42class RenderBlock; 43class RenderObject; 44 45struct LineSegmentIterator { 46 RenderObject* root; 47 RenderObject* object; 48 unsigned offset; 49 LineSegmentIterator(RenderObject* root, RenderObject* object, unsigned offset) 50 : root(root) 51 , object(object) 52 , offset(offset) 53 { 54 } 55}; 56 57struct LineSegmentRange { 58 LineSegmentIterator start; 59 LineSegmentIterator end; 60 LineSegmentRange(const InlineIterator& start, const InlineIterator& end); 61}; 62 63typedef Vector<LineSegmentRange> SegmentRangeList; 64 65class ShapeInsideInfo : public ShapeInfo<RenderBlock, &RenderStyle::resolvedShapeInside, &Shape::getIncludedIntervals> { 66public: 67 static PassOwnPtr<ShapeInsideInfo> createInfo(const RenderBlock* renderer) { return adoptPtr(new ShapeInsideInfo(renderer)); } 68 69 static bool isEnabledFor(const RenderBlock* renderer); 70 71 virtual bool computeSegmentsForLine(LayoutUnit lineTop, LayoutUnit lineHeight) OVERRIDE 72 { 73 m_segmentRanges.clear(); 74 return ShapeInfo<RenderBlock, &RenderStyle::resolvedShapeInside, &Shape::getIncludedIntervals>::computeSegmentsForLine(lineTop, lineHeight); 75 } 76 77 bool hasSegments() const 78 { 79 return lineOverlapsShapeBounds() && m_segments.size(); 80 } 81 const SegmentList& segments() const 82 { 83 ASSERT(hasSegments()); 84 return m_segments; 85 } 86 SegmentRangeList& segmentRanges() { return m_segmentRanges; } 87 const SegmentRangeList& segmentRanges() const { return m_segmentRanges; } 88 const LineSegment* currentSegment() const 89 { 90 if (!hasSegments()) 91 return 0; 92 ASSERT(m_segmentRanges.size() < m_segments.size()); 93 return &m_segments[m_segmentRanges.size()]; 94 } 95 bool adjustLogicalLineTop(float minSegmentWidth); 96 97 void setNeedsLayout(bool value) { m_needsLayout = value; } 98 bool needsLayout() { return m_needsLayout; } 99 100protected: 101 virtual LayoutRect computedShapeLogicalBoundingBox() const OVERRIDE { return computedShape()->shapePaddingLogicalBoundingBox(); } 102 103private: 104 ShapeInsideInfo(const RenderBlock* renderer) 105 : ShapeInfo<RenderBlock, &RenderStyle::resolvedShapeInside, &Shape::getIncludedIntervals> (renderer) 106 , m_needsLayout(false) 107 { } 108 109 SegmentRangeList m_segmentRanges; 110 bool m_needsLayout:1; 111}; 112 113} 114#endif 115#endif 116