diff options
Diffstat (limited to 'Source/WebCore/rendering/style/GridTrackSize.h')
-rw-r--r-- | Source/WebCore/rendering/style/GridTrackSize.h | 126 |
1 files changed, 76 insertions, 50 deletions
diff --git a/Source/WebCore/rendering/style/GridTrackSize.h b/Source/WebCore/rendering/style/GridTrackSize.h index d5fca8948..a7ec78dbe 100644 --- a/Source/WebCore/rendering/style/GridTrackSize.h +++ b/Source/WebCore/rendering/style/GridTrackSize.h @@ -1,5 +1,6 @@ /* * Copyright (C) 2012 Google Inc. All rights reserved. + * Copyright (C) 2013, 2014 Igalia S.L. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -28,8 +29,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef GridTrackSize_h -#define GridTrackSize_h +#pragma once #include "GridLength.h" @@ -37,81 +37,107 @@ namespace WebCore { enum GridTrackSizeType { LengthTrackSizing, - MinMaxTrackSizing + MinMaxTrackSizing, + FitContentTrackSizing }; +// This class represents a <track-size> from the spec. Althought there are 3 different types of +// <track-size> there is always an equivalent minmax() representation that could represent any of +// them. The only special case is fit-content(argument) which is similar to minmax(auto, +// max-content) except that the track size is clamped at argument if it is greater than the auto +// minimum. At the GridTrackSize level we don't need to worry about clamping so we treat that case +// exactly as auto. +// +// We're using a separate attribute to store fit-content argument even though we could directly use +// m_maxTrackBreadth. The reason why we don't do it is because the maxTrackBreadh() call is a hot +// spot, so adding a conditional statement there (to distinguish between fit-content and any other +// case) was causing a severe performance drop. class GridTrackSize { public: - GridTrackSize(LengthType type = Undefined) - : m_type(LengthTrackSizing) - , m_minTrackBreadth(type) - , m_maxTrackBreadth(type) + GridTrackSize(const GridLength& length, GridTrackSizeType trackSizeType = LengthTrackSizing) + : m_type(trackSizeType) + , m_minTrackBreadth(trackSizeType == FitContentTrackSizing ? Length(Auto) : length) + , m_maxTrackBreadth(trackSizeType == FitContentTrackSizing ? Length(Auto) : length) + , m_fitContentTrackBreadth(trackSizeType == FitContentTrackSizing ? length : GridLength(Length(Fixed))) { + ASSERT(trackSizeType == LengthTrackSizing || trackSizeType == FitContentTrackSizing); + ASSERT(trackSizeType != FitContentTrackSizing || length.isLength()); + cacheMinMaxTrackBreadthTypes(); } - const GridLength& length() const + GridTrackSize(const GridLength& minTrackBreadth, const GridLength& maxTrackBreadth) + : m_type(MinMaxTrackSizing) + , m_minTrackBreadth(minTrackBreadth) + , m_maxTrackBreadth(maxTrackBreadth) + , m_fitContentTrackBreadth(GridLength(Length(Fixed))) { - ASSERT(m_type == LengthTrackSizing); - ASSERT(m_minTrackBreadth == m_maxTrackBreadth); - const GridLength& minTrackBreadth = m_minTrackBreadth; - ASSERT(!minTrackBreadth.isLength() || !minTrackBreadth.length().isUndefined()); - return minTrackBreadth; + cacheMinMaxTrackBreadthTypes(); } - void setLength(const GridLength& length) + const GridLength& fitContentTrackBreadth() const { - m_type = LengthTrackSizing; - m_minTrackBreadth = length; - m_maxTrackBreadth = length; + ASSERT(m_type == FitContentTrackSizing); + return m_fitContentTrackBreadth; } - const GridLength& minTrackBreadth() const - { - ASSERT(!m_minTrackBreadth.isLength() || !m_minTrackBreadth.length().isUndefined()); - if (m_minTrackBreadth.isLength() && m_minTrackBreadth.length().isAuto()) { - DEFINE_STATIC_LOCAL(GridLength, minContent, (MinContent)); - return minContent; - } - return m_minTrackBreadth; - } - - const GridLength& maxTrackBreadth() const - { - ASSERT(!m_maxTrackBreadth.isLength() || !m_maxTrackBreadth.length().isUndefined()); - if (m_maxTrackBreadth.isLength() && m_maxTrackBreadth.length().isAuto()) { - DEFINE_STATIC_LOCAL(GridLength, maxContent, (MaxContent)); - return maxContent; - } - return m_maxTrackBreadth; - } - - void setMinMax(const GridLength& minTrackBreadth, const GridLength& maxTrackBreadth) - { - m_type = MinMaxTrackSizing; - m_minTrackBreadth = minTrackBreadth; - m_maxTrackBreadth = maxTrackBreadth; - } + const GridLength& minTrackBreadth() const { return m_minTrackBreadth; } + const GridLength& maxTrackBreadth() const { return m_maxTrackBreadth; } GridTrackSizeType type() const { return m_type; } bool isContentSized() const { return m_minTrackBreadth.isContentSized() || m_maxTrackBreadth.isContentSized(); } + bool isFitContent() const { return m_type == FitContentTrackSizing; } bool operator==(const GridTrackSize& other) const { - return m_type == other.m_type && m_minTrackBreadth == other.m_minTrackBreadth && m_maxTrackBreadth == other.m_maxTrackBreadth; + return m_type == other.m_type && m_minTrackBreadth == other.m_minTrackBreadth && m_maxTrackBreadth == other.m_maxTrackBreadth + && m_fitContentTrackBreadth == other.m_fitContentTrackBreadth; + } + + void cacheMinMaxTrackBreadthTypes() + { + m_minTrackBreadthIsAuto = minTrackBreadth().isLength() && minTrackBreadth().length().isAuto(); + m_minTrackBreadthIsMinContent = minTrackBreadth().isLength() && minTrackBreadth().length().isMinContent(); + m_minTrackBreadthIsMaxContent = minTrackBreadth().isLength() && minTrackBreadth().length().isMaxContent(); + m_maxTrackBreadthIsMaxContent = maxTrackBreadth().isLength() && maxTrackBreadth().length().isMaxContent(); + m_maxTrackBreadthIsMinContent = maxTrackBreadth().isLength() && maxTrackBreadth().length().isMinContent(); + m_maxTrackBreadthIsAuto = maxTrackBreadth().isLength() && maxTrackBreadth().length().isAuto(); + + // These values depend on the above ones so keep them here. + m_minTrackBreadthIsIntrinsic = m_minTrackBreadthIsMaxContent || m_minTrackBreadthIsMinContent + || m_minTrackBreadthIsAuto || isFitContent(); + m_maxTrackBreadthIsIntrinsic = m_maxTrackBreadthIsMaxContent || m_maxTrackBreadthIsMinContent + || m_maxTrackBreadthIsAuto || isFitContent(); } - bool hasMinOrMaxContentMinTrackBreadth() const { return minTrackBreadth().isLength() && (minTrackBreadth().length().isMinContent() || minTrackBreadth().length().isMaxContent()); } - bool hasMaxContentMinTrackBreadth() const { return minTrackBreadth().isLength() && minTrackBreadth().length().isMaxContent(); } - bool hasMinOrMaxContentMaxTrackBreadth() const { return maxTrackBreadth().isLength() && (maxTrackBreadth().length().isMinContent() || maxTrackBreadth().length().isMaxContent()); } - bool hasMaxContentMaxTrackBreadth() const { return maxTrackBreadth().isLength() && maxTrackBreadth().length().isMaxContent(); } + bool hasIntrinsicMinTrackBreadth() const { return m_minTrackBreadthIsIntrinsic; } + bool hasIntrinsicMaxTrackBreadth() const { return m_maxTrackBreadthIsIntrinsic; } + bool hasMinOrMaxContentMinTrackBreadth() const { return m_minTrackBreadthIsMaxContent || m_minTrackBreadthIsMinContent; } + bool hasAutoMinTrackBreadth() const { return m_minTrackBreadthIsAuto; } + bool hasAutoMaxTrackBreadth() const { return m_maxTrackBreadthIsAuto; } + bool hasMaxContentMaxTrackBreadth() const { return m_maxTrackBreadthIsMaxContent; } + bool hasMaxContentOrAutoMaxTrackBreadth() const { return m_maxTrackBreadthIsMaxContent || m_maxTrackBreadthIsAuto; } + bool hasMinContentMaxTrackBreadth() const { return m_maxTrackBreadthIsMinContent; } + bool hasMinOrMaxContentMaxTrackBreadth() const { return m_maxTrackBreadthIsMaxContent || m_maxTrackBreadthIsMinContent; } + bool hasMaxContentMinTrackBreadth() const { return m_minTrackBreadthIsMaxContent; } + bool hasMinContentMinTrackBreadth() const { return m_minTrackBreadthIsMinContent; } + bool hasMaxContentMinTrackBreadthAndMaxContentMaxTrackBreadth() const { return m_minTrackBreadthIsMaxContent && m_maxTrackBreadthIsMaxContent; } + bool hasAutoOrMinContentMinTrackBreadthAndIntrinsicMaxTrackBreadth() const { return (m_minTrackBreadthIsMinContent || m_minTrackBreadthIsAuto) && m_maxTrackBreadthIsIntrinsic; } private: GridTrackSizeType m_type; GridLength m_minTrackBreadth; GridLength m_maxTrackBreadth; + GridLength m_fitContentTrackBreadth; + + bool m_minTrackBreadthIsAuto : 1; + bool m_maxTrackBreadthIsAuto : 1; + bool m_minTrackBreadthIsMaxContent : 1; + bool m_minTrackBreadthIsMinContent : 1; + bool m_maxTrackBreadthIsMaxContent : 1; + bool m_maxTrackBreadthIsMinContent : 1; + bool m_minTrackBreadthIsIntrinsic : 1; + bool m_maxTrackBreadthIsIntrinsic : 1; }; } // namespace WebCore - -#endif // GridTrackSize_h |