summaryrefslogtreecommitdiffstats
path: root/layout/generic/nsIFrameInlines.h
diff options
context:
space:
mode:
Diffstat (limited to 'layout/generic/nsIFrameInlines.h')
-rw-r--r--layout/generic/nsIFrameInlines.h163
1 files changed, 163 insertions, 0 deletions
diff --git a/layout/generic/nsIFrameInlines.h b/layout/generic/nsIFrameInlines.h
new file mode 100644
index 000000000..eb9a7202a
--- /dev/null
+++ b/layout/generic/nsIFrameInlines.h
@@ -0,0 +1,163 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=2 sw=2 et tw=78: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef nsIFrameInlines_h___
+#define nsIFrameInlines_h___
+
+#include "nsContainerFrame.h"
+#include "nsStyleStructInlines.h"
+#include "nsCSSAnonBoxes.h"
+
+bool
+nsIFrame::IsFlexItem() const
+{
+ return GetParent() &&
+ GetParent()->GetType() == nsGkAtoms::flexContainerFrame &&
+ !(GetStateBits() & NS_FRAME_OUT_OF_FLOW);
+}
+
+bool
+nsIFrame::IsFlexOrGridContainer() const
+{
+ nsIAtom* t = GetType();
+ return t == nsGkAtoms::flexContainerFrame ||
+ t == nsGkAtoms::gridContainerFrame;
+}
+
+bool
+nsIFrame::IsFlexOrGridItem() const
+{
+ return !(GetStateBits() & NS_FRAME_OUT_OF_FLOW) &&
+ GetParent() &&
+ GetParent()->IsFlexOrGridContainer();
+}
+
+bool
+nsIFrame::IsTableCaption() const
+{
+ return StyleDisplay()->mDisplay == mozilla::StyleDisplay::TableCaption &&
+ GetParent()->StyleContext()->GetPseudo() == nsCSSAnonBoxes::tableWrapper;
+}
+
+bool
+nsIFrame::IsFloating() const
+{
+ return StyleDisplay()->IsFloating(this);
+}
+
+bool
+nsIFrame::IsAbsPosContainingBlock() const
+{
+ return StyleDisplay()->IsAbsPosContainingBlock(this);
+}
+
+bool
+nsIFrame::IsFixedPosContainingBlock() const
+{
+ return StyleDisplay()->IsFixedPosContainingBlock(this);
+}
+
+bool
+nsIFrame::IsRelativelyPositioned() const
+{
+ return StyleDisplay()->IsRelativelyPositioned(this);
+}
+
+bool
+nsIFrame::IsAbsolutelyPositioned() const
+{
+ return StyleDisplay()->IsAbsolutelyPositioned(this);
+}
+
+bool
+nsIFrame::IsBlockInside() const
+{
+ return StyleDisplay()->IsBlockInside(this);
+}
+
+bool
+nsIFrame::IsBlockOutside() const
+{
+ return StyleDisplay()->IsBlockOutside(this);
+}
+
+bool
+nsIFrame::IsInlineOutside() const
+{
+ return StyleDisplay()->IsInlineOutside(this);
+}
+
+mozilla::StyleDisplay
+nsIFrame::GetDisplay() const
+{
+ return StyleDisplay()->GetDisplay(this);
+}
+
+nscoord
+nsIFrame::SynthesizeBaselineBOffsetFromMarginBox(
+ mozilla::WritingMode aWM,
+ BaselineSharingGroup aGroup) const
+{
+ MOZ_ASSERT(!aWM.IsOrthogonalTo(GetWritingMode()));
+ auto margin = GetLogicalUsedMargin(aWM);
+ if (aGroup == BaselineSharingGroup::eFirst) {
+ if (aWM.IsAlphabeticalBaseline()) {
+ // First baseline for inverted-line content is the block-start margin edge,
+ // as the frame is in effect "flipped" for alignment purposes.
+ return MOZ_UNLIKELY(aWM.IsLineInverted()) ? -margin.BStart(aWM)
+ : BSize(aWM) + margin.BEnd(aWM);
+ }
+ nscoord marginBoxCenter = (BSize(aWM) + margin.BStartEnd(aWM)) / 2;
+ return marginBoxCenter - margin.BStart(aWM);
+ }
+ MOZ_ASSERT(aGroup == BaselineSharingGroup::eLast);
+ if (aWM.IsAlphabeticalBaseline()) {
+ // Last baseline for inverted-line content is the block-start margin edge,
+ // as the frame is in effect "flipped" for alignment purposes.
+ return MOZ_UNLIKELY(aWM.IsLineInverted()) ? BSize(aWM) + margin.BStart(aWM)
+ : -margin.BEnd(aWM);
+ }
+ // Round up for central baseline offset, to be consistent with eFirst.
+ nscoord marginBoxSize = BSize(aWM) + margin.BStartEnd(aWM);
+ nscoord marginBoxCenter = (marginBoxSize / 2) + (marginBoxSize % 2);
+ return marginBoxCenter - margin.BEnd(aWM);
+}
+
+nscoord
+nsIFrame::SynthesizeBaselineBOffsetFromBorderBox(
+ mozilla::WritingMode aWM,
+ BaselineSharingGroup aGroup) const
+{
+ MOZ_ASSERT(!aWM.IsOrthogonalTo(GetWritingMode()));
+ nscoord borderBoxSize = BSize(aWM);
+ if (aGroup == BaselineSharingGroup::eFirst) {
+ return MOZ_LIKELY(aWM.IsAlphabeticalBaseline()) ? borderBoxSize
+ : borderBoxSize / 2;
+ }
+ MOZ_ASSERT(aGroup == BaselineSharingGroup::eLast);
+ // Round up for central baseline offset, to be consistent with eFirst.
+ auto borderBoxCenter = (borderBoxSize / 2) + (borderBoxSize % 2);
+ return MOZ_LIKELY(aWM.IsAlphabeticalBaseline()) ? 0 : borderBoxCenter;
+}
+
+nscoord
+nsIFrame::BaselineBOffset(mozilla::WritingMode aWM,
+ BaselineSharingGroup aBaselineGroup,
+ AlignmentContext aAlignmentContext) const
+{
+ MOZ_ASSERT(!aWM.IsOrthogonalTo(GetWritingMode()));
+ nscoord baseline;
+ if (GetNaturalBaselineBOffset(aWM, aBaselineGroup, &baseline)) {
+ return baseline;
+ }
+ if (aAlignmentContext == AlignmentContext::eInline) {
+ return SynthesizeBaselineBOffsetFromMarginBox(aWM, aBaselineGroup);
+ }
+ // XXX AlignmentContext::eTable should use content box?
+ return SynthesizeBaselineBOffsetFromBorderBox(aWM, aBaselineGroup);
+}
+
+#endif