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