diff -r 000000000000 -r 6474c204b198 gfx/layers/CopyableCanvasLayer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/layers/CopyableCanvasLayer.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,76 @@ +/* -*- Mode: C++; tab-width: 2; 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 GFX_COPYABLECANVASLAYER_H +#define GFX_COPYABLECANVASLAYER_H + +#include // for uint32_t +#include "GLContextTypes.h" // for GLContext +#include "Layers.h" // for CanvasLayer, etc +#include "gfxContext.h" // for gfxContext, etc +#include "gfxTypes.h" +#include "gfxPlatform.h" // for gfxImageFormat +#include "mozilla/Assertions.h" // for MOZ_ASSERT, etc +#include "mozilla/Preferences.h" // for Preferences +#include "mozilla/RefPtr.h" // for RefPtr +#include "mozilla/gfx/2D.h" // for DrawTarget +#include "mozilla/mozalloc.h" // for operator delete, etc +#include "nsAutoPtr.h" // for nsRefPtr +#include "nsISupportsImpl.h" // for MOZ_COUNT_CTOR, etc + +namespace mozilla { + +namespace gfx { +class SurfaceStream; +class SharedSurface; +class SurfaceFactory; +} + +namespace layers { + +class CanvasClientWebGL; + +/** + * A shared CanvasLayer implementation that supports copying + * its contents into a gfxASurface using UpdateSurface. + */ +class CopyableCanvasLayer : public CanvasLayer +{ +public: + CopyableCanvasLayer(LayerManager* aLayerManager, void *aImplData); + virtual ~CopyableCanvasLayer(); + + virtual void Initialize(const Data& aData); + + virtual bool IsDataValid(const Data& aData); + +protected: + void UpdateTarget(gfx::DrawTarget* aDestTarget = nullptr); + + RefPtr mSurface; + nsRefPtr mGLContext; + mozilla::RefPtr mDrawTarget; + + RefPtr mStream; + + uint32_t mCanvasFramebuffer; + + bool mIsGLAlphaPremult; + bool mNeedsYFlip; + + RefPtr mCachedTempSurface; + gfx::IntSize mCachedSize; + gfx::SurfaceFormat mCachedFormat; + + gfx::DataSourceSurface* GetTempSurface(const gfx::IntSize& aSize, + const gfx::SurfaceFormat aFormat); + + void DiscardTempSurface(); +}; + +} +} + +#endif