summaryrefslogtreecommitdiffstats
path: root/dom/canvas/ImageBitmapRenderingContext.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/canvas/ImageBitmapRenderingContext.h')
-rw-r--r--dom/canvas/ImageBitmapRenderingContext.h98
1 files changed, 98 insertions, 0 deletions
diff --git a/dom/canvas/ImageBitmapRenderingContext.h b/dom/canvas/ImageBitmapRenderingContext.h
new file mode 100644
index 000000000..0a72aa427
--- /dev/null
+++ b/dom/canvas/ImageBitmapRenderingContext.h
@@ -0,0 +1,98 @@
+/* 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 layers {
+class Image;
+class ImageContainer;
+}
+
+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() const override;
+ virtual int32_t GetHeight() const override;
+
+ 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 char16_t* aEncoderOptions,
+ nsIInputStream** aStream) override;
+
+ virtual already_AddRefed<mozilla::gfx::SourceSurface>
+ GetSurfaceSnapshot(bool* aPremultAlpha = nullptr) override;
+
+ NS_IMETHOD SetIsOpaque(bool aIsOpaque) override;
+ virtual bool GetIsOpaque() override;
+ NS_IMETHOD Reset() override;
+ virtual already_AddRefed<Layer> GetCanvasLayer(nsDisplayListBuilder* aBuilder,
+ Layer* aOldLayer,
+ LayerManager* aManager,
+ bool aMirror = false) 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;
+};
+
+}
+}
+
+#endif /* ImageBitmapRenderingContext_h */