diff tests/4e1a3919e741.diff @ 12:a0ff003319ec

foo
author Jeff Hammel <jhammel@mozilla.com>
date Sat, 28 Sep 2013 06:40:25 -0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/4e1a3919e741.diff	Sat Sep 28 06:40:25 2013 -0700
@@ -0,0 +1,1005 @@
+
+# HG changeset patch
+# User Nicholas Cameron <ncameron@mozilla.com>
+# Date 1380242239 -43200
+# Node ID 4e1a3919e741eb8e3a4f520535671df9711b5b9b
+# Parent  a11f8859f7d84ed1a7ab3596c9242074a8a4dc35
+Bug 882113. Azurification of compositor classes. r=mattwoodrow
+
+diff --git a/gfx/gl/GLContext.cpp b/gfx/gl/GLContext.cpp
+--- a/gfx/gl/GLContext.cpp
++++ b/gfx/gl/GLContext.cpp
+@@ -2080,16 +2080,33 @@ GetActualReadFormats(GLContext* gl, GLen
+ void
+ GLContext::ReadScreenIntoImageSurface(gfxImageSurface* dest)
+ {
+     ScopedBindFramebuffer autoFB(this, 0);
+ 
+     ReadPixelsIntoImageSurface(dest);
+ }
+ 
++TemporaryRef<SourceSurface>
++GLContext::ReadPixelsToSourceSurface(const gfx::IntSize &aSize)
++{
++    // XXX we should do this properly one day without using the gfxImageSurface
++    RefPtr<DataSourceSurface> dataSourceSurface =
++        Factory::CreateDataSourceSurface(aSize, gfx::FORMAT_B8G8R8A8);
++    nsRefPtr<gfxImageSurface> surf =
++        new gfxImageSurface(dataSourceSurface->GetData(),
++                            gfxIntSize(aSize.width, aSize.height),
++                            dataSourceSurface->Stride(),
++                            gfxImageFormatARGB32);
++    ReadPixelsIntoImageSurface(surf);
++    dataSourceSurface->MarkDirty();
++
++    return dataSourceSurface;
++}
++
+ void
+ GLContext::ReadPixelsIntoImageSurface(gfxImageSurface* dest)
+ {
+     MakeCurrent();
+     MOZ_ASSERT(dest->GetSize() != gfxIntSize(0, 0));
+ 
+     /* gfxImageFormatARGB32:
+      * RGBA+UByte: be[RGBA], le[ABGR]
+diff --git a/gfx/gl/GLContext.h b/gfx/gl/GLContext.h
+--- a/gfx/gl/GLContext.h
++++ b/gfx/gl/GLContext.h
+@@ -47,16 +47,17 @@ class nsIThread;
+ 
+ namespace android {
+     class GraphicBuffer;
+ }
+ 
+ namespace mozilla {
+     namespace gfx {
+         class SharedSurface;
++        class SourceSurface;
+         class DataSourceSurface;
+         struct SurfaceCaps;
+     }
+ 
+     namespace gl {
+         class GLContext;
+         class GLLibraryEGL;
+         class GLScreenBuffer;
+@@ -2696,16 +2697,18 @@ public:
+      * ReadScreenIntoImageSurface call dest->Flush/MarkDirty.
+      */
+     void ReadPixelsIntoImageSurface(gfxImageSurface* dest);
+ 
+     // Similar to ReadPixelsIntoImageSurface, but pulls from the screen
+     // instead of the currently bound framebuffer.
+     void ReadScreenIntoImageSurface(gfxImageSurface* dest);
+ 
++    TemporaryRef<gfx::SourceSurface> ReadPixelsToSourceSurface(const gfx::IntSize &aSize);
++
+     /**
+      * Copy a rectangle from one TextureImage into another.  The
+      * source and destination are given in integer coordinates, and
+      * will be converted to texture coordinates.
+      *
+      * For the source texture, the wrap modes DO apply -- it's valid
+      * to use REPEAT or PAD and expect appropriate behaviour if the source
+      * rectangle extends beyond its bounds.
+diff --git a/gfx/layers/Compositor.h b/gfx/layers/Compositor.h
+--- a/gfx/layers/Compositor.h
++++ b/gfx/layers/Compositor.h
+@@ -2,17 +2,16 @@
+ * 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_GFX_COMPOSITOR_H
+ #define MOZILLA_GFX_COMPOSITOR_H
+ 
+ #include "Units.h"                      // for ScreenPoint
+-#include "gfxPoint.h"                   // for gfxIntSize
+ #include "mozilla/Assertions.h"         // for MOZ_ASSERT, etc
+ #include "mozilla/RefPtr.h"             // for TemporaryRef, RefCounted
+ #include "mozilla/gfx/Point.h"          // for IntSize, Point
+ #include "mozilla/gfx/Rect.h"           // for Rect, IntRect
+ #include "mozilla/gfx/Types.h"          // for Float
+ #include "mozilla/layers/CompositorTypes.h"  // for DiagnosticTypes, etc
+ #include "mozilla/layers/LayersTypes.h"  // for LayersBackend
+ #include "nsTraceRefcnt.h"              // for MOZ_COUNT_CTOR, etc
+@@ -97,24 +96,24 @@
+  * under gfx/layers/. To add a new backend, implement at least the following
+  * interfaces:
+  * - Compositor (ex. CompositorOGL)
+  * - TextureHost (ex. SharedTextureHostOGL)
+  * Depending on the type of data that needs to be serialized, you may need to
+  * add specific TextureClient implementations.
+  */
+ 
+-class gfxContext;
+ class nsIWidget;
+ struct gfxMatrix;
+ struct nsIntSize;
+ 
+ namespace mozilla {
+ namespace gfx {
+ class Matrix4x4;
++class DrawTarget;
+ }
+ 
+ namespace layers {
+ 
+ struct Effect;
+ struct EffectChain;
+ class Image;
+ class ISurfaceAllocator;
+@@ -205,27 +204,27 @@ public:
+    * across process or thread boundaries that are compatible with this
+    * compositor.
+    */
+   virtual TextureFactoryIdentifier GetTextureFactoryIdentifier() = 0;
+ 
+   /**
+    * Properties of the compositor.
+    */
+-  virtual bool CanUseCanvasLayerForSize(const gfxIntSize& aSize) = 0;
++  virtual bool CanUseCanvasLayerForSize(const gfx::IntSize& aSize) = 0;
+   virtual int32_t GetMaxTextureSize() const = 0;
+ 
+   /**
+    * Set the target for rendering. Results will have been written to aTarget by
+    * the time that EndFrame returns.
+    *
+    * If this method is not used, or we pass in nullptr, we target the compositor's
+    * usual swap chain and render to the screen.
+    */
+-  virtual void SetTargetContext(gfxContext* aTarget) = 0;
++  virtual void SetTargetContext(gfx::DrawTarget* aTarget) = 0;
+ 
+   typedef uint32_t MakeCurrentFlags;
+   static const MakeCurrentFlags ForceMakeCurrent = 0x1;
+   /**
+    * Make this compositor's rendering context the current context for the
+    * underlying graphics API. This may be a global operation, depending on the
+    * API. Our context will remain the current one until someone else changes it.
+    *
+diff --git a/gfx/layers/Layers.cpp b/gfx/layers/Layers.cpp
+--- a/gfx/layers/Layers.cpp
++++ b/gfx/layers/Layers.cpp
+@@ -1166,19 +1166,20 @@ void WriteSnapshotToDumpFile(Layer* aLay
+   WriteSnapshotToDumpFile_internal(aLayer, aSurf);
+ }
+ 
+ void WriteSnapshotToDumpFile(LayerManager* aManager, gfxASurface* aSurf)
+ {
+   WriteSnapshotToDumpFile_internal(aManager, aSurf);
+ }
+ 
+-void WriteSnapshotToDumpFile(Compositor* aCompositor, gfxASurface* aSurf)
++void WriteSnapshotToDumpFile(Compositor* aCompositor, DrawTarget* aTarget)
+ {
+-  WriteSnapshotToDumpFile_internal(aCompositor, aSurf);
++  nsRefPtr<gfxASurface> surf = gfxPlatform::GetPlatform()->GetThebesSurfaceForDrawTarget(aTarget);
++  WriteSnapshotToDumpFile_internal(aCompositor, surf);
+ }
+ #endif
+ 
+ void
+ Layer::Dump(FILE* aFile, const char* aPrefix, bool aDumpHtml)
+ {
+   if (aDumpHtml) {
+     fprintf(aFile, "<li><a id=\"%p\" ", this);
+diff --git a/gfx/layers/Layers.h b/gfx/layers/Layers.h
+--- a/gfx/layers/Layers.h
++++ b/gfx/layers/Layers.h
+@@ -1955,15 +1955,15 @@ protected:
+   Layer* mTempReferent;
+   // 0 is a special value that means "no ID".
+   uint64_t mId;
+ };
+ 
+ #ifdef MOZ_DUMP_PAINTING
+ void WriteSnapshotToDumpFile(Layer* aLayer, gfxASurface* aSurf);
+ void WriteSnapshotToDumpFile(LayerManager* aManager, gfxASurface* aSurf);
+-void WriteSnapshotToDumpFile(Compositor* aCompositor, gfxASurface* aSurf);
++void WriteSnapshotToDumpFile(Compositor* aCompositor, gfx::DrawTarget* aTarget);
+ #endif
+ 
+ }
+ }
+ 
+ #endif /* GFX_LAYERS_H */
+diff --git a/gfx/layers/basic/BasicCompositor.cpp b/gfx/layers/basic/BasicCompositor.cpp
+--- a/gfx/layers/basic/BasicCompositor.cpp
++++ b/gfx/layers/basic/BasicCompositor.cpp
+@@ -464,30 +464,27 @@ BasicCompositor::BeginFrame(const gfx::R
+   }
+ }
+ 
+ void
+ BasicCompositor::EndFrame()
+ {
+   mRenderTarget->mDrawTarget->PopClip();
+ 
++  RefPtr<SourceSurface> source = mRenderTarget->mDrawTarget->Snapshot();
+   if (mCopyTarget) {
+-    nsRefPtr<gfxASurface> thebes = gfxPlatform::GetPlatform()->GetThebesSurfaceForDrawTarget(mRenderTarget->mDrawTarget);
+-    gfxContextAutoSaveRestore restore(mCopyTarget);
+-    mCopyTarget->SetOperator(gfxContext::OPERATOR_SOURCE);
+-    mCopyTarget->SetSource(thebes);
+-    mCopyTarget->Paint();
+-    mCopyTarget = nullptr;
++    mCopyTarget->CopySurface(source,
++                             IntRect(0, 0, mWidgetSize.width, mWidgetSize.height),
++                             IntPoint(0, 0));
+   } else {
+     // Most platforms require us to buffer drawing to the widget surface.
+     // That's why we don't draw to mDrawTarget directly.
+-    RefPtr<SourceSurface> source = mRenderTarget->mDrawTarget->Snapshot();
+     mDrawTarget->CopySurface(source,
+-	                     IntRect(0, 0, mWidgetSize.width, mWidgetSize.height),
+-			     IntPoint(0, 0));
++	                           IntRect(0, 0, mWidgetSize.width, mWidgetSize.height),
++			                       IntPoint(0, 0));
+     mWidget->EndRemoteDrawing();
+   }
+   mDrawTarget = nullptr;
+   mRenderTarget = nullptr;
+ }
+ 
+ void
+ BasicCompositor::AbortFrame()
+diff --git a/gfx/layers/basic/BasicCompositor.h b/gfx/layers/basic/BasicCompositor.h
+--- a/gfx/layers/basic/BasicCompositor.h
++++ b/gfx/layers/basic/BasicCompositor.h
+@@ -89,20 +89,20 @@ public:
+   virtual void EndFrame() MOZ_OVERRIDE;
+   virtual void EndFrameForExternalComposition(const gfxMatrix& aTransform) MOZ_OVERRIDE
+   {
+     NS_RUNTIMEABORT("We shouldn't ever hit this");
+   }
+   virtual void AbortFrame() MOZ_OVERRIDE;
+ 
+   virtual bool SupportsPartialTextureUpdate() { return true; }
+-  virtual bool CanUseCanvasLayerForSize(const gfxIntSize &aSize) MOZ_OVERRIDE { return true; }
++  virtual bool CanUseCanvasLayerForSize(const gfx::IntSize &aSize) MOZ_OVERRIDE { return true; }
+   virtual int32_t GetMaxTextureSize() const MOZ_OVERRIDE { return INT32_MAX; }
+   virtual void SetDestinationSurfaceSize(const gfx::IntSize& aSize) MOZ_OVERRIDE { }
+-  virtual void SetTargetContext(gfxContext* aTarget) MOZ_OVERRIDE
++  virtual void SetTargetContext(gfx::DrawTarget* aTarget) MOZ_OVERRIDE
+   {
+     mCopyTarget = aTarget;
+   }
+   
+   virtual void SetScreenRenderOffset(const ScreenPoint& aOffset) MOZ_OVERRIDE {
+   }
+ 
+   virtual void MakeCurrent(MakeCurrentFlags aFlags = 0) { }
+@@ -128,15 +128,15 @@ private:
+   nsIntSize mWidgetSize;
+ 
+   // The final destination surface
+   RefPtr<gfx::DrawTarget> mDrawTarget;
+   // The current render target for drawing
+   RefPtr<BasicCompositingRenderTarget> mRenderTarget;
+   // An optional destination target to copy the results
+   // to after drawing is completed.
+-  nsRefPtr<gfxContext> mCopyTarget;
++  RefPtr<gfx::DrawTarget> mCopyTarget;
+ };
+ 
+ } // namespace layers
+ } // namespace mozilla
+ 
+ #endif /* MOZILLA_GFX_BASICCOMPOSITOR_H */
+diff --git a/gfx/layers/composite/LayerManagerComposite.cpp b/gfx/layers/composite/LayerManagerComposite.cpp
+--- a/gfx/layers/composite/LayerManagerComposite.cpp
++++ b/gfx/layers/composite/LayerManagerComposite.cpp
+@@ -143,17 +143,17 @@ LayerManagerComposite::UpdateRenderBound
+ 
+ void
+ LayerManagerComposite::BeginTransaction()
+ {
+   mInTransaction = true;
+ }
+ 
+ void
+-LayerManagerComposite::BeginTransactionWithTarget(gfxContext *aTarget)
++LayerManagerComposite::BeginTransactionWithDrawTarget(DrawTarget* aTarget)
+ {
+   mInTransaction = true;
+ 
+ #ifdef MOZ_LAYERS_HAVE_LOG
+   MOZ_LAYERS_LOG(("[----- BeginTransaction"));
+   Log();
+ #endif
+ 
+@@ -757,17 +757,18 @@ void
+ LayerManagerComposite::NotifyShadowTreeTransaction()
+ {
+   mCompositor->NotifyLayersTransaction();
+ }
+ 
+ bool
+ LayerManagerComposite::CanUseCanvasLayerForSize(const gfxIntSize &aSize)
+ {
+-  return mCompositor->CanUseCanvasLayerForSize(aSize);
++  return mCompositor->CanUseCanvasLayerForSize(gfx::IntSize(aSize.width,
++                                                            aSize.height));
+ }
+ 
+ TextureFactoryIdentifier
+ LayerManagerComposite::GetTextureFactoryIdentifier()
+ {
+   return mCompositor->GetTextureFactoryIdentifier();
+ }
+ 
+diff --git a/gfx/layers/composite/LayerManagerComposite.h b/gfx/layers/composite/LayerManagerComposite.h
+--- a/gfx/layers/composite/LayerManagerComposite.h
++++ b/gfx/layers/composite/LayerManagerComposite.h
+@@ -97,18 +97,22 @@ public:
+    */
+   virtual LayerManagerComposite* AsLayerManagerComposite() MOZ_OVERRIDE
+   {
+     return this;
+   }
+ 
+   void UpdateRenderBounds(const nsIntRect& aRect);
+ 
+-  void BeginTransaction() MOZ_OVERRIDE;
+-  void BeginTransactionWithTarget(gfxContext* aTarget) MOZ_OVERRIDE;
++  virtual void BeginTransaction() MOZ_OVERRIDE;
++  virtual void BeginTransactionWithTarget(gfxContext* aTarget) MOZ_OVERRIDE
++  {
++    MOZ_CRASH("Use BeginTransactionWithDrawTarget");
++  }
++  void BeginTransactionWithDrawTarget(gfx::DrawTarget* aTarget);
+ 
+   void NotifyShadowTreeTransaction();
+ 
+   virtual bool EndEmptyTransaction(EndTransactionFlags aFlags = END_DEFAULT) MOZ_OVERRIDE;
+   virtual void EndTransaction(DrawThebesLayerCallback aCallback,
+                               void* aCallbackData,
+                               EndTransactionFlags aFlags = END_DEFAULT) MOZ_OVERRIDE;
+ 
+diff --git a/gfx/layers/d3d11/CompositorD3D11.cpp b/gfx/layers/d3d11/CompositorD3D11.cpp
+--- a/gfx/layers/d3d11/CompositorD3D11.cpp
++++ b/gfx/layers/d3d11/CompositorD3D11.cpp
+@@ -344,17 +344,17 @@ CompositorD3D11::GetTextureFactoryIdenti
+   TextureFactoryIdentifier ident;
+   ident.mMaxTextureSize = GetMaxTextureSize();
+   ident.mParentProcessId = XRE_GetProcessType();
+   ident.mParentBackend = LAYERS_D3D11;
+   return ident;
+ }
+ 
+ bool
+-CompositorD3D11::CanUseCanvasLayerForSize(const gfxIntSize& aSize)
++CompositorD3D11::CanUseCanvasLayerForSize(const gfx::IntSize& aSize)
+ {
+   int32_t maxTextureSize = GetMaxTextureSize();
+ 
+   if (aSize.width > maxTextureSize || aSize.height > maxTextureSize) {
+     return false;
+   }
+ 
+   return true;
+@@ -903,23 +903,23 @@ CompositorD3D11::PaintToTarget()
+   nsRefPtr<ID3D11Texture2D> readTexture;
+ 
+   HRESULT hr = mDevice->CreateTexture2D(&softDesc, nullptr, getter_AddRefs(readTexture));
+   mContext->CopyResource(readTexture, backBuf);
+ 
+   D3D11_MAPPED_SUBRESOURCE map;
+   mContext->Map(readTexture, 0, D3D11_MAP_READ, 0, &map);
+ 
+-  nsRefPtr<gfxImageSurface> tmpSurface =
+-    new gfxImageSurface((unsigned char*)map.pData,
+-                        gfxIntSize(bbDesc.Width, bbDesc.Height),
+-                        map.RowPitch,
+-                        gfxImageFormatARGB32);
+-
+-  mTarget->SetSource(tmpSurface);
+-  mTarget->SetOperator(gfxContext::OPERATOR_SOURCE);
+-  mTarget->Paint();
+-
++  destSurf->LockRect(&rect, NULL, D3DLOCK_READONLY);
++  RefPtr<DataSourceSurface> sourceSurface =
++    Factory::CreateWrappingDataSourceSurface((uint8_t*)map.pData,
++                                             map.RowPitch,
++                                             IntSize(bbDesc.Width, bbDesc.Height),
++                                             FORMAT_B8G8R8A8);
++  mTarget->CopySurface(sourceSurface,
++                       IntRect(0, 0, bbDesc.Width, bbDesc.Height),
++                       IntPoint());
++  mTarget->Flush();
+   mContext->Unmap(readTexture, 0);
+ }
+ 
+ }
+ }
+diff --git a/gfx/layers/d3d11/CompositorD3D11.h b/gfx/layers/d3d11/CompositorD3D11.h
+--- a/gfx/layers/d3d11/CompositorD3D11.h
++++ b/gfx/layers/d3d11/CompositorD3D11.h
+@@ -1,16 +1,17 @@
+ /* -*- Mode: C++; tab-width: 20; 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_GFX_COMPOSITORD3D11_H
+ #define MOZILLA_GFX_COMPOSITORD3D11_H
+ 
++#include "mozilla/gfx/2D.h"
+ #include "mozilla/layers/Compositor.h"
+ #include "TextureD3D11.h"
+ #include <d3d11.h>
+ 
+ class nsWidget;
+ 
+ namespace mozilla {
+ namespace layers {
+@@ -45,20 +46,20 @@ public:
+   virtual void Destroy() MOZ_OVERRIDE {}
+ 
+   virtual TextureFactoryIdentifier
+     GetTextureFactoryIdentifier() MOZ_OVERRIDE;
+ 
+   virtual TemporaryRef<DataTextureSource>
+     CreateDataTextureSource(TextureFlags aFlags = 0) MOZ_OVERRIDE { return nullptr; }
+ 
+-  virtual bool CanUseCanvasLayerForSize(const gfxIntSize& aSize) MOZ_OVERRIDE;
++  virtual bool CanUseCanvasLayerForSize(const gfx::IntSize& aSize) MOZ_OVERRIDE;
+   virtual int32_t GetMaxTextureSize() const MOZ_FINAL;
+ 
+-  virtual void SetTargetContext(gfxContext* aTarget)  MOZ_OVERRIDE
++  virtual void SetTargetContext(gfx::DrawTarget* aTarget)  MOZ_OVERRIDE
+   {
+     mTarget = aTarget;
+   }
+ 
+   virtual void MakeCurrent(MakeCurrentFlags aFlags = 0)  MOZ_OVERRIDE {}
+ 
+   virtual TemporaryRef<CompositingRenderTarget>
+     CreateRenderTarget(const gfx::IntRect &aRect,
+@@ -162,17 +163,17 @@ private:
+   RefPtr<ID3D11DeviceContext> mContext;
+   RefPtr<ID3D11Device> mDevice;
+   RefPtr<IDXGISwapChain> mSwapChain;
+   RefPtr<CompositingRenderTargetD3D11> mDefaultRT;
+   RefPtr<CompositingRenderTargetD3D11> mCurrentRT;
+ 
+   DeviceAttachmentsD3D11* mAttachments;
+ 
+-  nsRefPtr<gfxContext> mTarget;
++  RefPtr<gfx::DrawTarget> mTarget;
+ 
+   nsIWidget* mWidget;
+ 
+   nsIntSize mSize;
+ 
+   HWND mHwnd;
+ 
+   D3D_FEATURE_LEVEL mFeatureLevel;
+diff --git a/gfx/layers/d3d9/CompositorD3D9.cpp b/gfx/layers/d3d9/CompositorD3D9.cpp
+--- a/gfx/layers/d3d9/CompositorD3D9.cpp
++++ b/gfx/layers/d3d9/CompositorD3D9.cpp
+@@ -60,17 +60,17 @@ CompositorD3D9::GetTextureFactoryIdentif
+   TextureFactoryIdentifier ident;
+   ident.mMaxTextureSize = GetMaxTextureSize();
+   ident.mParentBackend = LAYERS_D3D9;
+   ident.mParentProcessId = XRE_GetProcessType();
+   return ident;
+ }
+ 
+ bool
+-CompositorD3D9::CanUseCanvasLayerForSize(const gfxIntSize &aSize)
++CompositorD3D9::CanUseCanvasLayerForSize(const IntSize &aSize)
+ {
+   int32_t maxTextureSize = GetMaxTextureSize();
+ 
+   if (aSize.width > maxTextureSize || aSize.height > maxTextureSize) {
+     return false;
+   }
+ 
+   return true;
+@@ -560,24 +560,25 @@ CompositorD3D9::PaintToTarget()
+   device()->CreateOffscreenPlainSurface(desc.Width, desc.Height,
+                                         D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM,
+                                         getter_AddRefs(destSurf), NULL);
+ 
+   device()->GetRenderTargetData(backBuff, destSurf);
+ 
+   D3DLOCKED_RECT rect;
+   destSurf->LockRect(&rect, NULL, D3DLOCK_READONLY);
+-  mTarget->SetOperator(gfxContext::OPERATOR_SOURCE);
+-  nsRefPtr<gfxImageSurface> imageSurface =
+-    new gfxImageSurface((unsigned char*)rect.pBits,
+-                        gfxIntSize(desc.Width, desc.Height),
+-                        rect.Pitch,
+-                        gfxImageFormatARGB32);
+-  mTarget->SetSource(imageSurface);
+-  mTarget->Paint();
++  RefPtr<DataSourceSurface> sourceSurface =
++    Factory::CreateWrappingDataSourceSurface((uint8_t*)rect.pBits,
++                                             rect.Pitch,
++                                             IntSize(desc.Width, desc.Height),
++                                             FORMAT_B8G8R8A8);
++  mTarget->CopySurface(sourceSurface,
++                       IntRect(0, 0, desc.Width, desc.Height),
++                       IntPoint());
++  mTarget->Flush();
+   destSurf->UnlockRect();
+ }
+ 
+ void
+ CompositorD3D9::ReportFailure(const nsACString &aMsg, HRESULT aCode)
+ {
+   // We could choose to abort here when hr == E_OUTOFMEMORY.
+   nsCString msg;
+diff --git a/gfx/layers/d3d9/CompositorD3D9.h b/gfx/layers/d3d9/CompositorD3D9.h
+--- a/gfx/layers/d3d9/CompositorD3D9.h
++++ b/gfx/layers/d3d9/CompositorD3D9.h
+@@ -1,16 +1,17 @@
+ /* -*- Mode: C++; tab-width: 20; 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_GFX_COMPOSITORD3D9_H
+ #define MOZILLA_GFX_COMPOSITORD3D9_H
+ 
++#include "mozilla/gfx/2D.h"
+ #include "mozilla/layers/Compositor.h"
+ #include "mozilla/layers/TextureD3D9.h"
+ #include "DeviceManagerD3D9.h"
+ 
+ class nsWidget;
+ 
+ namespace mozilla {
+ namespace layers {
+@@ -22,20 +23,20 @@ public:
+   ~CompositorD3D9();
+ 
+   virtual bool Initialize() MOZ_OVERRIDE;
+   virtual void Destroy() MOZ_OVERRIDE {}
+ 
+   virtual TextureFactoryIdentifier
+     GetTextureFactoryIdentifier() MOZ_OVERRIDE;
+ 
+-  virtual bool CanUseCanvasLayerForSize(const gfxIntSize &aSize) MOZ_OVERRIDE;
++  virtual bool CanUseCanvasLayerForSize(const gfx::IntSize &aSize) MOZ_OVERRIDE;
+   virtual int32_t GetMaxTextureSize() const MOZ_FINAL;
+ 
+-  virtual void SetTargetContext(gfxContext *aTarget) MOZ_OVERRIDE
++  virtual void SetTargetContext(gfx::DrawTarget *aTarget) MOZ_OVERRIDE
+   {
+     mTarget = aTarget;
+   }
+ 
+   virtual void MakeCurrent(MakeCurrentFlags aFlags = 0) MOZ_OVERRIDE {}
+ 
+   virtual TemporaryRef<CompositingRenderTarget>
+     CreateRenderTarget(const gfx::IntRect &aRect,
+@@ -123,17 +124,17 @@ private:
+   nsRefPtr<SwapChainD3D9> mSwapChain;
+ 
+   /* Widget associated with this layer manager */
+   nsIWidget *mWidget;
+ 
+   /*
+    * Context target, NULL when drawing directly to our swap chain.
+    */
+-  nsRefPtr<gfxContext> mTarget;
++  RefPtr<gfx::DrawTarget> mTarget;
+ 
+   RefPtr<CompositingRenderTargetD3D9> mDefaultRT;
+   RefPtr<CompositingRenderTargetD3D9> mCurrentRT;
+ 
+   nsIntSize mSize;
+ };
+ 
+ }
+diff --git a/gfx/layers/ipc/CompositorParent.cpp b/gfx/layers/ipc/CompositorParent.cpp
+--- a/gfx/layers/ipc/CompositorParent.cpp
++++ b/gfx/layers/ipc/CompositorParent.cpp
+@@ -18,16 +18,17 @@
+ #include "base/task.h"                  // for CancelableTask, etc
+ #include "base/thread.h"                // for Thread
+ #include "base/tracked.h"               // for FROM_HERE
+ #include "gfxContext.h"                 // for gfxContext
+ #include "gfxPlatform.h"                // for gfxPlatform
+ #include "ipc/ShadowLayersManager.h"    // for ShadowLayersManager
+ #include "mozilla/AutoRestore.h"        // for AutoRestore
+ #include "mozilla/DebugOnly.h"          // for DebugOnly
++#include "mozilla/gfx/2D.h"          // for DrawTarget
+ #include "mozilla/gfx/Point.h"          // for IntSize
+ #include "mozilla/ipc/Transport.h"      // for Transport
+ #include "mozilla/layers/APZCTreeManager.h"  // for APZCTreeManager
+ #include "mozilla/layers/AsyncCompositionManager.h"
+ #include "mozilla/layers/BasicCompositor.h"  // for BasicCompositor
+ #include "mozilla/layers/Compositor.h"  // for Compositor
+ #include "mozilla/layers/CompositorOGL.h"  // for CompositorOGL
+ #include "mozilla/layers/CompositorTypes.h"
+@@ -47,16 +48,17 @@
+ #include "mozilla/layers/CompositorD3D11.h"
+ #include "mozilla/layers/CompositorD3D9.h"
+ #endif
+ #include "GeckoProfiler.h"
+ 
+ using namespace base;
+ using namespace mozilla;
+ using namespace mozilla::ipc;
++using namespace mozilla::gfx;
+ using namespace std;
+ 
+ namespace mozilla {
+ namespace layers {
+ 
+ CompositorParent::LayerTreeState::LayerTreeState()
+   : mParent(nullptr)
+ {
+@@ -290,17 +292,23 @@ CompositorParent::RecvResume()
+   return true;
+ }
+ 
+ bool
+ CompositorParent::RecvMakeSnapshot(const SurfaceDescriptor& aInSnapshot,
+                                    SurfaceDescriptor* aOutSnapshot)
+ {
+   AutoOpenSurface opener(OPEN_READ_WRITE, aInSnapshot);
+-  nsRefPtr<gfxContext> target = new gfxContext(opener.Get());
++  gfxIntSize size = opener.Size();
++  // XXX CreateDrawTargetForSurface will always give us a Cairo surface, we can
++  // do better if AutoOpenSurface uses Moz2D directly.
++  RefPtr<DrawTarget> target =
++    gfxPlatform::GetPlatform()->CreateDrawTargetForSurface(opener.Get(),
++                                                           IntSize(size.width,
++                                                                   size.height));
+   ComposeToTarget(target);
+   *aOutSnapshot = aInSnapshot;
+   return true;
+ }
+ 
+ bool
+ CompositorParent::RecvFlushRendering()
+ {
+@@ -536,26 +544,26 @@ CompositorParent::Composite()
+   if (mExpectedComposeTime + TimeDuration::FromMilliseconds(15) < TimeStamp::Now()) {
+     printf_stderr("Compositor: Composite took %i ms.\n",
+                   15 + (int)(TimeStamp::Now() - mExpectedComposeTime).ToMilliseconds());
+   }
+ #endif
+ }
+ 
+ void
+-CompositorParent::ComposeToTarget(gfxContext* aTarget)
++CompositorParent::ComposeToTarget(DrawTarget* aTarget)
+ {
+   PROFILER_LABEL("CompositorParent", "ComposeToTarget");
+   AutoRestore<bool> override(mOverrideComposeReadiness);
+   mOverrideComposeReadiness = true;
+ 
+   if (!CanComposite()) {
+     return;
+   }
+-  mLayerManager->BeginTransactionWithTarget(aTarget);
++  mLayerManager->BeginTransactionWithDrawTarget(aTarget);
+   // Since CanComposite() is true, Composite() must end the layers txn
+   // we opened above.
+   Composite();
+ }
+ 
+ bool
+ CompositorParent::CanComposite()
+ {
+diff --git a/gfx/layers/ipc/CompositorParent.h b/gfx/layers/ipc/CompositorParent.h
+--- a/gfx/layers/ipc/CompositorParent.h
++++ b/gfx/layers/ipc/CompositorParent.h
+@@ -34,16 +34,20 @@
+ #include "nsSize.h"                     // for nsIntSize
+ 
+ class CancelableTask;
+ class MessageLoop;
+ class gfxContext;
+ class nsIWidget;
+ 
+ namespace mozilla {
++namespace gfx {
++class DrawTarget;
++}
++
+ namespace layers {
+ 
+ class APZCTreeManager;
+ class AsyncCompositionManager;
+ class LayerManagerComposite;
+ class LayerTransactionParent;
+ 
+ struct ScopedLayerTreeRegistration
+@@ -216,17 +220,17 @@ protected:
+   virtual PLayerTransactionParent*
+     AllocPLayerTransactionParent(const nsTArray<LayersBackend>& aBackendHints,
+                                  const uint64_t& aId,
+                                  TextureFactoryIdentifier* aTextureFactoryIdentifier,
+                                  bool* aSuccess);
+   virtual bool DeallocPLayerTransactionParent(PLayerTransactionParent* aLayers);
+   virtual void ScheduleTask(CancelableTask*, int);
+   virtual void Composite();
+-  virtual void ComposeToTarget(gfxContext* aTarget);
++  virtual void ComposeToTarget(gfx::DrawTarget* aTarget);
+ 
+   void SetEGLSurfaceSize(int width, int height);
+ 
+ private:
+   void InitializeLayerManager(const nsTArray<LayersBackend>& aBackendHints);
+   void PauseComposition();
+   void ResumeComposition();
+   void ResumeCompositionAndResize(int width, int height);
+diff --git a/gfx/layers/ipc/LayerTransactionParent.cpp b/gfx/layers/ipc/LayerTransactionParent.cpp
+--- a/gfx/layers/ipc/LayerTransactionParent.cpp
++++ b/gfx/layers/ipc/LayerTransactionParent.cpp
+@@ -195,17 +195,17 @@ LayerTransactionParent::RecvUpdate(const
+   MOZ_LAYERS_LOG(("[ParentSide] received txn with %d edits", cset.Length()));
+ 
+   if (mDestroyed || !layer_manager() || layer_manager()->IsDestroyed()) {
+     return true;
+   }
+ 
+   EditReplyVector replyv;
+ 
+-  layer_manager()->BeginTransactionWithTarget(nullptr);
++  layer_manager()->BeginTransactionWithDrawTarget(nullptr);
+ 
+   for (EditArray::index_type i = 0; i < cset.Length(); ++i) {
+     const Edit& edit = cset[i];
+ 
+     switch (edit.type()) {
+     // Create* ops
+     case Edit::TOpCreateThebesLayer: {
+       MOZ_LAYERS_LOG(("[ParentSide] CreateThebesLayer"));
+diff --git a/gfx/layers/opengl/CompositorOGL.cpp b/gfx/layers/opengl/CompositorOGL.cpp
+--- a/gfx/layers/opengl/CompositorOGL.cpp
++++ b/gfx/layers/opengl/CompositorOGL.cpp
+@@ -1256,21 +1256,20 @@ CompositorOGL::EndFrame()
+ #ifdef MOZ_DUMP_PAINTING
+   if (gfxUtils::sDumpPainting) {
+     nsIntRect rect;
+     if (mUseExternalSurfaceSize) {
+       rect = nsIntRect(0, 0, mSurfaceSize.width, mSurfaceSize.height);
+     } else {
+       mWidget->GetBounds(rect);
+     }
+-    nsRefPtr<gfxASurface> surf = gfxPlatform::GetPlatform()->CreateOffscreenSurface(rect.Size(), GFX_CONTENT_COLOR_ALPHA);
+-    nsRefPtr<gfxContext> ctx = new gfxContext(surf);
+-    CopyToTarget(ctx, mCurrentRenderTarget->GetTransform());
++    RefPtr<DrawTarget> target = gfxPlatform::GetPlatform()->CreateOffscreenContentDrawTarget(IntSize(rect.width, rect.height), FORMAT_B8G8R8A8);
++    CopyToTarget(target, mCurrentRenderTarget->GetTransform());
+ 
+-    WriteSnapshotToDumpFile(this, surf);
++    WriteSnapshotToDumpFile(this, target);
+   }
+ #endif
+ 
+   mFrameInProgress = false;
+ 
+   if (mTarget) {
+     CopyToTarget(mTarget, mCurrentRenderTarget->GetTransform());
+     mGLContext->fBindBuffer(LOCAL_GL_ARRAY_BUFFER, 0);
+@@ -1330,60 +1329,55 @@ CompositorOGL::AbortFrame()
+ void
+ CompositorOGL::SetDestinationSurfaceSize(const gfx::IntSize& aSize)
+ {
+   mSurfaceSize.width = aSize.width;
+   mSurfaceSize.height = aSize.height;
+ }
+ 
+ void
+-CompositorOGL::CopyToTarget(gfxContext *aTarget, const gfxMatrix& aTransform)
++CompositorOGL::CopyToTarget(DrawTarget *aTarget, const gfxMatrix& aTransform)
+ {
+-  nsIntRect rect;
++  IntRect rect;
+   if (mUseExternalSurfaceSize) {
+-    rect = nsIntRect(0, 0, mSurfaceSize.width, mSurfaceSize.height);
++    rect = IntRect(0, 0, mSurfaceSize.width, mSurfaceSize.height);
+   } else {
+-    rect = nsIntRect(0, 0, mWidgetSize.width, mWidgetSize.height);
++    rect = IntRect(0, 0, mWidgetSize.width, mWidgetSize.height);
+   }
+   GLint width = rect.width;
+   GLint height = rect.height;
+ 
+   if ((int64_t(width) * int64_t(height) * int64_t(4)) > PR_INT32_MAX) {
+     NS_ERROR("Widget size too big - integer overflow!");
+     return;
+   }
+ 
+-  nsRefPtr<gfxImageSurface> imageSurface =
+-    new gfxImageSurface(gfxIntSize(width, height),
+-                        gfxImageFormatARGB32);
+-
+   mGLContext->fBindFramebuffer(LOCAL_GL_FRAMEBUFFER, 0);
+ 
+   if (!mGLContext->IsGLES2()) {
+     // GLES2 promises that binding to any custom FBO will attach
+     // to GL_COLOR_ATTACHMENT0 attachment point.
+     mGLContext->fReadBuffer(LOCAL_GL_BACK);
+   }
+ 
+-  NS_ASSERTION(imageSurface->Stride() == width * 4,
+-               "Image Surfaces being created with weird stride!");
+-
+-  mGLContext->ReadPixelsIntoImageSurface(imageSurface);
++  RefPtr<SourceSurface> source =
++    mGLContext->ReadPixelsToSourceSurface(IntSize(width, height));
+ 
+   // Map from GL space to Cairo space and reverse the world transform.
+-  gfxMatrix glToCairoTransform = aTransform;
++  Matrix glToCairoTransform = MatrixForThebesMatrix(aTransform);
+   glToCairoTransform.Invert();
+   glToCairoTransform.Scale(1.0, -1.0);
+-  glToCairoTransform.Translate(-gfxPoint(0.0, height));
++  glToCairoTransform.Translate(0.0, -height);
+ 
+-  gfxContextAutoSaveRestore restore(aTarget);
+-  aTarget->SetOperator(gfxContext::OPERATOR_SOURCE);
+-  aTarget->SetMatrix(glToCairoTransform);
+-  aTarget->SetSource(imageSurface);
+-  aTarget->Paint();
++  Matrix oldMatrix = aTarget->GetTransform();
++  aTarget->SetTransform(glToCairoTransform);
++  Rect floatRect = Rect(rect.x, rect.y, rect.width, rect.height);
++  aTarget->DrawSurface(source, floatRect, floatRect, DrawSurfaceOptions(), DrawOptions(1.0f, OP_SOURCE));
++  aTarget->SetTransform(oldMatrix);
++  aTarget->Flush();
+ }
+ 
+ double
+ CompositorOGL::AddFrameAndGetFps(const TimeStamp& timestamp)
+ {
+   if (sDrawFPS) {
+     if (!mFPS) {
+       mFPS = new FPSState();
+diff --git a/gfx/layers/opengl/CompositorOGL.h b/gfx/layers/opengl/CompositorOGL.h
+--- a/gfx/layers/opengl/CompositorOGL.h
++++ b/gfx/layers/opengl/CompositorOGL.h
+@@ -5,32 +5,30 @@
+ 
+ #ifndef MOZILLA_GFX_COMPOSITOROGL_H
+ #define MOZILLA_GFX_COMPOSITOROGL_H
+ 
+ #include "GLContextTypes.h"             // for GLContext, etc
+ #include "GLDefs.h"                     // for GLuint, LOCAL_GL_TEXTURE_2D, etc
+ #include "LayerManagerOGLProgram.h"     // for ShaderProgramOGL, etc
+ #include "Units.h"                      // for ScreenPoint
+-#include "gfxContext.h"                 // for gfxContext
+-#include "gfxPoint.h"                   // for gfxIntSize
+ #include "mozilla/Assertions.h"         // for MOZ_ASSERT, etc
+ #include "mozilla/Attributes.h"         // for MOZ_OVERRIDE, MOZ_FINAL
+ #include "mozilla/RefPtr.h"             // for TemporaryRef, RefPtr
++#include "mozilla/gfx/2D.h"             // for DrawTarget
+ #include "mozilla/gfx/BaseSize.h"       // for BaseSize
+ #include "mozilla/gfx/Point.h"          // for IntSize, Point
+ #include "mozilla/gfx/Rect.h"           // for Rect, IntRect
+ #include "mozilla/gfx/Types.h"          // for Float, SurfaceFormat, etc
+ #include "mozilla/layers/Compositor.h"  // for SurfaceInitMode, Compositor, etc
+ #include "mozilla/layers/CompositorTypes.h"  // for MaskType::NumMaskTypes, etc
+ #include "mozilla/layers/LayersTypes.h"
+ #include "nsAutoPtr.h"                  // for nsRefPtr, nsAutoPtr
+ #include "nsCOMPtr.h"                   // for already_AddRefed
+ #include "nsDebug.h"                    // for NS_ASSERTION, NS_WARNING
+-#include "nsISupportsImpl.h"            // for gfxContext::AddRef, etc
+ #include "nsSize.h"                     // for nsIntSize
+ #include "nsTArray.h"                   // for nsAutoTArray, nsTArray, etc
+ #include "nsThreadUtils.h"              // for nsRunnable
+ #include "nsTraceRefcnt.h"              // for MOZ_COUNT_CTOR, etc
+ #include "nsXULAppAPI.h"                // for XRE_GetProcessType
+ #include "nscore.h"                     // for NS_IMETHOD
+ #include "VBOArena.h"                   // for gl::VBOArena
+ 
+@@ -101,39 +99,39 @@ public:
+                         const gfx::Point& aOffset) MOZ_OVERRIDE;
+ 
+   virtual void EndFrame() MOZ_OVERRIDE;
+   virtual void EndFrameForExternalComposition(const gfxMatrix& aTransform) MOZ_OVERRIDE;
+   virtual void AbortFrame() MOZ_OVERRIDE;
+ 
+   virtual bool SupportsPartialTextureUpdate() MOZ_OVERRIDE;
+ 
+-  virtual bool CanUseCanvasLayerForSize(const gfxIntSize &aSize) MOZ_OVERRIDE
++  virtual bool CanUseCanvasLayerForSize(const gfx::IntSize &aSize) MOZ_OVERRIDE
+   {
+     if (!mGLContext)
+       return false;
+     int32_t maxSize = GetMaxTextureSize();
+-    return aSize <= gfxIntSize(maxSize, maxSize);
++    return aSize <= gfx::IntSize(maxSize, maxSize);
+   }
+ 
+   virtual int32_t GetMaxTextureSize() const MOZ_OVERRIDE;
+ 
+   /**
+    * Set the size of the EGL surface we're rendering to, if we're rendering to
+    * an EGL surface.
+    */
+   virtual void SetDestinationSurfaceSize(const gfx::IntSize& aSize) MOZ_OVERRIDE;
+ 
+   virtual void SetScreenRenderOffset(const ScreenPoint& aOffset) MOZ_OVERRIDE {
+     mRenderOffset = aOffset;
+   }
+ 
+   virtual void MakeCurrent(MakeCurrentFlags aFlags = 0) MOZ_OVERRIDE;
+ 
+-  virtual void SetTargetContext(gfxContext* aTarget) MOZ_OVERRIDE
++  virtual void SetTargetContext(gfx::DrawTarget* aTarget) MOZ_OVERRIDE
+   {
+     mTarget = aTarget;
+   }
+ 
+   virtual void PrepareViewport(const gfx::IntSize& aSize,
+                                const gfxMatrix& aWorldTransform) MOZ_OVERRIDE;
+ 
+ 
+@@ -166,17 +164,17 @@ public:
+    * Doing so lets us use gralloc the way it has been designed to be used
+    * (see https://wiki.mozilla.org/Platform/GFX/Gralloc)
+    */
+   GLuint GetTemporaryTexture(GLenum aUnit);
+ private:
+   /** 
+    * Context target, nullptr when drawing directly to our swap chain.
+    */
+-  nsRefPtr<gfxContext> mTarget;
++  RefPtr<gfx::DrawTarget> mTarget;
+ 
+   /** Widget associated with this compositor */
+   nsIWidget *mWidget;
+   nsIntSize mWidgetSize;
+   nsRefPtr<GLContext> mGLContext;
+ 
+   /** The size of the surface we are rendering to */
+   nsIntSize mSurfaceSize;
+@@ -295,17 +293,17 @@ private:
+                                       TextureSource *aTexture);
+ 
+   void CleanupResources();
+ 
+   /**
+    * Copies the content of our backbuffer to the set transaction target.
+    * Does not restore the target FBO, so only call from EndFrame.
+    */
+-  void CopyToTarget(gfxContext *aTarget, const gfxMatrix& aWorldMatrix);
++  void CopyToTarget(gfx::DrawTarget* aTarget, const gfxMatrix& aWorldMatrix);
+ 
+   /**
+    * Records the passed frame timestamp and returns the current estimated FPS.
+    */
+   double AddFrameAndGetFps(const TimeStamp& timestamp);
+ 
+   bool mDestroyed;
+ 
+diff --git a/gfx/thebes/gfx2DGlue.h b/gfx/thebes/gfx2DGlue.h
+--- a/gfx/thebes/gfx2DGlue.h
++++ b/gfx/thebes/gfx2DGlue.h
+@@ -194,16 +194,22 @@ inline JoinStyle ToJoinStyle(gfxContext:
+ }
+ 
+ inline gfxMatrix ThebesMatrix(const Matrix &aMatrix)
+ {
+   return gfxMatrix(aMatrix._11, aMatrix._12, aMatrix._21,
+                    aMatrix._22, aMatrix._31, aMatrix._32);
+ }
+ 
++inline Matrix MatrixForThebesMatrix(const gfxMatrix &aMatrix)
++{
++  return Matrix(aMatrix.xx, aMatrix.yx, aMatrix.xy,
++                aMatrix.yy, aMatrix.x0, aMatrix.y0);
++}
++
+ inline gfxImageFormat SurfaceFormatToImageFormat(SurfaceFormat aFormat)
+ {
+   switch (aFormat) {
+   case FORMAT_B8G8R8A8:
+     return gfxImageFormatARGB32;
+   case FORMAT_B8G8R8X8:
+     return gfxImageFormatRGB24;
+   case FORMAT_R5G6B5:
+