Home | History | Annotate | Download | only in rendering
      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 LineWidth_h
     31 #define LineWidth_h
     32 
     33 #include "platform/LayoutUnit.h"
     34 
     35 namespace WebCore {
     36 
     37 class FloatingObject;
     38 class RenderBlock;
     39 class RenderObject;
     40 class RenderRubyRun;
     41 class RenderBlockFlow;
     42 
     43 struct LineSegment;
     44 
     45 enum IndentTextOrNot { DoNotIndentText, IndentText };
     46 
     47 class LineWidth {
     48 public:
     49     LineWidth(RenderBlockFlow&, bool isFirstLine, IndentTextOrNot shouldIndentText);
     50 
     51     bool fitsOnLine() const { return currentWidth() <= (m_availableWidth + LayoutUnit::epsilon()); }
     52     bool fitsOnLine(float extra) const { return currentWidth() + extra <= (m_availableWidth + LayoutUnit::epsilon()); }
     53 
     54     float currentWidth() const { return m_committedWidth + m_uncommittedWidth; }
     55     // FIXME: We should eventually replace these three functions by ones that work on a higher abstraction.
     56     float uncommittedWidth() const { return m_uncommittedWidth; }
     57     float committedWidth() const { return m_committedWidth; }
     58     float availableWidth() const { return m_availableWidth; }
     59 
     60     void updateAvailableWidth(LayoutUnit minimumHeight = 0);
     61     void shrinkAvailableWidthForNewFloatIfNeeded(FloatingObject*);
     62     void addUncommittedWidth(float delta) { m_uncommittedWidth += delta; }
     63     void commit();
     64     void applyOverhang(RenderRubyRun*, RenderObject* startRenderer, RenderObject* endRenderer);
     65     void fitBelowFloats();
     66 
     67     void updateCurrentShapeSegment();
     68 
     69     bool shouldIndentText() const { return m_shouldIndentText == IndentText; }
     70 
     71 private:
     72     void computeAvailableWidthFromLeftAndRight();
     73 
     74     RenderBlockFlow& m_block;
     75     float m_uncommittedWidth;
     76     float m_committedWidth;
     77     float m_overhangWidth; // The amount by which |m_availableWidth| has been inflated to account for possible contraction due to ruby overhang.
     78     float m_left;
     79     float m_right;
     80     float m_availableWidth;
     81     const LineSegment* m_segment;
     82     bool m_isFirstLine;
     83     IndentTextOrNot m_shouldIndentText;
     84 };
     85 
     86 }
     87 
     88 #endif // LineWidth_h
     89