blob: 23fa60cfc9868e805eba7cb5de5b5022cd092d8f [file] [log] [blame]
/*
* 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_protocol_DEFINED
#define SkRemote_protocol_DEFINED
// ATTENTION! Changes to this file can break protocol compatibility. Tread carefully.
namespace SkRemote {
// It is safe to append to this enum without breaking protocol compatibility.
// Resorting, deleting, or inserting anywhere but the end will break compatibility.
enum class Type : uint8_t {
kNone,
kMatrix,
kMisc,
kPath,
kStroke,
kXfermode,
};
class ID {
public:
explicit ID(Type type = Type::kNone) : fVal((uint64_t)type << 56) {}
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; }
ID operator++() {
++fVal;
SkASSERT(this->val() != 0); // Overflow is particularly bad as it'd change our Type.
return *this;
}
private:
// High 8 bits hold a Type. Low 56 bits are unique within that Type.
// Any change to this format will break protocol compatibility.
uint64_t fVal;
};
} // namespace SkRemote
#endif//SkRemote_protocol_DEFINED