aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/ops/GrAADistanceFieldPathRenderer.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpu/ops/GrAADistanceFieldPathRenderer.h')
-rw-r--r--src/gpu/ops/GrAADistanceFieldPathRenderer.h102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/gpu/ops/GrAADistanceFieldPathRenderer.h b/src/gpu/ops/GrAADistanceFieldPathRenderer.h
new file mode 100644
index 0000000000..37c6099db3
--- /dev/null
+++ b/src/gpu/ops/GrAADistanceFieldPathRenderer.h
@@ -0,0 +1,102 @@
+/*
+ * 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 "GrBatchAtlas.h"
+#include "GrPathRenderer.h"
+#include "GrRect.h"
+#include "GrShape.h"
+
+#include "SkOpts.h"
+#include "SkTDynamicHash.h"
+
+class GrContext;
+
+class GrAADistanceFieldPathRenderer : public GrPathRenderer {
+public:
+ GrAADistanceFieldPathRenderer();
+ virtual ~GrAADistanceFieldPathRenderer();
+
+private:
+ StencilSupport onGetStencilSupport(const GrShape&) const override {
+ return GrPathRenderer::kNoSupport_StencilSupport;
+ }
+
+ bool onCanDrawPath(const CanDrawPathArgs&) const override;
+
+ bool onDrawPath(const DrawPathArgs&) override;
+
+ struct ShapeData {
+ class Key {
+ public:
+ Key() {}
+ Key(const Key& that) { *this = that; }
+ Key(const GrShape& shape, uint32_t dim) { this->set(shape, dim); }
+
+ Key& operator=(const Key& that) {
+ fKey.reset(that.fKey.count());
+ memcpy(fKey.get(), that.fKey.get(), fKey.count() * sizeof(uint32_t));
+ return *this;
+ }
+
+ void set(const GrShape& shape, uint32_t dim) {
+ // Shapes' keys are for their pre-style geometry, but by now we shouldn't have any
+ // relevant styling information.
+ SkASSERT(shape.style().isSimpleFill());
+ SkASSERT(shape.hasUnstyledKey());
+ int shapeKeySize = shape.unstyledKeySize();
+ fKey.reset(1 + shapeKeySize);
+ fKey[0] = dim;
+ shape.writeUnstyledKey(&fKey[1]);
+ }
+
+ bool operator==(const Key& that) const {
+ return fKey.count() == that.fKey.count() &&
+ 0 == memcmp(fKey.get(), that.fKey.get(), sizeof(uint32_t) * fKey.count());
+ }
+
+ int count32() const { return fKey.count(); }
+ const uint32_t* data() const { return fKey.get(); }
+
+ private:
+ // The key is composed of the dimensions of the DF generated for the path (32x32 max,
+ // 64x64 max, 128x128 max) and the GrShape's key.
+ SkAutoSTArray<24, uint32_t> fKey;
+ };
+ Key fKey;
+ GrBatchAtlas::AtlasID fID;
+ SkRect fBounds;
+ SkRect fTexCoords;
+ SK_DECLARE_INTERNAL_LLIST_INTERFACE(ShapeData);
+
+ static inline const Key& GetKey(const ShapeData& data) {
+ return data.fKey;
+ }
+
+ static inline uint32_t Hash(Key key) {
+ return SkOpts::hash(key.data(), sizeof(uint32_t) * key.count32());
+ }
+ };
+
+ static void HandleEviction(GrBatchAtlas::AtlasID, void*);
+
+ typedef SkTDynamicHash<ShapeData, ShapeData::Key> ShapeCache;
+ typedef SkTInternalLList<ShapeData> ShapeDataList;
+
+ std::unique_ptr<GrBatchAtlas> fAtlas;
+ ShapeCache fShapeCache;
+ ShapeDataList fShapeList;
+
+ typedef GrPathRenderer INHERITED;
+
+ friend class AADistanceFieldPathOp;
+ friend struct PathTestStruct;
+};
+
+#endif