From 9c66fcab3e941e8bbade55adbaddd5043e7edf13 Mon Sep 17 00:00:00 2001 From: cxl Date: Mon, 14 May 2012 14:47:25 +0000 Subject: [PATCH] Draw: Font, Drawing, Painting, Image now support Xmlize and Jsonize git-svn-id: svn://ultimatepp.org/upp/trunk@4950 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/Core/Color.h | 2 +- uppsrc/Core/JSON.h | 33 + uppsrc/Core/OldValue.h | 14 + uppsrc/Core/Uuid.cpp | 6 - uppsrc/Core/ValueUtil.h | 712 +++++++++---------- uppsrc/Core/Xmlize.h | 4 +- uppsrc/Draw/Draw.cpp | 4 +- uppsrc/Draw/Draw.h | 14 +- uppsrc/Draw/Drawing.cpp | 1384 ++++++++++++++++++------------------ uppsrc/Draw/Font.cpp | 4 +- uppsrc/Draw/Image.cpp | 1470 +++++++++++++++++++-------------------- uppsrc/Draw/Image.h | 690 +++++++++--------- uppsrc/Ole/util.h | 2 +- uppsrc/Sql/Sqls.h | 2 +- 14 files changed, 2198 insertions(+), 2143 deletions(-) diff --git a/uppsrc/Core/Color.h b/uppsrc/Core/Color.h index 60cdf89b6..0af316a92 100644 --- a/uppsrc/Core/Color.h +++ b/uppsrc/Core/Color.h @@ -25,7 +25,7 @@ inline dword RGB(byte r, byte g, byte b) { return r | (g << 8) | (b << 1 const int COLOR_V = 39; -class Color : public AssignValueTypeNo > { +class Color : public ValueType > { protected: dword color; diff --git a/uppsrc/Core/JSON.h b/uppsrc/Core/JSON.h index 5a1cd0404..e59fb158b 100644 --- a/uppsrc/Core/JSON.h +++ b/uppsrc/Core/JSON.h @@ -348,3 +348,36 @@ void Jsonize(JsonIO& io, ArrayIndex& var) { JsonizeIndex, T>(io, var); } + + +template +void XmlizeBySerialize(XmlIO& xio, T& x) +{ + String h; + if(xio.IsStoring()) + h = HexString(StoreAsString(x)); + xio.Attr("data", h); + if(xio.IsLoading()) + try { + LoadFromString(x, ScanHexString(h)); + } + catch(LoadingError) { + throw XmlError("xmlize by serialize error"); + } +} + +template +void JsonizeBySerialize(JsonIO& jio, T& x) +{ + String h; + if(jio.IsStoring()) + h = HexString(StoreAsString(x)); + jio("data", h); + if(jio.IsLoading()) + try { + LoadFromString(x, ScanHexString(h)); + } + catch(LoadingError) { + throw JsonizeError("jsonize by serialize error"); + } +} diff --git a/uppsrc/Core/OldValue.h b/uppsrc/Core/OldValue.h index 9c95c718c..c5963e9b5 100644 --- a/uppsrc/Core/OldValue.h +++ b/uppsrc/Core/OldValue.h @@ -148,6 +148,9 @@ public: Value(Void *p) { ptr = p; } const Void *GetVoidPtr() const { return ptr; } + + template // Forward compatibility + static void Register(const char *name = NULL); }; #define VALUE_COMPARE(T) \ @@ -260,6 +263,11 @@ public: void operator=(const AssignValueTypeNo&) {} // MSC 6.0 empty base class bug fix }; +template // Forward compatiblity +class ValueType : public AssignValueTypeNo {}; + + + template dword GetValueTypeNo() { return ValueTypeNo((T*)NULL); } @@ -474,6 +482,12 @@ public: } }; +template +void Value::Register(const char *) +{ + RichValue::Register(); +} + template inline Value RichToValue(const T& data) { return RichValue(data); } diff --git a/uppsrc/Core/Uuid.cpp b/uppsrc/Core/Uuid.cpp index 61b5751a3..a02a92299 100644 --- a/uppsrc/Core/Uuid.cpp +++ b/uppsrc/Core/Uuid.cpp @@ -4,15 +4,9 @@ NAMESPACE_UPP //#BLITZ_APPROVE -#ifdef SVO_VALUE INITBLOCK { Value::Register("Uuid"); } -#else -INITBLOCK { - RichValue::Register(); -} -#endif void Uuid::Serialize(Stream& s) { int version = 0; diff --git a/uppsrc/Core/ValueUtil.h b/uppsrc/Core/ValueUtil.h index 666650cb7..86eda4fd9 100644 --- a/uppsrc/Core/ValueUtil.h +++ b/uppsrc/Core/ValueUtil.h @@ -1,357 +1,357 @@ -#ifdef SVO_VALUE - -Value Scan(dword stdtype, const String& text, const Value& def = Null); - -inline const String& Nvl(const String& a, const String& b) { return IsNull(a) ? b : a; } -inline int Nvl(int a, int b) { return IsNull(a) ? b : a; } -inline int64 Nvl(int64 a, int64 b) { return IsNull(a) ? b : a; } -inline double Nvl(double a, double b) { return IsNull(a) ? b : a; } -inline Date Nvl(Date a, Date b) { return IsNull(a) ? b : a; } -inline Time Nvl(Time a, Time b) { return IsNull(a) ? b : a; } - -inline int Nvl(int a) { return Nvl(a, 0); } -inline int64 Nvl(int64 a) { return Nvl(a, (int64)0); } -inline double Nvl(double a) { return Nvl(a, 0.0); } - -int StdValueCompare(const Value& a, const Value& b, int language); -int StdValueCompare(const Value& a, const Value& b); - -int StdValueCompareDesc(const Value& a, const Value& b, int language); -int StdValueCompareDesc(const Value& a, const Value& b); - -struct ValueOrder { - virtual bool operator()(const Value& a, const Value& b) const = 0; - virtual ~ValueOrder() {} -}; - -struct StdValueOrder : ValueOrder { - int language; - - virtual bool operator()(const Value& a, const Value& b) const; - - StdValueOrder(int l = -1); -}; - -struct FnValueOrder : ValueOrder { - int (*fn)(const Value& a, const Value& b); - - virtual bool operator()(const Value& a, const Value& b) const; - - FnValueOrder(int (*fn)(const Value& a, const Value& b)) : fn(fn) {} -}; - -struct ValuePairOrder { - virtual bool operator()(const Value& keya, const Value& valuea, const Value& keyb, const Value& valueb) const = 0; - virtual ~ValuePairOrder() {} -}; - -struct StdValuePairOrder : ValuePairOrder { - int language; - - virtual bool operator()(const Value& keya, const Value& valuea, const Value& keyb, const Value& valueb) const; - - StdValuePairOrder(int l = -1); -}; - -struct FnValuePairOrder : ValuePairOrder { - int (*fn)(const Value& k1, const Value& v1, const Value& k2, const Value& v2); - - virtual bool operator()(const Value& keya, const Value& valuea, const Value& keyb, const Value& valueb) const; - - FnValuePairOrder(int (*fn)(const Value& k1, const Value& v1, const Value& k2, const Value& v2)) : fn(fn) {} -}; - -class Id : Moveable { - String id; - -public: - const String& ToString() const { return id; } - dword GetHashValue() const { return UPP::GetHashValue(id); } - bool IsNull() const { return UPP::IsNull(id); } - - operator const String&() const { return ToString(); } - const String& operator~() const { return ToString(); } - bool operator==(const Id& b) const { return id == b.id; } - bool operator!=(const Id& b) const { return id != b.id; } - - operator bool() const { return id.GetCount(); } - - Id() {} - Id(const String& s) { id = s; } - Id(const char *s) { id = s; } -}; - -struct RefManager { - virtual int GetType() = 0; - virtual Value GetValue(const void *) { return Null; } - virtual bool IsNull(const void *) { return false; } - virtual void SetValue(void *, const Value& v) { NEVER(); } - virtual void SetNull(void *) { NEVER(); } - virtual ~RefManager() {} -}; - -template -struct StdRef : public RefManager { - virtual void SetValue(void *p, const Value& v) { *(T *) p = (T)v; } - virtual Value GetValue(const void *p) { return *(const T *) p; } - virtual int GetType() { return GetValueTypeNo(); } - virtual bool IsNull(const void *p) { return UPP::IsNull(*(T *) p); } - virtual void SetNull(void *p) { UPP::SetNull(*(T *)p); } - virtual ~StdRef() {} -}; - -class Ref : Moveable { -protected: - RefManager *m; - void *ptr; - struct ValueRef; - -public: - dword GetType() const { return m ? m->GetType() : VOID_V; } - bool IsNull() const { return m ? m->IsNull(ptr) : true; } - - void *GetVoidPtr() const { return ptr; } - - template - bool Is() const { return GetType() == GetValueTypeNo(); } // VALUE_V!!! - template - T& Get() const { ASSERT(GetValueTypeNo() == GetType()); return *(T *)GetVoidPtr(); } - - void SetNull() { if(m) m->SetNull(ptr); } - Value GetValue() const { return m ? m->GetValue(ptr) : Value(); } - void SetValue(const Value& v) { ASSERT(m); m->SetValue(ptr, v); } - - operator Value() const { return GetValue(); } - Value operator~() const { return GetValue(); } - Ref& operator=(const Value& v) { SetValue(v); return *this; } - - Ref(String& s); - Ref(WString& s); - Ref(int& i); - Ref(int64& i); - Ref(double& d); - Ref(bool& b); - Ref(Date& d); - Ref(Time& t); - Ref(Value& v); - Ref(void *_ptr, RefManager *_m) { ptr = _ptr, m = _m; } - Ref(const ValueTypeRef& r); - Ref() { ptr = m = NULL; } -}; - -template -T& GetRef(Ref r, T *x = NULL) { - ASSERT(GetValueTypeNo() == r.GetType()); - return *(T *) r.GetVoidPtr(); -} - -inline String& RefString(Ref f) { return GetRef(f); } -inline WString& RefWString(Ref f) { return GetRef(f); } -inline int& RefInt(Ref f) { return GetRef(f); } -inline int64& RefInt64(Ref f) { return GetRef(f); } -inline double& RefDouble(Ref f) { return GetRef(f); } -inline bool& RefBool(Ref f) { return GetRef(f); } -inline Date& RefDate(Ref f) { return GetRef(f); } -inline Time& RefTime(Ref f) { return GetRef