/* * 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