1 /* 2 * Copyright 2015 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkRemote_DEFINED 9 #define SkRemote_DEFINED 10 11 #include "SkPaint.h" 12 #include "SkRegion.h" 13 #include "SkRemote_protocol.h" 14 #include "SkTypes.h" 15 16 class SkCanvas; 17 class SkMatrix; 18 class SkPath; 19 class SkShader; 20 class SkTextBlob; 21 class SkXfermode; 22 23 // TODO: document 24 25 namespace SkRemote { 26 27 // General purpose identifier. Holds a Type and a 56-bit value. 28 class ID { 29 public: ID()30 ID() {} ID(Type type,uint64_t val)31 ID(Type type, uint64_t val) { 32 fVal = (uint64_t)type << 56 | val; 33 SkASSERT(this->type() == type && this->val() == val); 34 } 35 type()36 Type type() const { return (Type)(fVal >> 56); } val()37 uint64_t val() const { return fVal & ~((uint64_t)0xFF << 56); } 38 39 bool operator==(ID o) const { return fVal == o.fVal; } 40 41 private: 42 uint64_t fVal; 43 }; 44 45 // Fields from SkPaint used by stroke, fill, and text draws. 46 struct Misc { 47 SkColor fColor; 48 SkFilterQuality fFilterQuality; 49 bool fAntiAlias, fDither; 50 51 static Misc CreateFrom(const SkPaint&); 52 void applyTo(SkPaint*) const; 53 }; 54 55 // Fields from SkPaint used by stroke draws only. 56 struct Stroke { 57 SkScalar fWidth, fMiter; 58 SkPaint::Cap fCap; 59 SkPaint::Join fJoin; 60 61 static Stroke CreateFrom(const SkPaint&); 62 void applyTo(SkPaint*) const; 63 }; 64 65 // TODO: document 66 struct Encoder { ~EncoderEncoder67 virtual ~Encoder() {} 68 69 virtual ID define(const SkMatrix&) = 0; 70 virtual ID define(const Misc&) = 0; 71 virtual ID define(const SkPath&) = 0; 72 virtual ID define(const Stroke&) = 0; 73 virtual ID define(const SkTextBlob*) = 0; 74 virtual ID define(SkPathEffect*) = 0; 75 virtual ID define(SkShader*) = 0; 76 virtual ID define(SkXfermode*) = 0; 77 virtual ID define(SkMaskFilter*) = 0; 78 virtual ID define(SkColorFilter*) = 0; 79 virtual ID define(SkRasterizer*) = 0; 80 virtual ID define(SkDrawLooper*) = 0; 81 virtual ID define(SkImageFilter*) = 0; 82 virtual ID define(SkAnnotation*) = 0; 83 84 virtual void undefine(ID) = 0; 85 86 // TODO: do these all belong here in CommonIDs? 87 struct CommonIDs { 88 ID misc, patheffect, shader, xfermode, maskfilter, 89 colorfilter, rasterizer, looper, imagefilter, annotation; 90 }; 91 92 virtual void save() = 0; 93 virtual void restore() = 0; 94 virtual void saveLayer(ID bounds, CommonIDs, uint32_t saveLayerFlags) = 0; 95 96 virtual void setMatrix(ID matrix) = 0; 97 98 virtual void clipPath(ID path, SkRegion::Op, bool aa) = 0; 99 virtual void fillPath(ID path, CommonIDs) = 0; 100 virtual void strokePath(ID path, CommonIDs, ID stroke) = 0; 101 virtual void fillText(ID text, SkPoint, CommonIDs) = 0; 102 virtual void strokeText(ID text, SkPoint, CommonIDs, ID stroke) = 0; 103 }; 104 105 // None of these factories take ownership of their arguments. 106 107 // Returns a new SkCanvas that translates to the Encoder API. 108 SkCanvas* NewCanvas(Encoder*); 109 // Returns an Encoder that translates back to the SkCanvas API. 110 Encoder* NewDecoder(SkCanvas*); 111 // Wraps another Encoder with a cache. TODO: parameterize 112 Encoder* NewCachingEncoder(Encoder*); 113 114 } // namespace SkRemote 115 116 #endif//SkRemote_DEFINED 117