From f98c3e8556f4eb4e62be3e0a5bfddee1eeac5e40 Mon Sep 17 00:00:00 2001 From: Javon Prince Date: Thu, 24 Apr 2014 16:25:52 +0100 Subject: [PATCH] Scripting: Allow JSON colors (and alpha) to be specified as "color":{ "r":255, "g":0, "b":127, "a":50 } OR "color":[1, 0, 0.5, 0.2] OR "color":"#FF007F", "color-alpha":0.2 Change-Id: If5bad5e9a51875b470d6e3638c6f7d49618d06b7 Signed-off-by: Javon Prince --- dali-toolkit/internal/builder/builder-get-is.inl.h | 10 ++--- .../internal/builder/builder-set-property.cpp | 46 +++++++++++++++++++++- 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/dali-toolkit/internal/builder/builder-get-is.inl.h b/dali-toolkit/internal/builder/builder-get-is.inl.h index 73550f5..61acd85 100644 --- a/dali-toolkit/internal/builder/builder-get-is.inl.h +++ b/dali-toolkit/internal/builder/builder-get-is.inl.h @@ -136,7 +136,7 @@ inline OptionalVector4 IsVector4(const OptionalChild& node) { OptionalVector4 ret; - if( node && (*node).Size() >= 4 ) + if( node && (TreeNode::ARRAY == (*node).GetType()) && (*node).Size() >= 4 ) { Dali::Vector4 v; if( CopyNumbers((*node).CBegin(), 4, v) ) @@ -152,7 +152,7 @@ inline OptionalVector3 IsVector3(const OptionalChild& node) { OptionalVector3 ret; - if( node && (*node).Size() >= 3 ) + if( node && (TreeNode::ARRAY == (*node).GetType()) && (*node).Size() >= 3 ) { Dali::Vector3 v; if( CopyNumbers((*node).CBegin(), 3, v) ) @@ -168,7 +168,7 @@ inline OptionalVector2 IsVector2(const OptionalChild& node) { OptionalVector2 ret; - if( node && (*node).Size() >= 2 ) + if( node && (TreeNode::ARRAY == (*node).GetType()) && (*node).Size() >= 2 ) { Dali::Vector2 v; if( CopyNumbers((*node).CBegin(), 2, v) ) @@ -184,7 +184,7 @@ inline OptionalMatrix IsMatrix(const OptionalChild &node) { OptionalMatrix ret; - if( node && (*node).Size() >= 16 ) + if( node && (TreeNode::ARRAY == (*node).GetType()) && (*node).Size() >= 16 ) { float v[16]; if( CopyNumbers((*node).CBegin(), 16, v) ) @@ -200,7 +200,7 @@ inline OptionalMatrix3 IsMatrix3(const OptionalChild& node) { OptionalMatrix3 ret; - if( node && (*node).Size() >= 9 ) + if( node && (TreeNode::ARRAY == (*node).GetType()) && (*node).Size() >= 9 ) { float v[9]; if( CopyNumbers((*node).CBegin(), 9, v) ) diff --git a/dali-toolkit/internal/builder/builder-set-property.cpp b/dali-toolkit/internal/builder/builder-set-property.cpp index e0e98c8..285bd7b 100644 --- a/dali-toolkit/internal/builder/builder-set-property.cpp +++ b/dali-toolkit/internal/builder/builder-set-property.cpp @@ -72,7 +72,21 @@ bool SetPropertyFromNode( const TreeNode& node, Property::Type type, Property::V namespace { - +/** + * Converts a HTML style 'color' hex string ("#FF0000" for bright red) to a Vector4. + * The Vector4 alpha component will be set to 1.0f + * @param hexString The HTML style hex string + * @return a Vector4 containing the new color value + */ +Vector4 HexStringToVector4( const char* s ) +{ + unsigned int value(0u); + std::istringstream( s ) >> std::hex >> value; + return Vector4( ((value >> 16 ) & 0xff ) / 255.0f, + ((value >> 8 ) & 0xff ) / 255.0f, + (value & 0xff ) / 255.0f, + 1.0f ); +} } // anon namespace @@ -223,6 +237,36 @@ bool SetPropertyFromNode( const TreeNode& node, Property::Type type, Property::V value = *v; done = true; } + else if( OptionalString s = replacer.IsString(node) ) + { + if( (*s)[0] == '#' && 7 == (*s).size() ) + { + value = HexStringToVector4( &(*s)[1] ); + done = true; + } + } + else if( TreeNode::OBJECT == node.GetType() ) + { + // check for "r", "g" and "b" child color component nodes + OptionalInteger r = replacer.IsInteger( IsChild(node, "r") ); + OptionalInteger g = replacer.IsInteger( IsChild(node, "g") ); + OptionalInteger b = replacer.IsInteger( IsChild(node, "b") ); + if( r && g && b ) + { + float red( (*r) * (1.0f/255.0f) ); + float green( (*r) * (1.0f/255.0f) ); + float blue( (*r) * (1.0f/255.0f) ); + // check for optional "a" (alpha) node, default to fully opaque if it is not found. + float alpha( 1.0f ); + OptionalInteger a = replacer.IsInteger( IsChild(node, "a") ); + if( a ) + { + alpha = (*a) * (1.0f/255.0f); + } + value = Vector4( red, green, blue, alpha ); + done = true; + } + } break; } case Property::MATRIX3: -- 2.7.4