/*
* Copyright 2015 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkRemote_DEFINED
#define SkRemote_DEFINED
#include "SkPaint.h"
#include "SkRegion.h"
#include "SkRemote_protocol.h"
#include "SkTypes.h"
class SkCanvas;
class SkMatrix;
class SkPath;
class SkShader;
class SkTextBlob;
class SkXfermode;
// TODO: document
namespace SkRemote {
// 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;
bool fAntiAlias, fDither;
static Misc CreateFrom(const SkPaint&);
void applyTo(SkPaint*) const;
};
// Fields from SkPaint used by stroke draws only.
struct Stroke {
SkScalar fWidth, fMiter;
SkPaint::Cap fCap;
SkPaint::Join fJoin;
static Stroke CreateFrom(const SkPaint&);
void applyTo(SkPaint*) const;
};
// TODO: document
struct Encoder {
virtual ~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(const SkTextBlob*) = 0;
virtual ID define(SkPathEffect*) = 0;
virtual ID define(SkShader*) = 0;
virtual ID define(SkXfermode*) = 0;
virtual ID define(SkMaskFilter*) = 0;
virtual ID define(SkColorFilter*) = 0;
virtual ID define(SkRasterizer*) = 0;
virtual ID define(SkDrawLooper*) = 0;
virtual ID define(SkImageFilter*) = 0;
virtual ID define(SkAnnotation*) = 0;
virtual void undefine(ID) = 0;
// TODO: do these all belong here in CommonIDs?
struct CommonIDs {
ID misc, patheffect, shader, xfermode, maskfilter,
colorfilter, rasterizer, looper, imagefilter, annotation;
};
virtual void save() = 0;
virtual void restore() = 0;
virtual void saveLayer(ID bounds, CommonIDs, uint32_t saveLayerFlags) = 0;
virtual void setMatrix(ID matrix) = 0;
virtual void clipPath(ID path, SkRegion::Op, bool aa) = 0;
virtual void fillPath(ID path, CommonIDs) = 0;
virtual void strokePath(ID path, CommonIDs, ID stroke) = 0;
virtual void fillText(ID text, SkPoint, CommonIDs) = 0;
virtual void strokeText(ID text, SkPoint, CommonIDs, ID stroke) = 0;
};
// None of these factories take ownership of their arguments.
// Returns a new SkCanvas that translates to the Encoder API.
SkCanvas* NewCanvas(Encoder*);
// Returns an Encoder that translates back to the SkCanvas API.
Encoder* NewDecoder(SkCanvas*);
// Wraps another Encoder with a cache. TODO: parameterize
Encoder* NewCachingEncoder(Encoder*);
} // namespace SkRemote
#endif//SkRemote_DEFINED