diff -r 000000000000 -r 6474c204b198 gfx/2d/DrawTargetSkia.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/2d/DrawTargetSkia.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,142 @@ +/* -*- Mode: C++; tab-width: 20; 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 _MOZILLA_GFX_SOURCESURFACESKIA_H +#define _MOZILLA_GFX_SOURCESURFACESKIA_H + +#ifdef USE_SKIA_GPU +#include "skia/GrContext.h" +#include "skia/GrGLInterface.h" +#endif + +#include "skia/SkCanvas.h" + +#include "2D.h" +#include "Rect.h" +#include "PathSkia.h" +#include +#include + +namespace mozilla { +namespace gfx { + +class SourceSurfaceSkia; + +class DrawTargetSkia : public DrawTarget +{ +public: + MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(DrawTargetSkia) + DrawTargetSkia(); + virtual ~DrawTargetSkia(); + + virtual BackendType GetType() const { return BackendType::SKIA; } + virtual TemporaryRef Snapshot(); + virtual IntSize GetSize() { return mSize; } + virtual void Flush(); + virtual void DrawSurface(SourceSurface *aSurface, + const Rect &aDest, + const Rect &aSource, + const DrawSurfaceOptions &aSurfOptions = DrawSurfaceOptions(), + const DrawOptions &aOptions = DrawOptions()); + virtual void DrawFilter(FilterNode *aNode, + const Rect &aSourceRect, + const Point &aDestPoint, + const DrawOptions &aOptions = DrawOptions()); + virtual void DrawSurfaceWithShadow(SourceSurface *aSurface, + const Point &aDest, + const Color &aColor, + const Point &aOffset, + Float aSigma, + CompositionOp aOperator); + virtual void ClearRect(const Rect &aRect); + virtual void CopySurface(SourceSurface *aSurface, + const IntRect &aSourceRect, + const IntPoint &aDestination); + virtual void FillRect(const Rect &aRect, + const Pattern &aPattern, + const DrawOptions &aOptions = DrawOptions()); + virtual void StrokeRect(const Rect &aRect, + const Pattern &aPattern, + const StrokeOptions &aStrokeOptions = StrokeOptions(), + const DrawOptions &aOptions = DrawOptions()); + virtual void StrokeLine(const Point &aStart, + const Point &aEnd, + const Pattern &aPattern, + const StrokeOptions &aStrokeOptions = StrokeOptions(), + const DrawOptions &aOptions = DrawOptions()); + virtual void Stroke(const Path *aPath, + const Pattern &aPattern, + const StrokeOptions &aStrokeOptions = StrokeOptions(), + const DrawOptions &aOptions = DrawOptions()); + virtual void Fill(const Path *aPath, + const Pattern &aPattern, + const DrawOptions &aOptions = DrawOptions()); + virtual void FillGlyphs(ScaledFont *aFont, + const GlyphBuffer &aBuffer, + const Pattern &aPattern, + const DrawOptions &aOptions = DrawOptions(), + const GlyphRenderingOptions *aRenderingOptions = nullptr); + virtual void Mask(const Pattern &aSource, + const Pattern &aMask, + const DrawOptions &aOptions = DrawOptions()); + virtual void MaskSurface(const Pattern &aSource, + SourceSurface *aMask, + Point aOffset, + const DrawOptions &aOptions = DrawOptions()); + virtual void PushClip(const Path *aPath); + virtual void PushClipRect(const Rect& aRect); + virtual void PopClip(); + virtual TemporaryRef CreateSourceSurfaceFromData(unsigned char *aData, + const IntSize &aSize, + int32_t aStride, + SurfaceFormat aFormat) const; + virtual TemporaryRef OptimizeSourceSurface(SourceSurface *aSurface) const; + virtual TemporaryRef + CreateSourceSurfaceFromNativeSurface(const NativeSurface &aSurface) const; + virtual TemporaryRef + CreateSimilarDrawTarget(const IntSize &aSize, SurfaceFormat aFormat) const; + virtual TemporaryRef CreatePathBuilder(FillRule aFillRule = FillRule::FILL_WINDING) const; + virtual TemporaryRef CreateGradientStops(GradientStop *aStops, uint32_t aNumStops, ExtendMode aExtendMode = ExtendMode::CLAMP) const; + virtual TemporaryRef CreateFilter(FilterType aType); + virtual void SetTransform(const Matrix &aTransform); + virtual void *GetNativeSurface(NativeSurfaceType aType); + + bool Init(const IntSize &aSize, SurfaceFormat aFormat); + void Init(unsigned char* aData, const IntSize &aSize, int32_t aStride, SurfaceFormat aFormat); + +#ifdef USE_SKIA_GPU + bool InitWithGrContext(GrContext* aGrContext, + const IntSize &aSize, + SurfaceFormat aFormat) MOZ_OVERRIDE; +#endif + + operator std::string() const { + std::stringstream stream; + stream << "DrawTargetSkia(" << this << ")"; + return stream.str(); + } + +private: + friend class SourceSurfaceSkia; + void SnapshotDestroyed(); + + void MarkChanged(); + + SkRect SkRectCoveringWholeSurface() const; + +#ifdef USE_SKIA_GPU + SkRefPtr mGrContext; + uint32_t mTexture; +#endif + + IntSize mSize; + SkRefPtr mCanvas; + SourceSurfaceSkia* mSnapshot; +}; + +} +} + +#endif // _MOZILLA_GFX_SOURCESURFACESKIA_H