/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* 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_SOURCESURFACED2D1_H_ #define MOZILLA_GFX_SOURCESURFACED2D1_H_ #include "2D.h" #include "HelpersD2D.h" #include #include #include namespace mozilla { namespace gfx { class DrawTargetD2D1; class SourceSurfaceD2D1 : public SourceSurface { public: MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(SourceSurfaceD2D1, override) SourceSurfaceD2D1(ID2D1Image* aImage, ID2D1DeviceContext* aDC, SurfaceFormat aFormat, const IntSize& aSize, DrawTargetD2D1* aDT = nullptr); ~SourceSurfaceD2D1(); SurfaceType GetType() const override { return SurfaceType::D2D1_1_IMAGE; } IntSize GetSize() const override { return mSize; } SurfaceFormat GetFormat() const override { return mFormat; } bool IsValid() const override; already_AddRefed GetDataSurface() override; ID2D1Image* GetImage() { return mImage; } void EnsureIndependent() { if (!mDrawTarget) return; DrawTargetWillChange(); } private: friend class DrawTargetD2D1; bool EnsureRealizedBitmap(); // This function is called by the draw target this texture belongs to when // it is about to be changed. The texture will be required to make a copy // of itself when this happens. void DrawTargetWillChange(); // This will mark the surface as no longer depending on its drawtarget, // this may happen on destruction or copying. void MarkIndependent(); RefPtr mImage; // This may be null if we were created for a non-bitmap image and have not // had a reason yet to realize ourselves. RefPtr mRealizedBitmap; RefPtr mDC; // Keep this around to verify whether out image is still valid in the future. RefPtr mDevice; const SurfaceFormat mFormat; const IntSize mSize; DrawTargetD2D1* mDrawTarget; std::shared_ptr mSnapshotLock; bool mOwnsCopy; }; class DataSourceSurfaceD2D1 : public DataSourceSurface { public: MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(DataSourceSurfaceD2D1, override) DataSourceSurfaceD2D1(ID2D1Bitmap1* aMappableBitmap, SurfaceFormat aFormat); ~DataSourceSurfaceD2D1(); SurfaceType GetType() const override { return SurfaceType::DATA; } IntSize GetSize() const override; SurfaceFormat GetFormat() const override { return mFormat; } bool IsValid() const override { return !!mBitmap; } uint8_t* GetData() override; int32_t Stride() override; bool Map(MapType, MappedSurface* aMappedSurface) override; void Unmap() override; private: friend class SourceSurfaceD2DTarget; void EnsureMapped(); mutable RefPtr mBitmap; SurfaceFormat mFormat; D2D1_MAPPED_RECT mMap; bool mIsMapped; bool mImplicitMapped; }; } // namespace gfx } // namespace mozilla #endif /* MOZILLA_GFX_SOURCESURFACED2D2TARGET_H_ */