Index: src/core/SkValue.h |
diff --git a/src/core/SkValue.h b/src/core/SkValue.h |
index dd42b3a889042f5843d847225de4c66939975951..5ff9eadc25c7916ede7e71548c75c0c404d65a5c 100644 |
--- a/src/core/SkValue.h |
+++ b/src/core/SkValue.h |
@@ -11,6 +11,8 @@ |
#include "SkTypes.h" |
#include <functional> |
+class SkData; |
+ |
class SkValue { |
public: |
enum Type : uint32_t { |
@@ -20,19 +22,22 @@ public: |
Bytes, S16s, U16s, S32s, U32s, S64s, U64s, F32s, F64s, |
Array, |
+ kMaxBuiltin = 0xFF, |
// 256-2147483647 may be used by Skia for public Object types. |
+ Matrix, |
- // 2147483648+ won't be used by Skia. They're open for client-specific use, testing, etc. |
+ kMaxPublicObject = 0x7FFFFFFF, |
+ // 2147483648+ won't be used by Skia. They're open for |
+ // client-specific use, testing, etc. |
}; |
- enum Key : uint32_t { |
- // Each Object type may define its own namespace of Key values, |
- // so there are no pre-defined Keys here. |
- // |
- // This is just a reminder that they must fit in a uint32_t, |
- // and that their namespace is distinct from other uint32_ts (e.g. Type). |
- }; |
+ // Each Object type may define its own namespace of Key values, |
+ // so there are no pre-defined Keys here. |
+ // |
+ // This is just a reminder that they must fit in a uint32_t, |
+ // and that their namespace is distinct from other uint32_ts (e.g. Type). |
+ typedef uint32_t Key; |
SkValue(); |
SkValue(const SkValue&); |
@@ -46,36 +51,66 @@ public: |
static SkValue FromS32(int32_t); |
static SkValue FromU32(uint32_t); |
static SkValue FromF32(float); |
- static SkValue FromBytes(const void*, size_t); // Copies. |
+ static SkValue FromBytes(SkData*); |
+ static SkValue FromU16s(SkData*); |
+ static SkValue FromU32s(SkData*); |
+ static SkValue FromF32s(SkData*); |
+ static SkValue ValueArray(); |
static SkValue Object(Type); |
- Type type() const; |
+ Type type() const { return fType; } |
// These remaining methods may assert they're called on a value of the appropriate type. |
int32_t s32() const; |
uint32_t u32() const; |
float f32() const; |
+ SkData* bytes() const; |
- const void* bytes() const; |
- size_t count() const; |
+ const uint16_t* u16s(int* count) const; |
+ const uint32_t* u32s(int* count) const; |
+ const float* f32s(int* count) const; |
+ // Object |
void set(Key, SkValue); |
- const SkValue* get(Key) const; |
void foreach(std::function<void(Key, const SkValue&)>) const; |
+ // Array |
+ size_t length() const; |
+ const SkValue& at(size_t) const; |
+ void append(SkValue); |
+ |
private: |
- class Bytes; |
- class Object; |
+ class Obj; |
+ class Arr; |
Type fType; |
union { |
- int32_t fS32; |
- uint32_t fU32; |
- float fF32; |
- class Bytes* fBytes; |
- class Object* fObject; |
+ int32_t fS32; |
+ uint32_t fU32; |
+ float fF32; |
+ SkData* fBytes; |
+ Obj* fObject; |
+ Arr* fArray; |
}; |
+ |
+ SkValue(Type); |
+ bool isObject() const { return fType > kMaxBuiltin; } |
+ bool isData() const { |
+ return Bytes == fType |
+ || U16s == fType |
+ || U32s == fType |
+ || F32s == fType; |
+ } |
+ template <typename T> static SkValue FromT(SkValue::Type, T SkValue::*, T); |
+ template <typename T> static SkValue FromTs(SkValue::Type, SkData*); |
+ template <typename T> const T* asTs(SkValue::Type, int*) const; |
}; |
-#endif//SkValue_DEFINED |
+template <typename T> |
+SkValue SkToValue(const T&); |
+ |
+template <typename T> |
+bool SkFromValue(const SkValue&, T*); |
+ |
+#endif // SkValue_DEFINED |