Home | History | Annotate | Download | only in rendering
      1 /*
      2  * Copyright (C) 2011 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 RenderRegion_h
     31 #define RenderRegion_h
     32 
     33 #include "core/rendering/RenderBlockFlow.h"
     34 #include "core/rendering/style/StyleInheritedData.h"
     35 
     36 namespace WebCore {
     37 
     38 struct LayerFragment;
     39 typedef Vector<LayerFragment, 1> LayerFragments;
     40 class RenderFlowThread;
     41 
     42 class RenderRegion : public RenderBlockFlow {
     43 public:
     44     explicit RenderRegion(Element*, RenderFlowThread*);
     45 
     46     virtual bool isRenderRegion() const OVERRIDE FINAL { return true; }
     47 
     48     void setFlowThreadPortionRect(const LayoutRect& rect) { m_flowThreadPortionRect = rect; }
     49     LayoutRect flowThreadPortionRect() const { return m_flowThreadPortionRect; }
     50     LayoutRect flowThreadPortionOverflowRect() const;
     51 
     52     void attachRegion();
     53     void detachRegion();
     54 
     55     RenderFlowThread* flowThread() const { return m_flowThread; }
     56 
     57     // Valid regions do not create circular dependencies with other flows.
     58     bool isValid() const { return m_isValid; }
     59     void setIsValid(bool valid) { m_isValid = valid; }
     60 
     61     bool isFirstRegion() const;
     62     bool isLastRegion() const;
     63 
     64     // These methods represent the width and height of a "page" and for a RenderRegion they are just
     65     // the content width and content height of a region. For RenderMultiColumnSets, however, they
     66     // will be the width and height of a single column or page in the set.
     67     virtual LayoutUnit pageLogicalWidth() const;
     68     virtual LayoutUnit pageLogicalHeight() const;
     69 
     70     LayoutUnit logicalTopOfFlowThreadContentRect(const LayoutRect&) const;
     71     LayoutUnit logicalBottomOfFlowThreadContentRect(const LayoutRect&) const;
     72     LayoutUnit logicalTopForFlowThreadContent() const { return logicalTopOfFlowThreadContentRect(flowThreadPortionRect()); };
     73     LayoutUnit logicalBottomForFlowThreadContent() const { return logicalBottomOfFlowThreadContentRect(flowThreadPortionRect()); };
     74 
     75     // This method represents the logical height of the entire flow thread portion used by the region or set.
     76     // For RenderRegions it matches logicalPaginationHeight(), but for sets it is the height of all the pages
     77     // or columns added together.
     78     virtual LayoutUnit logicalHeightOfAllFlowThreadContent() const;
     79 
     80     // The top of the nearest page inside the region. For RenderRegions, this is just the logical top of the
     81     // flow thread portion we contain. For sets, we have to figure out the top of the nearest column or
     82     // page.
     83     virtual LayoutUnit pageLogicalTopForOffset(LayoutUnit offset) const;
     84 
     85     virtual void repaintFlowThreadContent(const LayoutRect& repaintRect) const;
     86 
     87     virtual void collectLayerFragments(LayerFragments&, const LayoutRect&, const LayoutRect&) { }
     88 
     89     virtual bool canHaveChildren() const OVERRIDE FINAL { return false; }
     90     virtual bool canHaveGeneratedChildren() const OVERRIDE FINAL { return true; }
     91 
     92     virtual const char* renderName() const OVERRIDE { return "RenderRegion"; }
     93 
     94 protected:
     95     virtual void computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const OVERRIDE FINAL;
     96 
     97     LayoutRect overflowRectForFlowThreadPortion(const LayoutRect& flowThreadPortionRect, bool isFirstPortion, bool isLastPortion) const;
     98     void repaintFlowThreadContentRectangle(const LayoutRect& repaintRect, const LayoutRect& flowThreadPortionRect,
     99         const LayoutRect& flowThreadPortionOverflowRect, const LayoutPoint& regionLocation) const;
    100 
    101 private:
    102     virtual void insertedIntoTree() OVERRIDE FINAL;
    103     virtual void willBeRemovedFromTree() OVERRIDE FINAL;
    104 
    105     virtual void layoutBlock(bool relayoutChildren) OVERRIDE FINAL;
    106 
    107 protected:
    108     RenderFlowThread* m_flowThread;
    109 
    110 private:
    111     LayoutRect m_flowThreadPortionRect;
    112     bool m_isValid : 1;
    113 };
    114 
    115 DEFINE_RENDER_OBJECT_TYPE_CASTS(RenderRegion, isRenderRegion());
    116 
    117 } // namespace WebCore
    118 
    119 #endif // RenderRegion_h
    120