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
--- 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)