2013-08-25 11:19:43 +04:00
|
|
|
/* -*- 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/. */
|
|
|
|
|
2015-05-15 06:52:05 +03:00
|
|
|
#ifndef mozilla_image_OrientedImage_h
|
|
|
|
#define mozilla_image_OrientedImage_h
|
2013-08-25 11:19:43 +04:00
|
|
|
|
|
|
|
#include "ImageWrapper.h"
|
2014-04-15 22:02:23 +04:00
|
|
|
#include "mozilla/gfx/2D.h"
|
2015-10-18 08:24:48 +03:00
|
|
|
#include "mozilla/RefPtr.h"
|
2013-08-25 11:19:43 +04:00
|
|
|
#include "Orientation.h"
|
|
|
|
|
|
|
|
namespace mozilla {
|
|
|
|
namespace image {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* An Image wrapper that rotates and/or flips an image according to a specified
|
|
|
|
* Orientation.
|
|
|
|
*
|
|
|
|
* XXX(seth): There a known (performance, not correctness) issue with
|
|
|
|
* GetImageContainer. See the comments for that method for more information.
|
|
|
|
*/
|
|
|
|
class OrientedImage : public ImageWrapper {
|
2014-07-10 19:00:31 +04:00
|
|
|
typedef gfx::SourceSurface SourceSurface;
|
2014-04-15 22:02:23 +04:00
|
|
|
|
2013-08-25 11:19:43 +04:00
|
|
|
public:
|
2018-02-12 23:44:40 +03:00
|
|
|
NS_INLINE_DECL_REFCOUNTING_INHERITED(OrientedImage, ImageWrapper)
|
2013-08-25 11:19:43 +04:00
|
|
|
|
2015-03-21 19:28:04 +03:00
|
|
|
NS_IMETHOD GetWidth(int32_t* aWidth) override;
|
|
|
|
NS_IMETHOD GetHeight(int32_t* aHeight) override;
|
2022-07-06 17:53:06 +03:00
|
|
|
nsresult GetNativeSizes(nsTArray<gfx::IntSize>& aNativeSizes) override;
|
2015-03-21 19:28:04 +03:00
|
|
|
NS_IMETHOD GetIntrinsicSize(nsSize* aSize) override;
|
2019-05-03 02:28:21 +03:00
|
|
|
Maybe<AspectRatio> GetIntrinsicRatio() override;
|
2015-06-17 17:00:52 +03:00
|
|
|
NS_IMETHOD_(already_AddRefed<SourceSurface>)
|
2015-03-21 19:28:04 +03:00
|
|
|
GetFrame(uint32_t aWhichFrame, uint32_t aFlags) override;
|
2015-09-19 23:34:09 +03:00
|
|
|
NS_IMETHOD_(already_AddRefed<SourceSurface>)
|
|
|
|
GetFrameAtSize(const gfx::IntSize& aSize, uint32_t aWhichFrame,
|
|
|
|
uint32_t aFlags) override;
|
2015-05-13 10:23:44 +03:00
|
|
|
NS_IMETHOD_(bool)
|
2021-09-06 01:36:45 +03:00
|
|
|
IsImageContainerAvailable(WindowRenderer* aRenderer,
|
2015-05-13 10:23:44 +03:00
|
|
|
uint32_t aFlags) override;
|
2018-09-14 02:48:21 +03:00
|
|
|
NS_IMETHOD_(ImgDrawResult)
|
2021-11-27 14:47:36 +03:00
|
|
|
GetImageProvider(WindowRenderer* aRenderer, const gfx::IntSize& aSize,
|
2022-07-14 19:03:25 +03:00
|
|
|
const SVGImageContext& aSVGContext,
|
2021-11-27 14:47:36 +03:00
|
|
|
const Maybe<ImageIntRegion>& aRegion, uint32_t aFlags,
|
|
|
|
WebRenderImageProvider** aProvider) override;
|
|
|
|
NS_IMETHOD_(ImgDrawResult)
|
2017-12-11 18:37:59 +03:00
|
|
|
Draw(gfxContext* aContext, const nsIntSize& aSize, const ImageRegion& aRegion,
|
2016-05-25 19:01:18 +03:00
|
|
|
uint32_t aWhichFrame, gfx::SamplingFilter aSamplingFilter,
|
2022-07-14 19:03:25 +03:00
|
|
|
const SVGImageContext& aSVGContext, uint32_t aFlags,
|
2017-01-03 08:53:22 +03:00
|
|
|
float aOpacity) override;
|
2014-12-06 02:58:00 +03:00
|
|
|
NS_IMETHOD_(nsIntRect)
|
|
|
|
GetImageSpaceInvalidationRect(const nsIntRect& aRect) override;
|
2014-07-29 01:27:40 +04:00
|
|
|
nsIntSize OptimalImageSizeForDest(const gfxSize& aDest, uint32_t aWhichFrame,
|
2016-05-25 19:01:18 +03:00
|
|
|
gfx::SamplingFilter aSamplingFilter,
|
2015-03-21 19:28:04 +03:00
|
|
|
uint32_t aFlags) override;
|
2014-12-06 02:58:00 +03:00
|
|
|
|
2020-04-17 05:57:20 +03:00
|
|
|
/**
|
|
|
|
* Computes a matrix that applies the rotation and reflection specified by
|
|
|
|
* aOrientation, or that matrix's inverse if aInvert is true.
|
|
|
|
*
|
|
|
|
* @param aSize The scaled size of the inner image. (When outside code
|
|
|
|
* specifies the scaled size, as with imgIContainer::Draw and its aSize
|
|
|
|
* parameter, it's necessary to swap the width and height if
|
|
|
|
* mOrientation.SwapsWidthAndHeight() is true.)
|
|
|
|
*
|
|
|
|
* @param aInvert If true, compute the inverse of the orientation matrix.
|
|
|
|
* Prefer this approach to OrientationMatrix(..).Invert(), because it's more
|
|
|
|
* numerically accurate.
|
|
|
|
*/
|
|
|
|
static gfxMatrix OrientationMatrix(Orientation aOrientation,
|
|
|
|
const nsIntSize& aSize,
|
|
|
|
bool aInvert = false);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns a SourceSurface that is the result of rotating and flipping
|
|
|
|
* aSurface according to aOrientation.
|
|
|
|
*/
|
|
|
|
static already_AddRefed<SourceSurface> OrientSurface(Orientation aOrientation,
|
2020-04-17 05:57:22 +03:00
|
|
|
SourceSurface* aSurface);
|
2020-04-17 05:57:20 +03:00
|
|
|
|
2013-08-25 11:19:43 +04:00
|
|
|
protected:
|
|
|
|
OrientedImage(Image* aImage, Orientation aOrientation)
|
|
|
|
: ImageWrapper(aImage), mOrientation(aOrientation) {}
|
|
|
|
|
2014-06-23 22:49:08 +04:00
|
|
|
virtual ~OrientedImage() {}
|
|
|
|
|
2020-04-17 05:57:20 +03:00
|
|
|
gfxMatrix OrientationMatrix(const nsIntSize& aSize, bool aInvert = false) {
|
|
|
|
return OrientationMatrix(mOrientation, aSize, aInvert);
|
|
|
|
}
|
2013-08-25 11:19:43 +04:00
|
|
|
|
|
|
|
private:
|
|
|
|
Orientation mOrientation;
|
|
|
|
|
|
|
|
friend class ImageOps;
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace image
|
|
|
|
} // namespace mozilla
|
|
|
|
|
2015-05-15 06:52:05 +03:00
|
|
|
#endif // mozilla_image_OrientedImage_h
|