diff --git a/gfx/2d/2D.h b/gfx/2d/2D.h index 117091e244aa..c02d31991b53 100644 --- a/gfx/2d/2D.h +++ b/gfx/2d/2D.h @@ -937,6 +937,10 @@ public: static TemporaryRef CreateDrawTargetForCairoSurface(cairo_surface_t* aSurface, const IntSize& aSize); + static TemporaryRef + CreateSourceSurfaceForCairoSurface(cairo_surface_t* aSurface, + SurfaceFormat aFormat); + static TemporaryRef CreateDrawTarget(BackendType aBackend, const IntSize &aSize, SurfaceFormat aFormat); diff --git a/gfx/2d/DrawTargetCairo.cpp b/gfx/2d/DrawTargetCairo.cpp index 3f4c7f8b5c65..e2f09ff72726 100644 --- a/gfx/2d/DrawTargetCairo.cpp +++ b/gfx/2d/DrawTargetCairo.cpp @@ -1061,6 +1061,20 @@ DrawTargetCairo::CreateSourceSurfaceFromNativeSurface(const NativeSurface &aSurf return nullptr; } +TemporaryRef +DrawTargetCairo::CreateSourceSurfaceForCairoSurface(cairo_surface_t *aSurface, + SurfaceFormat aFormat) +{ + IntSize size; + if (GetCairoSurfaceSize(aSurface, size)) { + RefPtr source = + new SourceSurfaceCairo(aSurface, size, aFormat); + return source; + } + + return nullptr; +} + TemporaryRef DrawTargetCairo::CreateSimilarDrawTarget(const IntSize &aSize, SurfaceFormat aFormat) const { diff --git a/gfx/2d/DrawTargetCairo.h b/gfx/2d/DrawTargetCairo.h index 22a006fe27fc..2683e7397000 100644 --- a/gfx/2d/DrawTargetCairo.h +++ b/gfx/2d/DrawTargetCairo.h @@ -157,6 +157,10 @@ public: static cairo_surface_t *GetDummySurface(); + static TemporaryRef + CreateSourceSurfaceForCairoSurface(cairo_surface_t* aSurface, + SurfaceFormat aFormat); + private: // methods // Init cairo surface without doing a cairo_surface_reference() call. bool InitAlreadyReferenced(cairo_surface_t* aSurface, const IntSize& aSize); diff --git a/gfx/2d/Factory.cpp b/gfx/2d/Factory.cpp index ada8002e1059..287ab3a1e652 100644 --- a/gfx/2d/Factory.cpp +++ b/gfx/2d/Factory.cpp @@ -554,6 +554,18 @@ Factory::CreateDrawTargetForCairoSurface(cairo_surface_t* aSurface, const IntSiz return retVal; } +TemporaryRef +Factory::CreateSourceSurfaceForCairoSurface(cairo_surface_t* aSurface, + SurfaceFormat aFormat) +{ + RefPtr retVal; + +#ifdef USE_CAIRO + retVal = DrawTargetCairo::CreateSourceSurfaceForCairoSurface(aSurface, aFormat); +#endif + return retVal; +} + #ifdef XP_MACOSX TemporaryRef Factory::CreateDrawTargetForCairoCGContext(CGContextRef cg, const IntSize& aSize)