Files
firefox/layout/mathml/nsMathMLmoFrame.h
T
Frédéric Wang 8a08b8f2c0 Bug 1908069 - Introduce PlaceFlags parameter to MathML layout methods. r=emilio
MathML classes has a few Place*() methods  used for layout and intrinsic
size calculation. These methods have a parameter "aPlaceOrigin"
indicating whether the children and other painted objects should have
their final positions set, or if the method is only called for measuring.
This parameter is typically set to false when doing intrinsic size
calculation or when performing some non-final measurement for operator
stretching.

For intrinsic size calculation, it is generally enough to perform
placement with aPlaceOrigin=false and ignoring the vertical metrics.
Some Place*() methods also have a parameter "aWidthOnly" for special
handling. For example, msqrt stretches a radical symbol vertically to
match the height of the content but when doing intrinsic size
calculation this is approximated to nsMathMLChar::GetMaxWidth() instead.
When we implement border/padding/margin we should also be able to
choose between using IntrinsicISizeOffsets() or GetUsed*() methods.

Finally, some Place*() methods initially call a place routing of a
parent class before further tweaking the layout. For example, msqrt
uses mrow layout on children and adds some radical symbol on top of
them. When we implement border/padding, we should make sure we don't
add the border/padding before the final result.

In order to handle all these placement behaviors, a new EnumSet is
introduced. This commit does not change behavior. Handling of padding,
border and margin will be handled in follow-up patches.

Differential Revision: https://phabricator.services.mozilla.com/D216669
2024-08-07 06:00:43 +00:00

101 lines
3.2 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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 nsMathMLmoFrame_h___
#define nsMathMLmoFrame_h___
#include "mozilla/Attributes.h"
#include "nsMathMLTokenFrame.h"
#include "nsMathMLChar.h"
namespace mozilla {
class PresShell;
} // namespace mozilla
//
// <mo> -- operator, fence, or separator
//
class nsMathMLmoFrame final : public nsMathMLTokenFrame {
public:
NS_DECL_FRAMEARENA_HELPERS(nsMathMLmoFrame)
friend nsIFrame* NS_NewMathMLmoFrame(mozilla::PresShell* aPresShell,
ComputedStyle* aStyle);
eMathMLFrameType GetMathMLFrameType() override;
void DidSetComputedStyle(ComputedStyle* aOldStyle) override;
void BuildDisplayList(nsDisplayListBuilder* aBuilder,
const nsDisplayListSet& aLists) override;
NS_IMETHOD
InheritAutomaticData(nsIFrame* aParent) override;
NS_IMETHOD
TransmitAutomaticData() override;
void SetInitialChildList(ChildListID aListID,
nsFrameList&& aChildList) override;
virtual void Reflow(nsPresContext* aPresContext, ReflowOutput& aDesiredSize,
const ReflowInput& aReflowInput,
nsReflowStatus& aStatus) override;
nsresult Place(DrawTarget* aDrawTarget, const PlaceFlags& aFlags,
ReflowOutput& aDesiredSize) override;
virtual void MarkIntrinsicISizesDirty() override;
virtual void GetIntrinsicISizeMetrics(gfxContext* aRenderingContext,
ReflowOutput& aDesiredSize) override;
virtual nsresult AttributeChanged(int32_t aNameSpaceID, nsAtom* aAttribute,
int32_t aModType) override;
// This method is called by the parent frame to ask <mo>
// to stretch itself.
NS_IMETHOD
Stretch(DrawTarget* aDrawTarget, nsStretchDirection aStretchDirection,
nsBoundingMetrics& aContainerSize,
ReflowOutput& aDesiredStretchSize) override;
virtual nsresult ChildListChanged(int32_t aModType) override {
ProcessTextData();
return nsMathMLContainerFrame::ChildListChanged(aModType);
}
protected:
explicit nsMathMLmoFrame(ComputedStyle* aStyle, nsPresContext* aPresContext)
: nsMathMLTokenFrame(aStyle, aPresContext, kClassID),
mFlags(0),
mMinSize(0),
mMaxSize(0) {}
virtual ~nsMathMLmoFrame();
nsMathMLChar
mMathMLChar; // Here is the MathMLChar that will deal with the operator.
nsOperatorFlags mFlags;
float mMinSize;
float mMaxSize;
bool UseMathMLChar();
// overload the base method so that we can setup our nsMathMLChar
void ProcessTextData();
// helper to get our 'form' and lookup in the Operator Dictionary to fetch
// our default data that may come from there, and to complete the setup
// using attributes that we may have
void ProcessOperatorData();
// helper to double check thar our char should be rendered as a selected char
bool IsFrameInSelection(nsIFrame* aFrame);
};
#endif /* nsMathMLmoFrame_h___ */