1/* 2 * Copyright (C) 2013 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 HOLDERS AND CONTRIBUTORS 17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 19 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 20 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 21 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 23 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 25 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 27 * OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30#ifndef RasterShape_h 31#define RasterShape_h 32 33#include "FloatRect.h" 34#include "Shape.h" 35#include "ShapeInterval.h" 36#include <wtf/Assertions.h> 37#include <wtf/Vector.h> 38 39namespace WebCore { 40 41class RasterShapeIntervals { 42public: 43 RasterShapeIntervals(unsigned size, int offset = 0) 44 : m_offset(offset) 45 { 46 m_intervals.resize(clampTo<int>(size)); 47 } 48 49 void initializeBounds(); 50 const IntRect& bounds() const { return m_bounds; } 51 bool isEmpty() const { return m_bounds.isEmpty(); } 52 53 IntShapeInterval& intervalAt(int y) 54 { 55 ASSERT(y + m_offset >= 0 && static_cast<unsigned>(y + m_offset) < m_intervals.size()); 56 return m_intervals[y + m_offset]; 57 } 58 59 const IntShapeInterval& intervalAt(int y) const 60 { 61 ASSERT(y + m_offset >= 0 && static_cast<unsigned>(y + m_offset) < m_intervals.size()); 62 return m_intervals[y + m_offset]; 63 } 64 65 std::unique_ptr<RasterShapeIntervals> computeShapeMarginIntervals(int shapeMargin) const; 66 void buildBoundsPath(Path&) const; 67 68private: 69 int size() const { return m_intervals.size(); } 70 int offset() const { return m_offset; } 71 int minY() const { return -m_offset; } 72 int maxY() const { return -m_offset + m_intervals.size(); } 73 74 IntRect m_bounds; 75 Vector<IntShapeInterval> m_intervals; 76 int m_offset; 77}; 78 79class RasterShape : public Shape { 80 WTF_MAKE_NONCOPYABLE(RasterShape); 81public: 82 RasterShape(std::unique_ptr<RasterShapeIntervals> intervals, const IntSize& marginRectSize) 83 : m_intervals(WTF::move(intervals)) 84 , m_marginRectSize(marginRectSize) 85 { 86 m_intervals->initializeBounds(); 87 } 88 89 virtual LayoutRect shapeMarginLogicalBoundingBox() const override { return static_cast<LayoutRect>(marginIntervals().bounds()); } 90 virtual bool isEmpty() const override { return m_intervals->isEmpty(); } 91 virtual void getExcludedIntervals(LayoutUnit logicalTop, LayoutUnit logicalHeight, SegmentList&) const override; 92 93 virtual void buildDisplayPaths(DisplayPaths& paths) const override 94 { 95 m_intervals->buildBoundsPath(paths.shape); 96 if (shapeMargin()) 97 marginIntervals().buildBoundsPath(paths.marginShape); 98 } 99 100private: 101 const RasterShapeIntervals& marginIntervals() const; 102 103 std::unique_ptr<RasterShapeIntervals> m_intervals; 104 mutable std::unique_ptr<RasterShapeIntervals> m_marginIntervals; 105 IntSize m_marginRectSize; 106}; 107 108} // namespace WebCore 109 110#endif // RasterShape_h 111