image/ClippedImage.h
author cku <cku@mozilla.com>
Thu, 18 May 2017 22:03:41 +0200
changeset 359088 bbf16eb4f821b2d535826141f9f33f3eb49a54c6
parent 328029 04689bf3a1f2edc7956e203b599a154a4e7ba026
child 392470 0cd5200c5f768b8d10ef23ac8986003c0c71375b
permissions -rw-r--r--
Bug 1351440 - Part 2. Encapsulate DrawResult and imgIContainer::FLAG_* into imgDrawingParams, and pass it to PaintSVG. r=jwatt The DrawResult return was not in fact anything to do with the success or failure of that method, but was actually passing out a very specific piece of information about the success or failure of any imagelib drawing that may not have occurred under the various PaintSVG calls. The signature of PaintSVG is changed from DrawResult PaintSVG(...., uint32 flags); to void PaintSVG(...., imgDrawingParams& aPackage); imgDrawingParams wraps DrawResult and imgIContainer::FLAG_* as a pack, pass through PaintSVG to imagelib draw calls under beneath. MozReview-Commit-ID: IOq2evUAOQF

/* -*- 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 mozilla_image_ClippedImage_h
#define mozilla_image_ClippedImage_h

#include "ImageWrapper.h"
#include "mozilla/gfx/2D.h"
#include "mozilla/Maybe.h"
#include "mozilla/RefPtr.h"
#include "mozilla/UniquePtr.h"

namespace mozilla {
namespace image {

class ClippedImageCachedSurface;
class DrawSingleTileCallback;

/**
 * An Image wrapper that clips an image against a rectangle. Right now only
 * absolute coordinates in pixels are supported.
 *
 * XXX(seth): There a known (performance, not correctness) issue with
 * GetImageContainer. See the comments for that method for more information.
 */
class ClippedImage : public ImageWrapper
{
  typedef gfx::SourceSurface SourceSurface;

public:
  NS_DECL_ISUPPORTS_INHERITED

  NS_IMETHOD GetWidth(int32_t* aWidth) override;
  NS_IMETHOD GetHeight(int32_t* aHeight) override;
  NS_IMETHOD GetIntrinsicSize(nsSize* aSize) override;
  NS_IMETHOD GetIntrinsicRatio(nsSize* aRatio) override;
  NS_IMETHOD_(already_AddRefed<SourceSurface>)
    GetFrame(uint32_t aWhichFrame, uint32_t aFlags) override;
  NS_IMETHOD_(already_AddRefed<SourceSurface>)
    GetFrameAtSize(const gfx::IntSize& aSize,
                   uint32_t aWhichFrame,
                   uint32_t aFlags) override;
  NS_IMETHOD_(bool) IsImageContainerAvailable(layers::LayerManager* aManager,
                                              uint32_t aFlags) override;
  NS_IMETHOD_(already_AddRefed<layers::ImageContainer>)
    GetImageContainer(layers::LayerManager* aManager,
                      uint32_t aFlags) override;
  NS_IMETHOD_(DrawResult) Draw(gfxContext* aContext,
                               const nsIntSize& aSize,
                               const ImageRegion& aRegion,
                               uint32_t aWhichFrame,
                               gfx::SamplingFilter aSamplingFilter,
                               const Maybe<SVGImageContext>& aSVGContext,
                               uint32_t aFlags,
                               float aOpacity) override;
  NS_IMETHOD RequestDiscard() override;
  NS_IMETHOD_(Orientation) GetOrientation() override;
  NS_IMETHOD_(nsIntRect) GetImageSpaceInvalidationRect(const nsIntRect& aRect)
    override;
  nsIntSize OptimalImageSizeForDest(const gfxSize& aDest,
                                    uint32_t aWhichFrame,
                                    gfx::SamplingFilter aSamplingFilter,
                                    uint32_t aFlags) override;

protected:
  ClippedImage(Image* aImage, nsIntRect aClip,
               const Maybe<nsSize>& aSVGViewportSize);

  virtual ~ClippedImage();

private:
  Pair<DrawResult, RefPtr<SourceSurface>>
    GetFrameInternal(const nsIntSize& aSize,
                     const Maybe<SVGImageContext>& aSVGContext,
                     uint32_t aWhichFrame,
                     uint32_t aFlags,
                     float aOpacity);
  bool ShouldClip();
  DrawResult DrawSingleTile(gfxContext* aContext,
                            const nsIntSize& aSize,
                            const ImageRegion& aRegion,
                            uint32_t aWhichFrame,
                            gfx::SamplingFilter aSamplingFilter,
                            const Maybe<SVGImageContext>& aSVGContext,
                            uint32_t aFlags,
                            float aOpacity);

  // If we are forced to draw a temporary surface, we cache it here.
  UniquePtr<ClippedImageCachedSurface> mCachedSurface;

  nsIntRect        mClip;            // The region to clip to.
  Maybe<bool>      mShouldClip;      // Memoized ShouldClip() if present.
  Maybe<nsIntSize> mSVGViewportSize; // If we're clipping a VectorImage, this
                                     // is the size of viewport of that image.
  friend class DrawSingleTileCallback;
  friend class ImageOps;
};

} // namespace image
} // namespace mozilla

#endif // mozilla_image_ClippedImage_h