Add a DrawTargetRotatedBuffer. (bug 1409871 part 6, r=nical) draft
authorRyan Hunt <rhunt@eqrion.net>
Wed, 11 Oct 2017 16:26:10 -0400
changeset 684128 78cf5c683fba1640f3bb95bb345bb437d660c347
parent 684127 9a369bc08fe994fd7e722931631085e9aa3dad80
child 684129 ed1f305fccc7a67ed690b58b55a47072afba4b94
push id85567
push userbmo:rhunt@eqrion.net
push dateFri, 20 Oct 2017 22:13:22 +0000
reviewersnical
bugs1409871
milestone58.0a1
Add a DrawTargetRotatedBuffer. (bug 1409871 part 6, r=nical) This adds a new implementation of rotated buffer, which is backed by draw targets. This will be the rotated buffer that basic content clients use. MozReview-Commit-ID: Knn79yEFnxN
gfx/layers/RotatedBuffer.cpp
gfx/layers/RotatedBuffer.h
--- a/gfx/layers/RotatedBuffer.cpp
+++ b/gfx/layers/RotatedBuffer.cpp
@@ -422,16 +422,39 @@ RemoteRotatedBuffer::GetDTBuffer() const
 }
 
 gfx::DrawTarget*
 RemoteRotatedBuffer::GetDTBufferOnWhite() const
 {
   return mTargetOnWhite;
 }
 
+already_AddRefed<gfx::SourceSurface>
+DrawTargetRotatedBuffer::GetSourceSurface(ContextSource aSource) const
+{
+  if (aSource == ContextSource::BUFFER_BLACK) {
+    return mTarget->Snapshot();
+  } else {
+    MOZ_ASSERT(aSource == ContextSource::BUFFER_WHITE);
+    return mTargetOnWhite->Snapshot();
+  }
+}
+
+gfx::DrawTarget*
+DrawTargetRotatedBuffer::GetDTBuffer() const
+{
+  return mTarget;
+}
+
+gfx::DrawTarget*
+DrawTargetRotatedBuffer::GetDTBufferOnWhite() const
+{
+  return mTargetOnWhite;
+}
+
 already_AddRefed<SourceSurface>
 SourceRotatedBuffer::GetSourceSurface(ContextSource aSource) const
 {
   RefPtr<SourceSurface> surf;
   if (aSource == BUFFER_BLACK) {
     surf = mSource;
   } else {
     MOZ_ASSERT(aSource == BUFFER_WHITE);
--- a/gfx/layers/RotatedBuffer.h
+++ b/gfx/layers/RotatedBuffer.h
@@ -231,16 +231,41 @@ protected:
 private:
   RefPtr<TextureClient> mClient;
   RefPtr<TextureClient> mClientOnWhite;
 
   RefPtr<gfx::DrawTarget> mTarget;
   RefPtr<gfx::DrawTarget> mTargetOnWhite;
 };
 
+class DrawTargetRotatedBuffer : public RotatedBuffer
+{
+public:
+  DrawTargetRotatedBuffer(gfx::DrawTarget* aTarget, gfx::DrawTarget* aTargetOnWhite,
+                          const gfx::IntRect& aBufferRect,
+                          const gfx::IntPoint& aBufferRotation)
+    : RotatedBuffer(aBufferRect, aBufferRotation)
+    , mTarget(aTarget)
+    , mTargetOnWhite(aTargetOnWhite)
+  { }
+
+  virtual bool HaveBuffer() const override { return !!mTarget; }
+  virtual bool HaveBufferOnWhite() const override { return !!mTargetOnWhite; }
+
+  virtual already_AddRefed<gfx::SourceSurface> GetSourceSurface(ContextSource aSource) const override;
+
+protected:
+  virtual gfx::DrawTarget* GetDTBuffer() const override;
+  virtual gfx::DrawTarget* GetDTBufferOnWhite() const override;
+
+private:
+  RefPtr<gfx::DrawTarget> mTarget;
+  RefPtr<gfx::DrawTarget> mTargetOnWhite;
+};
+
 class SourceRotatedBuffer : public RotatedBuffer
 {
 public:
   SourceRotatedBuffer(gfx::SourceSurface* aSource, gfx::SourceSurface* aSourceOnWhite,
                       const gfx::IntRect& aBufferRect,
                       const gfx::IntPoint& aBufferRotation)
     : RotatedBuffer(aBufferRect, aBufferRotation)
     , mSource(aSource)