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 "core/rendering/shapes/Shape.h" 34 #include "core/rendering/shapes/ShapeInterval.h" 35 #include "platform/geometry/FloatRect.h" 36 #include "wtf/Assertions.h" 37 #include "wtf/Vector.h" 38 39 namespace blink { 40 41 class RasterShapeIntervals { 42 public: 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 PassOwnPtr<RasterShapeIntervals> computeShapeMarginIntervals(int shapeMargin) const; 66 67 void buildBoundsPath(Path&) const; 68 69 private: 70 int size() const { return m_intervals.size(); } 71 int offset() const { return m_offset; } 72 int minY() const { return -m_offset; } 73 int maxY() const { return -m_offset + m_intervals.size(); } 74 75 IntRect m_bounds; 76 Vector<IntShapeInterval> m_intervals; 77 int m_offset; 78 }; 79 80 class RasterShape FINAL : public Shape { 81 WTF_MAKE_NONCOPYABLE(RasterShape); 82 public: 83 RasterShape(PassOwnPtr<RasterShapeIntervals> intervals, const IntSize& marginRectSize) 84 : m_intervals(intervals) 85 , m_marginRectSize(marginRectSize) 86 { 87 m_intervals->initializeBounds(); 88 } 89 90 virtual LayoutRect shapeMarginLogicalBoundingBox() const OVERRIDE { return static_cast<LayoutRect>(marginIntervals().bounds()); } 91 virtual bool isEmpty() const OVERRIDE { return m_intervals->isEmpty(); } 92 virtual LineSegment getExcludedInterval(LayoutUnit logicalTop, LayoutUnit logicalHeight) const OVERRIDE; 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 100 private: 101 const RasterShapeIntervals& marginIntervals() const; 102 103 OwnPtr<RasterShapeIntervals> m_intervals; 104 mutable OwnPtr<RasterShapeIntervals> m_marginIntervals; 105 IntSize m_marginRectSize; 106 }; 107 108 } // namespace blink 109 110 #endif // RasterShape_h 111