layout/mathml/nsMathMLmfencedFrame.h
author Wes Kocher <wkocher@mozilla.com>
Wed, 26 Jul 2017 15:30:17 -0700
changeset 422306 ab2472a1042bb5fbd0140ada5a972411b3f32494
parent 421793 6765c694080c0d2dea8eb11d7ea22b1175a29fdd
child 425922 8f2dd8f13b53a5b4d114204f0bf0650a320da3fb
permissions -rw-r--r--
Backed out changeset adb09e2d7a30 (bug 1359912) for breaking linux noopt debug builds a=backout MozReview-Commit-ID: E1treEAWecM

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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 nsMathMLmfencedFrame_h
#define nsMathMLmfencedFrame_h

#include "mozilla/Attributes.h"
#include "nsMathMLContainerFrame.h"

class nsFontMetrics;

//
// <mfenced> -- surround content with a pair of fences
//

class nsMathMLmfencedFrame final : public nsMathMLContainerFrame {
public:
  NS_DECL_FRAMEARENA_HELPERS(nsMathMLmfencedFrame)

  friend nsIFrame* NS_NewMathMLmfencedFrame(nsIPresShell* aPresShell, nsStyleContext* aContext);

  virtual void
  SetAdditionalStyleContext(int32_t          aIndex,
                            nsStyleContext*  aStyleContext) override;
  virtual nsStyleContext*
  GetAdditionalStyleContext(int32_t aIndex) const override;

  NS_IMETHOD
  InheritAutomaticData(nsIFrame* aParent) override;

  virtual void
  SetInitialChildList(ChildListID     aListID,
                      nsFrameList&    aChildList) override;

  virtual void
  Reflow(nsPresContext*          aPresContext,
         ReflowOutput&     aDesiredSize,
         const ReflowInput& aReflowInput,
         nsReflowStatus&          aStatus) override;

  virtual void BuildDisplayList(nsDisplayListBuilder*   aBuilder,
                                const nsRect&           aDirtyRect,
                                const nsDisplayListSet& aLists) override;

  virtual void
  GetIntrinsicISizeMetrics(gfxContext* aRenderingContext,
                           ReflowOutput& aDesiredSize) override;

  virtual nsresult
  AttributeChanged(int32_t         aNameSpaceID,
                   nsIAtom*        aAttribute,
                   int32_t         aModType) override;

  // override the base method because we must keep separators in sync
  virtual nsresult
  ChildListChanged(int32_t aModType) override;

  // override the base method so that we can deal with fences and separators
  virtual nscoord
  FixInterFrameSpacing(ReflowOutput& aDesiredSize) override;

  // helper routines to format the MathMLChars involved here
  nsresult
  ReflowChar(DrawTarget*          aDrawTarget,
             nsFontMetrics&       aFontMetrics,
             float                aFontSizeInflation,
             nsMathMLChar*        aMathMLChar,
             nsOperatorFlags      aForm,
             int32_t              aScriptLevel,
             nscoord              axisHeight,
             nscoord              leading,
             nscoord              em,
             nsBoundingMetrics&   aContainerSize,
             nscoord&             aAscent,
             nscoord&             aDescent,
             bool                 aRTL);

  static void
  PlaceChar(nsMathMLChar*      aMathMLChar,
            nscoord            aDesiredSize,
            nsBoundingMetrics& bm,
            nscoord&           dx);

  virtual bool
  IsMrowLike() override
  {
    // Always treated as an mrow with > 1 child as
    // <mfenced> <mo>%</mo> </mfenced>
    // renders equivalently to
    // <mrow> <mo> ( </mo> <mo>%</mo> <mo> ) </mo> </mrow>
    // This also holds with multiple children.  (MathML3 3.3.8.1)
    return true;
  }

protected:
  explicit nsMathMLmfencedFrame(nsStyleContext* aContext)
    : nsMathMLContainerFrame(aContext, kClassID)
    , mOpenChar(nullptr)
    , mCloseChar(nullptr)
    , mSeparatorsChar(nullptr)
    , mSeparatorsCount(0)
  {}

  virtual ~nsMathMLmfencedFrame();

  nsMathMLChar* mOpenChar;
  nsMathMLChar* mCloseChar;
  nsMathMLChar* mSeparatorsChar;
  int32_t       mSeparatorsCount;

  // clean up
  void
  RemoveFencesAndSeparators();

  // add fences and separators when all child frames are known
  void
  CreateFencesAndSeparators(nsPresContext* aPresContext);
};

#endif /* nsMathMLmfencedFrame_h */