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