Index: src/core/SkRemote.cpp |
diff --git a/src/core/SkRemote.cpp b/src/core/SkRemote.cpp |
index ff658ff20d146f92158d0b6eb00678bbc31124f7..bc89e6ff2a6f983c2526fc6c4ef063326e3d2052 100644 |
--- a/src/core/SkRemote.cpp |
+++ b/src/core/SkRemote.cpp |
@@ -5,8 +5,15 @@ |
* found in the LICENSE file. |
*/ |
+#include "SkAnnotation.h" |
#include "SkCanvas.h" |
+#include "SkColorFilter.h" |
+#include "SkDrawLooper.h" |
+#include "SkImageFilter.h" |
+#include "SkMaskFilter.h" |
#include "SkPath.h" |
+#include "SkPathEffect.h" |
+#include "SkRasterizer.h" |
#include "SkRect.h" |
#include "SkRemote.h" |
#include "SkShader.h" |
@@ -103,9 +110,54 @@ namespace SkRemote { |
const ID fID; |
}; |
+ // Like AutoID, but for CommonIDs. |
+ class AutoCommonIDs : ::SkNoncopyable { |
+ public: |
+ explicit AutoCommonIDs(Encoder* encoder, const SkPaint& paint) |
+ : fEncoder(encoder) { |
+ fIDs.misc = fEncoder->define(Misc::CreateFrom(paint)); |
+ fIDs.patheffect = fEncoder->define(paint.getPathEffect()); |
+ fIDs.shader = fEncoder->define(paint.getShader()); |
+ fIDs.xfermode = fEncoder->define(paint.getXfermode()); |
+ fIDs.maskfilter = fEncoder->define(paint.getMaskFilter()); |
+ fIDs.colorfilter = fEncoder->define(paint.getColorFilter()); |
+ fIDs.rasterizer = fEncoder->define(paint.getRasterizer()); |
+ fIDs.looper = fEncoder->define(paint.getLooper()); |
+ fIDs.imagefilter = fEncoder->define(paint.getImageFilter()); |
+ fIDs.annotation = fEncoder->define(paint.getAnnotation()); |
+ } |
+ ~AutoCommonIDs() { |
+ if (fEncoder) { |
+ fEncoder->undefine(fIDs.misc); |
+ fEncoder->undefine(fIDs.patheffect); |
+ fEncoder->undefine(fIDs.shader); |
+ fEncoder->undefine(fIDs.xfermode); |
+ fEncoder->undefine(fIDs.maskfilter); |
+ fEncoder->undefine(fIDs.colorfilter); |
+ fEncoder->undefine(fIDs.rasterizer); |
+ fEncoder->undefine(fIDs.looper); |
+ fEncoder->undefine(fIDs.imagefilter); |
+ fEncoder->undefine(fIDs.annotation); |
+ } |
+ } |
+ |
+ AutoCommonIDs(AutoCommonIDs&& o) : fEncoder(o.fEncoder), fIDs(o.fIDs) { |
+ o.fEncoder = nullptr; |
+ } |
+ AutoID& operator=(AutoID&&) = delete; |
+ |
+ operator Encoder::CommonIDs () const { return fIDs; } |
+ |
+ private: |
+ Encoder* fEncoder; |
+ Encoder::CommonIDs fIDs; |
+ }; |
+ |
template <typename T> |
AutoID id(const T& val) { return AutoID(fEncoder, val); } |
+ AutoCommonIDs commonIDs(const SkPaint& paint) { return AutoCommonIDs(fEncoder, paint); } |
+ |
void willSave() override { fEncoder-> save(); } |
void didRestore() override { fEncoder->restore(); } |
@@ -141,16 +193,14 @@ namespace SkRemote { |
} |
void onDrawPath(const SkPath& path, const SkPaint& paint) override { |
- auto p = this->id(path), |
- m = this->id(Misc::CreateFrom(paint)), |
- s = this->id(paint.getShader()), |
- x = this->id(paint.getXfermode()); |
+ auto common = this->commonIDs(paint); |
+ auto p = this->id(path); |
if (paint.getStyle() == SkPaint::kFill_Style) { |
- fEncoder->fillPath(p, m, s, x); |
+ fEncoder->fillPath(p, common); |
} else { |
// TODO: handle kStrokeAndFill_Style |
- fEncoder->strokePath(p, m, s, x, this->id(Stroke::CreateFrom(paint))); |
+ fEncoder->strokePath(p, common, this->id(Stroke::CreateFrom(paint))); |
} |
} |
@@ -223,24 +273,54 @@ namespace SkRemote { |
return id; |
} |
- ID define(const SkMatrix& v) override {return this->define(Type::kMatrix, &fMatrix, v);} |
- ID define(const Misc& v) override {return this->define(Type::kMisc, &fMisc, v);} |
- ID define(const SkPath& v) override {return this->define(Type::kPath, &fPath, v);} |
- ID define(const Stroke& v) override {return this->define(Type::kStroke, &fStroke, v);} |
- ID define(SkShader* v) override {return this->define(Type::kShader, &fShader, v);} |
- ID define(SkXfermode* v) override {return this->define(Type::kXfermode, &fXfermode, v);} |
+ #define O override |
+ ID define(const SkMatrix& v) O {return this->define(Type::kMatrix, &fMatrix, v);} |
+ ID define(const Misc& v) O {return this->define(Type::kMisc, &fMisc, v);} |
+ ID define(const SkPath& v) O {return this->define(Type::kPath, &fPath, v);} |
+ ID define(const Stroke& v) O {return this->define(Type::kStroke, &fStroke, v);} |
+ ID define(SkPathEffect* v) O {return this->define(Type::kPathEffect, &fPathEffect, v);} |
+ ID define(SkShader* v) O {return this->define(Type::kShader, &fShader, v);} |
+ ID define(SkXfermode* v) O {return this->define(Type::kXfermode, &fXfermode, v);} |
+ ID define(SkMaskFilter* v) O {return this->define(Type::kMaskFilter, &fMaskFilter, v);} |
+ ID define(SkColorFilter* v) O {return this->define(Type::kColorFilter, &fColorFilter, v);} |
+ ID define(SkRasterizer* v) O {return this->define(Type::kRasterizer, &fRasterizer, v);} |
+ ID define(SkDrawLooper* v) O {return this->define(Type::kDrawLooper, &fDrawLooper, v);} |
+ ID define(SkImageFilter* v) O {return this->define(Type::kImageFilter, &fImageFilter, v);} |
+ ID define(SkAnnotation* v) O {return this->define(Type::kAnnotation, &fAnnotation, v);} |
+ #undef O |
+ |
void undefine(ID id) override { |
switch(id.type()) { |
- case Type::kMatrix: return fMatrix .remove(id); |
- case Type::kMisc: return fMisc .remove(id); |
- case Type::kPath: return fPath .remove(id); |
- case Type::kStroke: return fStroke .remove(id); |
- case Type::kShader: return fShader .remove(id); |
- case Type::kXfermode: return fXfermode.remove(id); |
+ case Type::kMatrix: return fMatrix .remove(id); |
+ case Type::kMisc: return fMisc .remove(id); |
+ case Type::kPath: return fPath .remove(id); |
+ case Type::kStroke: return fStroke .remove(id); |
+ case Type::kPathEffect: return fPathEffect .remove(id); |
+ case Type::kShader: return fShader .remove(id); |
+ case Type::kXfermode: return fXfermode .remove(id); |
+ case Type::kMaskFilter: return fMaskFilter .remove(id); |
+ case Type::kColorFilter: return fColorFilter.remove(id); |
+ case Type::kRasterizer: return fRasterizer .remove(id); |
+ case Type::kDrawLooper: return fDrawLooper .remove(id); |
+ case Type::kImageFilter: return fImageFilter.remove(id); |
+ case Type::kAnnotation: return fAnnotation .remove(id); |
}; |
} |
+ void applyCommon(const CommonIDs& common, SkPaint* paint) const { |
+ fMisc.find(common.misc).applyTo(paint); |
+ paint->setPathEffect (fPathEffect .find(common.patheffect)); |
+ paint->setShader (fShader .find(common.shader)); |
+ paint->setXfermode (fXfermode .find(common.xfermode)); |
+ paint->setMaskFilter (fMaskFilter .find(common.maskfilter)); |
+ paint->setColorFilter(fColorFilter.find(common.colorfilter)); |
+ paint->setRasterizer (fRasterizer .find(common.rasterizer)); |
+ paint->setLooper (fDrawLooper .find(common.looper)); |
+ paint->setImageFilter(fImageFilter.find(common.imagefilter)); |
+ paint->setAnnotation (fAnnotation .find(common.annotation)); |
+ } |
+ |
void save() override { fCanvas->save(); } |
void restore() override { fCanvas->restore(); } |
@@ -249,21 +329,17 @@ namespace SkRemote { |
void clipPath(ID path, SkRegion::Op op, bool aa) override { |
fCanvas->clipPath(fPath.find(path), op, aa); |
} |
- void fillPath(ID path, ID misc, ID shader, ID xfermode) override { |
+ void fillPath(ID path, CommonIDs common) override { |
SkPaint paint; |
paint.setStyle(SkPaint::kFill_Style); |
- fMisc.find(misc).applyTo(&paint); |
- paint.setShader (fShader .find(shader)); |
- paint.setXfermode(fXfermode.find(xfermode)); |
+ this->applyCommon(common, &paint); |
fCanvas->drawPath(fPath.find(path), paint); |
} |
- void strokePath(ID path, ID misc, ID shader, ID xfermode, ID stroke) override { |
+ void strokePath(ID path, CommonIDs common, ID stroke) override { |
SkPaint paint; |
paint.setStyle(SkPaint::kStroke_Style); |
- fMisc .find(misc ).applyTo(&paint); |
+ this->applyCommon(common, &paint); |
fStroke.find(stroke).applyTo(&paint); |
- paint.setShader (fShader .find(shader)); |
- paint.setXfermode(fXfermode.find(xfermode)); |
fCanvas->drawPath(fPath.find(path), paint); |
} |
@@ -332,12 +408,19 @@ namespace SkRemote { |
}; |
- IDMap<SkMatrix , Type::kMatrix> fMatrix; |
- IDMap<Misc , Type::kMisc > fMisc; |
- IDMap<SkPath , Type::kPath > fPath; |
- IDMap<Stroke , Type::kStroke> fStroke; |
- ReffedIDMap<SkShader , Type::kShader> fShader; |
- ReffedIDMap<SkXfermode, Type::kXfermode> fXfermode; |
+ IDMap<SkMatrix , Type::kMatrix > fMatrix; |
+ IDMap<Misc , Type::kMisc > fMisc; |
+ IDMap<SkPath , Type::kPath > fPath; |
+ IDMap<Stroke , Type::kStroke > fStroke; |
+ ReffedIDMap<SkPathEffect , Type::kPathEffect > fPathEffect; |
+ ReffedIDMap<SkShader , Type::kShader > fShader; |
+ ReffedIDMap<SkXfermode , Type::kXfermode > fXfermode; |
+ ReffedIDMap<SkMaskFilter , Type::kMaskFilter > fMaskFilter; |
+ ReffedIDMap<SkColorFilter, Type::kColorFilter> fColorFilter; |
+ ReffedIDMap<SkRasterizer , Type::kRasterizer > fRasterizer; |
+ ReffedIDMap<SkDrawLooper , Type::kDrawLooper > fDrawLooper; |
+ ReffedIDMap<SkImageFilter, Type::kImageFilter> fImageFilter; |
+ ReffedIDMap<SkAnnotation , Type::kAnnotation > fAnnotation; |
SkCanvas* fCanvas; |
uint64_t fNextID = 0; |
@@ -360,12 +443,19 @@ namespace SkRemote { |
~CachingEncoder() override { |
Undef undef{fWrapped}; |
- fMatrix .foreach(undef); |
- fMisc .foreach(undef); |
- fPath .foreach(undef); |
- fStroke .foreach(undef); |
- fShader .foreach(undef); |
- fXfermode.foreach(undef); |
+ fMatrix .foreach(undef); |
+ fMisc .foreach(undef); |
+ fPath .foreach(undef); |
+ fPathEffect .foreach(undef); |
+ fStroke .foreach(undef); |
+ fShader .foreach(undef); |
+ fXfermode .foreach(undef); |
+ fMaskFilter .foreach(undef); |
+ fColorFilter.foreach(undef); |
+ fRasterizer .foreach(undef); |
+ fDrawLooper .foreach(undef); |
+ fImageFilter.foreach(undef); |
+ fAnnotation .foreach(undef); |
} |
template <typename Map, typename T> |
@@ -378,12 +468,19 @@ namespace SkRemote { |
return id; |
} |
- ID define(const SkMatrix& v) override { return this->define(&fMatrix, v); } |
- ID define(const Misc& v) override { return this->define(&fMisc, v); } |
- ID define(const SkPath& v) override { return this->define(&fPath, v); } |
- ID define(const Stroke& v) override { return this->define(&fStroke, v); } |
- ID define(SkShader* v) override { return this->define(&fShader, v); } |
- ID define(SkXfermode* v) override { return this->define(&fXfermode, v); } |
+ ID define(const SkMatrix& v) override { return this->define(&fMatrix , v); } |
+ ID define(const Misc& v) override { return this->define(&fMisc , v); } |
+ ID define(const SkPath& v) override { return this->define(&fPath , v); } |
+ ID define(const Stroke& v) override { return this->define(&fStroke , v); } |
+ ID define(SkPathEffect* v) override { return this->define(&fPathEffect , v); } |
+ ID define(SkShader* v) override { return this->define(&fShader , v); } |
+ ID define(SkXfermode* v) override { return this->define(&fXfermode , v); } |
+ ID define(SkMaskFilter* v) override { return this->define(&fMaskFilter , v); } |
+ ID define(SkColorFilter* v) override { return this->define(&fColorFilter, v); } |
+ ID define(SkRasterizer* v) override { return this->define(&fRasterizer , v); } |
+ ID define(SkDrawLooper* v) override { return this->define(&fDrawLooper , v); } |
+ ID define(SkImageFilter* v) override { return this->define(&fImageFilter, v); } |
+ ID define(SkAnnotation* v) override { return this->define(&fAnnotation , v); } |
void undefine(ID) override {} |
@@ -395,11 +492,11 @@ namespace SkRemote { |
void clipPath(ID path, SkRegion::Op op, bool aa) override { |
fWrapped->clipPath(path, op, aa); |
} |
- void fillPath(ID path, ID misc, ID shader, ID xfermode) override { |
- fWrapped->fillPath(path, misc, shader, xfermode); |
+ void fillPath(ID path, CommonIDs common) override { |
+ fWrapped->fillPath(path, common); |
} |
- void strokePath(ID path, ID misc, ID shader, ID xfermode, ID stroke) override { |
- fWrapped->strokePath(path, misc, shader, xfermode, stroke); |
+ void strokePath(ID path, CommonIDs common, ID stroke) override { |
+ fWrapped->strokePath(path, common, stroke); |
} |
// Maps const T* -> ID, and refs the key. |
@@ -431,12 +528,19 @@ namespace SkRemote { |
SkTHashMap<const T*, ID> fMap; |
}; |
- SkTHashMap<SkMatrix, ID> fMatrix; |
- SkTHashMap<Misc, ID, MiscHash> fMisc; |
- SkTHashMap<SkPath, ID> fPath; |
- SkTHashMap<Stroke, ID> fStroke; |
- RefKeyMap<SkShader, Type::kShader> fShader; |
- RefKeyMap<SkXfermode, Type::kXfermode> fXfermode; |
+ SkTHashMap<SkMatrix, ID> fMatrix; |
+ SkTHashMap<Misc, ID, MiscHash> fMisc; |
+ SkTHashMap<SkPath, ID> fPath; |
+ SkTHashMap<Stroke, ID> fStroke; |
+ RefKeyMap<SkPathEffect , Type::kPathEffect > fPathEffect; |
+ RefKeyMap<SkShader , Type::kShader > fShader; |
+ RefKeyMap<SkXfermode , Type::kXfermode > fXfermode; |
+ RefKeyMap<SkMaskFilter , Type::kMaskFilter > fMaskFilter; |
+ RefKeyMap<SkColorFilter, Type::kColorFilter> fColorFilter; |
+ RefKeyMap<SkRasterizer , Type::kRasterizer > fRasterizer; |
+ RefKeyMap<SkDrawLooper , Type::kDrawLooper > fDrawLooper; |
+ RefKeyMap<SkImageFilter, Type::kImageFilter> fImageFilter; |
+ RefKeyMap<SkAnnotation , Type::kAnnotation > fAnnotation; |
Encoder* fWrapped; |
}; |