summaryrefslogtreecommitdiff
path: root/Source/WebCore/rendering/style/GridTrackSize.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/rendering/style/GridTrackSize.h')
-rw-r--r--Source/WebCore/rendering/style/GridTrackSize.h126
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