| Index: src/core/SkRemote.h
|
| diff --git a/src/core/SkRemote.h b/src/core/SkRemote.h
|
| index 6e95f3a158d0425bbd7844df15870da4c791f28b..cbfcf9b3813153d137e0dd5f424a519d491de654 100644
|
| --- a/src/core/SkRemote.h
|
| +++ b/src/core/SkRemote.h
|
| @@ -18,7 +18,26 @@
|
| // TODO: document
|
|
|
| namespace SkRemote {
|
| - // TODO: document
|
| +
|
| + // General purpose identifier. Holds a Type and a 56-bit value.
|
| + class ID {
|
| + public:
|
| + ID() {}
|
| + ID(Type type, uint64_t val) {
|
| + fVal = (uint64_t)type << 56 | val;
|
| + SkASSERT(this->type() == type && this->val() == val);
|
| + }
|
| +
|
| + Type type() const { return (Type)(fVal >> 56); }
|
| + uint64_t val() const { return fVal & ~((uint64_t)0xFF << 56); }
|
| +
|
| + bool operator==(ID o) const { return fVal == o.fVal; }
|
| +
|
| + private:
|
| + uint64_t fVal;
|
| + };
|
| +
|
| + // Fields from SkPaint used by stroke, fill, and text draws.
|
| struct Misc {
|
| SkColor fColor;
|
| SkFilterQuality fFilterQuality;
|
| @@ -28,7 +47,7 @@ namespace SkRemote {
|
| void applyTo(SkPaint*) const;
|
| };
|
|
|
| - // TODO: document
|
| + // Fields from SkPaint used by stroke draws only.
|
| struct Stroke {
|
| SkScalar fWidth, fMiter;
|
| SkPaint::Cap fCap;
|
| @@ -42,12 +61,14 @@ namespace SkRemote {
|
| struct Encoder {
|
| virtual ~Encoder() {}
|
|
|
| - virtual void define(ID, const SkMatrix&) = 0;
|
| - virtual void define(ID, const Misc&) = 0;
|
| - virtual void define(ID, const SkPath&) = 0;
|
| - virtual void define(ID, const Stroke&) = 0;
|
| - virtual void define(ID, SkShader*) = 0;
|
| - virtual void define(ID, SkXfermode*) = 0;
|
| + static Encoder* CreateCachingEncoder(Encoder*);
|
| +
|
| + virtual ID define(const SkMatrix&) = 0;
|
| + virtual ID define(const Misc&) = 0;
|
| + virtual ID define(const SkPath&) = 0;
|
| + virtual ID define(const Stroke&) = 0;
|
| + virtual ID define(SkShader*) = 0;
|
| + virtual ID define(SkXfermode*) = 0;
|
|
|
| virtual void undefine(ID) = 0;
|
|
|
| @@ -64,41 +85,17 @@ namespace SkRemote {
|
| virtual void strokePath(ID path, ID misc, ID shader, ID xfermode, ID stroke) = 0;
|
| };
|
|
|
| - class LookupScope;
|
| -
|
| - // The Cache interface encapsulates the caching logic of the Client.
|
| - //
|
| - // Each lookup() method must always fill ID* with a valid value,
|
| - // but ID may be cached. If so, the lookup() method returns true;
|
| - // if not the lookup() method returns false and the Client must
|
| - // then define() this ID -> Thing mapping before using the ID.
|
| - //
|
| - // The Caches may also add IDs to the LookupScope's list of IDs to
|
| - // undefine() on destruction. This lets the Cache purge IDs.
|
| - struct Cache {
|
| - virtual ~Cache() {}
|
| -
|
| - static Cache* CreateNeverCache(); // Never caches anything.
|
| - static Cache* CreateAlwaysCache(); // Caches by value (not deep pointer equality).
|
| - // TODO: static Cache* CreateDeepCache(); // Caches by deep value.
|
| -
|
| - virtual bool lookup(const SkMatrix&, ID*, LookupScope*) = 0;
|
| - virtual bool lookup(const Misc&, ID*, LookupScope*) = 0;
|
| - virtual bool lookup(const SkPath&, ID*, LookupScope*) = 0;
|
| - virtual bool lookup(const Stroke&, ID*, LookupScope*) = 0;
|
| - virtual bool lookup(const SkShader*, ID*, LookupScope*) = 0;
|
| - virtual bool lookup(const SkXfermode*, ID*, LookupScope*) = 0;
|
| -
|
| - virtual void cleanup(Encoder*) = 0;
|
| - };
|
| -
|
| - // TODO: document
|
| + // An SkCanvas that translates to Encoder calls.
|
| class Client final : public SkCanvas {
|
| public:
|
| - Client(Cache*, Encoder*);
|
| - ~Client();
|
| + explicit Client(Encoder*);
|
|
|
| private:
|
| + class AutoID;
|
| +
|
| + template <typename T>
|
| + AutoID id(const T&);
|
| +
|
| void willSave() override;
|
| void didRestore() override;
|
|
|
| @@ -123,22 +120,21 @@ namespace SkRemote {
|
| void onDrawPosTextH(const void*, size_t, const SkScalar[], SkScalar,
|
| const SkPaint&) override;
|
|
|
| - Cache* fCache;
|
| Encoder* fEncoder;
|
| };
|
|
|
| - // TODO: document
|
| + // An Encoder that translates back to SkCanvas calls.
|
| class Server final : public Encoder {
|
| public:
|
| explicit Server(SkCanvas*);
|
|
|
| private:
|
| - void define(ID, const SkMatrix&) override;
|
| - void define(ID, const Misc&) override;
|
| - void define(ID, const SkPath&) override;
|
| - void define(ID, const Stroke&) override;
|
| - void define(ID, SkShader*) override;
|
| - void define(ID, SkXfermode*) override;
|
| + ID define(const SkMatrix&) override;
|
| + ID define(const Misc&) override;
|
| + ID define(const SkPath&) override;
|
| + ID define(const Stroke&) override;
|
| + ID define(SkShader*) override;
|
| + ID define(SkXfermode*) override;
|
|
|
| void undefine(ID) override;
|
|
|
| @@ -185,25 +181,22 @@ namespace SkRemote {
|
| template <typename T, Type kType>
|
| class ReffedIDMap {
|
| public:
|
| - ReffedIDMap() {
|
| - // A null ID always maps to nullptr.
|
| - fMap.set(ID(kType), nullptr);
|
| - }
|
| + ReffedIDMap() {}
|
| ~ReffedIDMap() {
|
| // A well-behaved client always cleans up its definitions.
|
| - SkASSERT(fMap.count() == 1);
|
| + SkASSERT(fMap.count() == 0);
|
| }
|
|
|
| void set(const ID& id, T* val) {
|
| - SkASSERT(id.type() == kType && val);
|
| - fMap.set(id, SkRef(val));
|
| + SkASSERT(id.type() == kType);
|
| + fMap.set(id, SkSafeRef(val));
|
| }
|
|
|
| void remove(const ID& id) {
|
| SkASSERT(id.type() == kType);
|
| T** val = fMap.find(id);
|
| - SkASSERT(val && *val);
|
| - (*val)->unref();
|
| + SkASSERT(val);
|
| + SkSafeUnref(*val);
|
| fMap.remove(id);
|
| }
|
|
|
| @@ -218,6 +211,9 @@ namespace SkRemote {
|
| SkTHashMap<ID, T*> fMap;
|
| };
|
|
|
| + template <typename Map, typename T>
|
| + ID define(Type, Map*, const T&);
|
| +
|
| IDMap<SkMatrix, Type::kMatrix> fMatrix;
|
| IDMap<Misc , Type::kMisc > fMisc;
|
| IDMap<SkPath , Type::kPath > fPath;
|
| @@ -226,6 +222,7 @@ namespace SkRemote {
|
| ReffedIDMap<SkXfermode, Type::kXfermode> fXfermode;
|
|
|
| SkCanvas* fCanvas;
|
| + uint64_t fNextID = 0;
|
| };
|
|
|
| } // namespace SkRemote
|
|
|