diff options
author | 2014-10-06 05:59:05 -0700 | |
---|---|---|
committer | 2014-10-06 05:59:05 -0700 | |
commit | fa38a30897ceda3e93355d69b8a6812c823f41f6 (patch) | |
tree | b6aa8289db50f397333a03d000f58a696acd3775 /src/gpu/GrAADistanceFieldPathRenderer.h | |
parent | 2f6628e69cd47e81d44af8c340e57d76e36fd1d6 (diff) |
Add GrAASmallPathRenderer.
Uses cached signed distance fields to render scaled and rotated versions
of small paths.
BUG=skia:2935
Review URL: https://codereview.chromium.org/589103004
Diffstat (limited to 'src/gpu/GrAADistanceFieldPathRenderer.h')
-rwxr-xr-x | src/gpu/GrAADistanceFieldPathRenderer.h | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/src/gpu/GrAADistanceFieldPathRenderer.h b/src/gpu/GrAADistanceFieldPathRenderer.h new file mode 100755 index 0000000000..4c09f127c9 --- /dev/null +++ b/src/gpu/GrAADistanceFieldPathRenderer.h @@ -0,0 +1,77 @@ + +/* + * Copyright 2014 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef GrAADistanceFieldPathRenderer_DEFINED +#define GrAADistanceFieldPathRenderer_DEFINED + +#include "GrAllocPool.h" +#include "GrAtlas.h" +#include "GrPathRenderer.h" +#include "GrRect.h" + +#include "SkChecksum.h" + +class GrContext; +class GrPlot; + +class GrAADistanceFieldPathRenderer : public GrPathRenderer { +public: + GrAADistanceFieldPathRenderer(GrContext* context) + : fContext(context) + , fAtlas(NULL) { + } + + virtual ~GrAADistanceFieldPathRenderer(); + + virtual bool canDrawPath(const SkPath& path, + const SkStrokeRec& stroke, + const GrDrawTarget* target, + bool antiAlias) const SK_OVERRIDE; + +protected: + virtual StencilSupport onGetStencilSupport(const SkPath&, + const SkStrokeRec&, + const GrDrawTarget*) const SK_OVERRIDE; + + virtual bool onDrawPath(const SkPath& path, + const SkStrokeRec& stroke, + GrDrawTarget* target, + bool antiAlias) SK_OVERRIDE; + +private: + struct PathData { + uint32_t fGenID; + GrPlot* fPlot; + SkRect fBounds; + SkIPoint16 fAtlasLocation; + SK_DECLARE_INTERNAL_LLIST_INTERFACE(PathData); + + static inline const uint32_t& GetKey(const PathData& data) { + return data.fGenID; + } + + static inline uint32_t Hash(uint32_t key) { + return SkChecksum::Murmur3(&key, sizeof(key)); + } + }; + typedef SkTInternalLList<PathData> PathDataList; + + GrContext* fContext; + GrAtlas* fAtlas; + GrAtlas::ClientPlotUsage fPlotUsage; + SkTDynamicHash<PathData, uint32_t> fPathCache; + PathDataList fPathList; + + bool internalDrawPath(const SkPath& path, const PathData* pathData, GrDrawTarget* target); + PathData* addPathToAtlas(const SkPath& path, const SkStrokeRec& stroke, bool antiAlias); + bool freeUnusedPlot(); + + typedef GrPathRenderer INHERITED; +}; + +#endif |