| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #ifndef SkRemote_DEFINED | 8 #ifndef SkRemote_DEFINED |
| 9 #define SkRemote_DEFINED | 9 #define SkRemote_DEFINED |
| 10 | 10 |
| 11 #include "SkCanvas.h" | |
| 12 #include "SkPaint.h" | 11 #include "SkPaint.h" |
| 12 #include "SkRegion.h" |
| 13 #include "SkRemote_protocol.h" | 13 #include "SkRemote_protocol.h" |
| 14 #include "SkShader.h" | |
| 15 #include "SkTHash.h" | |
| 16 #include "SkTypes.h" | 14 #include "SkTypes.h" |
| 17 | 15 |
| 16 class SkCanvas; |
| 17 class SkMatrix; |
| 18 class SkPath; |
| 19 class SkShader; |
| 20 class SkXfermode; |
| 21 |
| 18 // TODO: document | 22 // TODO: document |
| 19 | 23 |
| 20 namespace SkRemote { | 24 namespace SkRemote { |
| 21 | 25 |
| 22 // General purpose identifier. Holds a Type and a 56-bit value. | 26 // General purpose identifier. Holds a Type and a 56-bit value. |
| 23 class ID { | 27 class ID { |
| 24 public: | 28 public: |
| 25 ID() {} | 29 ID() {} |
| 26 ID(Type type, uint64_t val) { | 30 ID(Type type, uint64_t val) { |
| 27 fVal = (uint64_t)type << 56 | val; | 31 fVal = (uint64_t)type << 56 | val; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 54 SkPaint::Join fJoin; | 58 SkPaint::Join fJoin; |
| 55 | 59 |
| 56 static Stroke CreateFrom(const SkPaint&); | 60 static Stroke CreateFrom(const SkPaint&); |
| 57 void applyTo(SkPaint*) const; | 61 void applyTo(SkPaint*) const; |
| 58 }; | 62 }; |
| 59 | 63 |
| 60 // TODO: document | 64 // TODO: document |
| 61 struct Encoder { | 65 struct Encoder { |
| 62 virtual ~Encoder() {} | 66 virtual ~Encoder() {} |
| 63 | 67 |
| 64 static Encoder* CreateCachingEncoder(Encoder*); | |
| 65 | |
| 66 virtual ID define(const SkMatrix&) = 0; | 68 virtual ID define(const SkMatrix&) = 0; |
| 67 virtual ID define(const Misc&) = 0; | 69 virtual ID define(const Misc&) = 0; |
| 68 virtual ID define(const SkPath&) = 0; | 70 virtual ID define(const SkPath&) = 0; |
| 69 virtual ID define(const Stroke&) = 0; | 71 virtual ID define(const Stroke&) = 0; |
| 70 virtual ID define(SkShader*) = 0; | 72 virtual ID define(SkShader*) = 0; |
| 71 virtual ID define(SkXfermode*) = 0; | 73 virtual ID define(SkXfermode*) = 0; |
| 72 | 74 |
| 73 virtual void undefine(ID) = 0; | 75 virtual void undefine(ID) = 0; |
| 74 | 76 |
| 75 virtual void save() = 0; | 77 virtual void save() = 0; |
| 76 virtual void restore() = 0; | 78 virtual void restore() = 0; |
| 77 | 79 |
| 78 virtual void setMatrix(ID matrix) = 0; | 80 virtual void setMatrix(ID matrix) = 0; |
| 79 | 81 |
| 80 // TODO: struct CommonIDs { ID misc, shader, xfermode; ... } | 82 // TODO: struct CommonIDs { ID misc, shader, xfermode; ... } |
| 81 // for IDs that affect both fill + stroke? | 83 // for IDs that affect both fill + stroke? |
| 82 | 84 |
| 83 virtual void clipPath(ID path, SkRegion::Op, bool aa)
= 0; | 85 virtual void clipPath(ID path, SkRegion::Op, bool aa)
= 0; |
| 84 virtual void fillPath(ID path, ID misc, ID shader, ID xfermode)
= 0; | 86 virtual void fillPath(ID path, ID misc, ID shader, ID xfermode)
= 0; |
| 85 virtual void strokePath(ID path, ID misc, ID shader, ID xfermode, ID str
oke) = 0; | 87 virtual void strokePath(ID path, ID misc, ID shader, ID xfermode, ID str
oke) = 0; |
| 86 }; | 88 }; |
| 87 | 89 |
| 88 // An SkCanvas that translates to Encoder calls. | 90 // None of these factories take ownership of their arguments. |
| 89 class Client final : public SkCanvas { | |
| 90 public: | |
| 91 explicit Client(Encoder*); | |
| 92 | 91 |
| 93 private: | 92 // Returns a new SkCanvas that translates to the Encoder API. |
| 94 class AutoID; | 93 SkCanvas* NewCanvas(Encoder*); |
| 95 | 94 // Returns an Encoder that translates back to the SkCanvas API. |
| 96 template <typename T> | 95 Encoder* NewDecoder(SkCanvas*); |
| 97 AutoID id(const T&); | 96 // Wraps another Encoder with a cache. TODO: parameterize |
| 98 | 97 Encoder* NewCachingEncoder(Encoder*); |
| 99 void willSave() override; | |
| 100 void didRestore() override; | |
| 101 | |
| 102 void didConcat(const SkMatrix&) override; | |
| 103 void didSetMatrix(const SkMatrix&) override; | |
| 104 | |
| 105 void onClipPath (const SkPath&, SkRegion::Op, ClipEdgeStyle) override; | |
| 106 void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) override; | |
| 107 void onClipRect (const SkRect&, SkRegion::Op, ClipEdgeStyle) override; | |
| 108 | |
| 109 void onDrawOval(const SkRect&, const SkPaint&) override; | |
| 110 void onDrawRRect(const SkRRect&, const SkPaint&) override; | |
| 111 void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) overri
de; | |
| 112 void onDrawPath(const SkPath&, const SkPaint&) override; | |
| 113 void onDrawRect(const SkRect&, const SkPaint&) override; | |
| 114 void onDrawPaint(const SkPaint&) override; | |
| 115 | |
| 116 void onDrawText(const void*, size_t, SkScalar, | |
| 117 SkScalar, const SkPaint&) override; | |
| 118 void onDrawPosText(const void*, size_t, const SkPoint[], | |
| 119 const SkPaint&) override; | |
| 120 void onDrawPosTextH(const void*, size_t, const SkScalar[], SkScalar, | |
| 121 const SkPaint&) override; | |
| 122 | |
| 123 Encoder* fEncoder; | |
| 124 }; | |
| 125 | |
| 126 // An Encoder that translates back to SkCanvas calls. | |
| 127 class Server final : public Encoder { | |
| 128 public: | |
| 129 explicit Server(SkCanvas*); | |
| 130 | |
| 131 private: | |
| 132 ID define(const SkMatrix&) override; | |
| 133 ID define(const Misc&) override; | |
| 134 ID define(const SkPath&) override; | |
| 135 ID define(const Stroke&) override; | |
| 136 ID define(SkShader*) override; | |
| 137 ID define(SkXfermode*) override; | |
| 138 | |
| 139 void undefine(ID) override; | |
| 140 | |
| 141 void save() override; | |
| 142 void restore() override; | |
| 143 | |
| 144 void setMatrix(ID matrix) override; | |
| 145 | |
| 146 void clipPath(ID path, SkRegion::Op, bool aa) ove
rride; | |
| 147 void fillPath(ID path, ID misc, ID shader, ID xfermode) ove
rride; | |
| 148 void strokePath(ID path, ID misc, ID shader, ID xfermode, ID stroke) ove
rride; | |
| 149 | |
| 150 // Maps ID -> T. | |
| 151 template <typename T, Type kType> | |
| 152 class IDMap { | |
| 153 public: | |
| 154 ~IDMap() { | |
| 155 // A well-behaved client always cleans up its definitions. | |
| 156 SkASSERT(fMap.count() == 0); | |
| 157 } | |
| 158 | |
| 159 void set(const ID& id, const T& val) { | |
| 160 SkASSERT(id.type() == kType); | |
| 161 fMap.set(id, val); | |
| 162 } | |
| 163 | |
| 164 void remove(const ID& id) { | |
| 165 SkASSERT(id.type() == kType); | |
| 166 fMap.remove(id); | |
| 167 } | |
| 168 | |
| 169 const T& find(const ID& id) const { | |
| 170 SkASSERT(id.type() == kType); | |
| 171 T* val = fMap.find(id); | |
| 172 SkASSERT(val != nullptr); | |
| 173 return *val; | |
| 174 } | |
| 175 | |
| 176 private: | |
| 177 SkTHashMap<ID, T> fMap; | |
| 178 }; | |
| 179 | |
| 180 // Maps ID -> T*, and keeps the T alive by reffing it. | |
| 181 template <typename T, Type kType> | |
| 182 class ReffedIDMap { | |
| 183 public: | |
| 184 ReffedIDMap() {} | |
| 185 ~ReffedIDMap() { | |
| 186 // A well-behaved client always cleans up its definitions. | |
| 187 SkASSERT(fMap.count() == 0); | |
| 188 } | |
| 189 | |
| 190 void set(const ID& id, T* val) { | |
| 191 SkASSERT(id.type() == kType); | |
| 192 fMap.set(id, SkSafeRef(val)); | |
| 193 } | |
| 194 | |
| 195 void remove(const ID& id) { | |
| 196 SkASSERT(id.type() == kType); | |
| 197 T** val = fMap.find(id); | |
| 198 SkASSERT(val); | |
| 199 SkSafeUnref(*val); | |
| 200 fMap.remove(id); | |
| 201 } | |
| 202 | |
| 203 T* find(const ID& id) const { | |
| 204 SkASSERT(id.type() == kType); | |
| 205 T** val = fMap.find(id); | |
| 206 SkASSERT(val); | |
| 207 return *val; | |
| 208 } | |
| 209 | |
| 210 private: | |
| 211 SkTHashMap<ID, T*> fMap; | |
| 212 }; | |
| 213 | |
| 214 template <typename Map, typename T> | |
| 215 ID define(Type, Map*, const T&); | |
| 216 | |
| 217 IDMap<SkMatrix, Type::kMatrix> fMatrix; | |
| 218 IDMap<Misc , Type::kMisc > fMisc; | |
| 219 IDMap<SkPath , Type::kPath > fPath; | |
| 220 IDMap<Stroke , Type::kStroke> fStroke; | |
| 221 ReffedIDMap<SkShader, Type::kShader> fShader; | |
| 222 ReffedIDMap<SkXfermode, Type::kXfermode> fXfermode; | |
| 223 | |
| 224 SkCanvas* fCanvas; | |
| 225 uint64_t fNextID = 0; | |
| 226 }; | |
| 227 | 98 |
| 228 } // namespace SkRemote | 99 } // namespace SkRemote |
| 229 | 100 |
| 230 #endif//SkRemote_DEFINED | 101 #endif//SkRemote_DEFINED |
| OLD | NEW |