aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/GrAADistanceFieldPathRenderer.h
diff options
context:
space:
mode:
authorGravatar jvanverth <jvanverth@google.com>2014-10-06 05:59:05 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2014-10-06 05:59:05 -0700
commitfa38a30897ceda3e93355d69b8a6812c823f41f6 (patch)
treeb6aa8289db50f397333a03d000f58a696acd3775 /src/gpu/GrAADistanceFieldPathRenderer.h
parent2f6628e69cd47e81d44af8c340e57d76e36fd1d6 (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-xsrc/gpu/GrAADistanceFieldPathRenderer.h77
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