Home | History | Annotate | Download | only in shapes
      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