gecko-dev/dom/canvas/ImageBitmapRenderingContext.h
Nathan Froyd ebdc4b2408 Bug 1542344 - fix API mismatches in ImageEncoder; r=mccr8
ImageEncoder::ExtractDataInternal takes a `const nsAString&` for its
options, but flattens it into a null-terminated `nsString` so callees
can take a `char16_t*`.  But nearly all of those callees eventually wind
up calling ImageEncoder::GetInputStream, which just constructs an
`nsDependentString` from the passed character pointer.

There's no reason to do all this extra work.  We can just pass the
original options reference all the way through the stack and avoid
needless conversions.

Differential Revision: https://phabricator.services.mozilla.com/D26353

--HG--
extra : moz-landing-system : lando
2019-04-08 01:51:17 +00:00

100 lines
3.1 KiB
C++

/* 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 ImageBitmapRenderingContext_h
#define ImageBitmapRenderingContext_h
#include "nsICanvasRenderingContextInternal.h"
#include "nsWrapperCache.h"
namespace mozilla {
namespace gfx {
class DataSourceSurface;
class DrawTarget;
class SourceSurface;
} // namespace gfx
namespace layers {
class Image;
class ImageContainer;
} // namespace layers
namespace dom {
/**
* The purpose of ImageBitmapRenderingContext is to provide a faster and
* efficient way to display ImageBitmap. Simply call TransferFromImageBitmap()
* then we'll transfer the surface of ImageBitmap to this context and then to
* use it to display.
*
* See more details in spec: https://wiki.whatwg.org/wiki/OffscreenCanvas
*/
class ImageBitmapRenderingContext final
: public nsICanvasRenderingContextInternal,
public nsWrapperCache {
virtual ~ImageBitmapRenderingContext();
public:
ImageBitmapRenderingContext();
virtual JSObject* WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto) override;
// nsISupports interface + CC
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(ImageBitmapRenderingContext)
void TransferImageBitmap(ImageBitmap& aImageBitmap);
void TransferFromImageBitmap(ImageBitmap& aImageBitmap);
// nsICanvasRenderingContextInternal
virtual int32_t GetWidth() override { return mWidth; }
virtual int32_t GetHeight() override { return mHeight; }
NS_IMETHOD SetDimensions(int32_t aWidth, int32_t aHeight) override;
NS_IMETHOD InitializeWithDrawTarget(
nsIDocShell* aDocShell, NotNull<gfx::DrawTarget*> aTarget) override;
virtual mozilla::UniquePtr<uint8_t[]> GetImageBuffer(
int32_t* aFormat) override;
NS_IMETHOD GetInputStream(const char* aMimeType,
const nsAString& aEncoderOptions,
nsIInputStream** aStream) override;
virtual already_AddRefed<mozilla::gfx::SourceSurface> GetSurfaceSnapshot(
gfxAlphaType* aOutAlphaType) override;
virtual void SetOpaqueValueFromOpaqueAttr(bool aOpaqueAttrValue) override;
virtual bool GetIsOpaque() override;
NS_IMETHOD Reset() override;
virtual already_AddRefed<Layer> GetCanvasLayer(
nsDisplayListBuilder* aBuilder, Layer* aOldLayer,
LayerManager* aManager) override;
virtual void MarkContextClean() override;
NS_IMETHOD Redraw(const gfxRect& aDirty) override;
NS_IMETHOD SetIsIPC(bool aIsIPC) override;
virtual void DidRefresh() override;
virtual void MarkContextCleanForFrameCapture() override;
virtual bool IsContextCleanForFrameCapture() override;
protected:
already_AddRefed<gfx::DataSourceSurface> MatchWithIntrinsicSize();
already_AddRefed<layers::Image> ClipToIntrinsicSize();
int32_t mWidth;
int32_t mHeight;
RefPtr<layers::Image> mImage;
};
} // namespace dom
} // namespace mozilla
#endif /* ImageBitmapRenderingContext_h */