Blame layout/svg/nsSVGPaintServerFrame.h

Packit f0b94e
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
Packit f0b94e
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
Packit f0b94e
/* This Source Code Form is subject to the terms of the Mozilla Public
Packit f0b94e
 * License, v. 2.0. If a copy of the MPL was not distributed with this
Packit f0b94e
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
Packit f0b94e
Packit f0b94e
#ifndef __NS_SVGPAINTSERVERFRAME_H__
Packit f0b94e
#define __NS_SVGPAINTSERVERFRAME_H__
Packit f0b94e
Packit f0b94e
#include "gfxRect.h"
Packit f0b94e
#include "mozilla/Attributes.h"
Packit f0b94e
#include "nsCOMPtr.h"
Packit f0b94e
#include "nsFrame.h"
Packit f0b94e
#include "nsIFrame.h"
Packit f0b94e
#include "nsQueryFrame.h"
Packit f0b94e
#include "nsSVGContainerFrame.h"
Packit f0b94e
#include "nsSVGUtils.h"
Packit f0b94e
Packit f0b94e
namespace mozilla {
Packit f0b94e
namespace gfx {
Packit f0b94e
class DrawTarget;
Packit f0b94e
}  // namespace gfx
Packit f0b94e
}  // namespace mozilla
Packit f0b94e
Packit f0b94e
class gfxContext;
Packit f0b94e
class gfxPattern;
Packit f0b94e
class nsStyleContext;
Packit f0b94e
Packit f0b94e
/**
Packit f0b94e
 * RAII class used to temporarily set and remove the
Packit f0b94e
 * NS_FRAME_DRAWING_AS_PAINTSERVER frame state bit while a frame is being
Packit f0b94e
 * drawn as a paint server.
Packit f0b94e
 */
Packit f0b94e
class MOZ_RAII AutoSetRestorePaintServerState {
Packit f0b94e
 public:
Packit f0b94e
  explicit AutoSetRestorePaintServerState(
Packit f0b94e
      nsIFrame* aFrame MOZ_GUARD_OBJECT_NOTIFIER_PARAM)
Packit f0b94e
      : mFrame(aFrame) {
Packit f0b94e
    MOZ_GUARD_OBJECT_NOTIFIER_INIT;
Packit f0b94e
    mFrame->AddStateBits(NS_FRAME_DRAWING_AS_PAINTSERVER);
Packit f0b94e
  }
Packit f0b94e
  ~AutoSetRestorePaintServerState() {
Packit f0b94e
    mFrame->RemoveStateBits(NS_FRAME_DRAWING_AS_PAINTSERVER);
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
 private:
Packit f0b94e
  nsIFrame* mFrame;
Packit f0b94e
  MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
Packit f0b94e
};
Packit f0b94e
Packit f0b94e
class nsSVGPaintServerFrame : public nsSVGContainerFrame {
Packit f0b94e
 protected:
Packit f0b94e
  typedef mozilla::gfx::DrawTarget DrawTarget;
Packit f0b94e
Packit f0b94e
  nsSVGPaintServerFrame(nsStyleContext* aContext, ClassID aID)
Packit f0b94e
      : nsSVGContainerFrame(aContext, aID) {
Packit f0b94e
    AddStateBits(NS_FRAME_IS_NONDISPLAY);
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
 public:
Packit f0b94e
  typedef mozilla::image::imgDrawingParams imgDrawingParams;
Packit f0b94e
Packit f0b94e
  NS_DECL_ABSTRACT_FRAME(nsSVGPaintServerFrame)
Packit f0b94e
Packit f0b94e
  /**
Packit f0b94e
   * Constructs a gfxPattern of the paint server rendering.
Packit f0b94e
   *
Packit f0b94e
   * @param aContextMatrix The transform matrix that is currently applied to
Packit f0b94e
   *   the gfxContext that is being drawn to. This is needed by SVG patterns so
Packit f0b94e
   *   that surfaces of the correct size can be created. (SVG gradients are
Packit f0b94e
   *   vector based, so it's not used there.)
Packit f0b94e
   */
Packit f0b94e
  virtual already_AddRefed<gfxPattern> GetPaintServerPattern(
Packit f0b94e
      nsIFrame* aSource, const DrawTarget* aDrawTarget,
Packit f0b94e
      const gfxMatrix& aContextMatrix,
Packit f0b94e
      nsStyleSVGPaint nsStyleSVG::*aFillOrStroke, float aOpacity,
Packit f0b94e
      imgDrawingParams& aImgParams,
Packit f0b94e
      const gfxRect* aOverrideBounds = nullptr) = 0;
Packit f0b94e
Packit f0b94e
  // nsIFrame methods:
Packit f0b94e
  virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
Packit f0b94e
                                const nsDisplayListSet& aLists) override {}
Packit f0b94e
Packit f0b94e
  virtual bool IsFrameOfType(uint32_t aFlags) const override {
Packit f0b94e
    return nsSVGContainerFrame::IsFrameOfType(aFlags &
Packit f0b94e
                                              ~nsIFrame::eSVGPaintServer);
Packit f0b94e
  }
Packit f0b94e
};
Packit f0b94e
Packit f0b94e
#endif  // __NS_SVGPAINTSERVERFRAME_H__