/*! \file color.h
** \brief Color Class Implementation
**
-** $Id: color.h,v 1.1.1.1 2005/01/04 01:23:14 darco Exp $
+** $Id$
**
** \legal
** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+** Copyright (c) 2007 Chris Moore
**
** This package is free software; you can redistribute it and/or
** modify it under the terms of the GNU General Public License as
#include <math.h>
#include <cassert>
#include "gamma.h"
-#include <string.h>
+#include <synfig/string.h>
#ifdef USE_HALF_TYPE
#include <OpenEXR/half.h>
/* === M A C R O S ========================================================= */
+#define use_colorspace_gamma() App::use_colorspace_gamma
+#define colorspace_gamma() (2.2f)
+#define gamma_in(x) ((x>=0) ? pow((float)x,1.0f/colorspace_gamma()) : -pow((float)-x,1.0f/colorspace_gamma()))
+#define gamma_out(x) ((x>=0) ? pow((float)x, colorspace_gamma()) : -pow((float)-x, colorspace_gamma()))
+
#ifdef WIN32
#include <float.h>
#ifndef isnan
public:
+ const String get_string(void)const;
+
Color &
operator+=(const Color &rhs)
{
}
public:
- Color() /*:r_(0), g_(0), b_(0), a_(0)*/ { }
+ // ETL/trunk/ETL/_gaussian.h does:
+ // SR1=SR2=SR3=typename T::value_type();
+ // and expects that to give it initialised colors
+ // Otherwise the 'gaussian' blur type is random.
+ Color() :a_(0), r_(0), g_(0), b_(0) { }
Color(const value_type &f) :a_(f),r_(f), g_(f), b_(f) { }
Color(int f) :a_(f),r_(f), g_(f), b_(f) { }
g_(G),
b_(B) { }
- /*! \param C Source for color components
+ /*! \param c Source for color components
** \param A Opacity(alpha) */
Color(const Color& c, const value_type& A):
- a_(c.a_),
+ a_(A),
r_(c.r_),
g_(c.g_),
b_(c.b_) { }
//! Synonym for get_a(). \see get_a()
const value_type& get_alpha()const { return get_a(); }
+ //! Converts a 2 character hex string \a s (00-ff) into a ColorReal (0.0-1.0)
+ static ColorReal hex2real(String s);
+
+ //! Converts a ColorReal \a c (0.0-1.0) into a 2 character hex string (00-ff)
+ static const String real2hex(ColorReal c);
+
+ //! Returns the color as a 6 character hex sting
+ const String get_hex()const { return String(real2hex(r_)+real2hex(g_)+real2hex(b_)); }
+
+ //! Sets the color's R, G, and B from a 3 or 6 character hex string
+ void set_hex(String& hex);
+
//! Sets the RED component to \a x
Color& set_r(const value_type& x) { r_ = x; return *this; }
//! \writeme
enum BlendMethod
{
- BLEND_COMPOSITE=0, //!< Color A is composited onto B (Taking into about A's alpha)
- BLEND_STRAIGHT=1, //!< Straight linear interpolation from A->B (Alpha ignored)
- BLEND_BRIGHTEN=2, //!< If composite is brighter than B, use composite. B otherwise.
- BLEND_DARKEN=3, //!< If composite is brighter than B, use composite. B otherwise.
- BLEND_ADD=4, //!< Simple A+B.
- BLEND_SUBTRACT=5, //!< Simple A-B.
- BLEND_MULTIPLY=6, //!< Simple A*B.
- BLEND_DIVIDE=7, //!< Simple B/A
- BLEND_COLOR=8, //!< Preserves the U and V channels of color A
- BLEND_HUE=9, //!< Preserves the angle of the UV vector of color A
- BLEND_SATURATION=10,//!< Preserves the magnitude of the UV Vector of color A
- BLEND_LUMINANCE=11, //!< Preserves the Y channel of color A
- BLEND_BEHIND=12, //!< Similar to BLEND_COMPOSITE, except that B is composited onto A.
- BLEND_ONTO=13, //!< Similar to BLEND_COMPOSITE, except that B's alpha is maintained
- BLEND_SCREEN=16, //!< \writeme
- BLEND_OVERLAY=20, //!< \writeme
- BLEND_DIFFERENCE=18, //!< \writeme
+ BLEND_COMPOSITE=0, //!< Color A is composited onto B (Taking A's alpha into account)
+ BLEND_STRAIGHT=1, //!< Straight linear interpolation from A->B (Alpha ignored)
+ BLEND_ONTO=13, //!< Similar to BLEND_COMPOSITE, except that B's alpha is maintained
+ BLEND_STRAIGHT_ONTO=21, //!< <deprecated> \writeme
+ BLEND_BEHIND=12, //!< Similar to BLEND_COMPOSITE, except that B is composited onto A.
+ BLEND_SCREEN=16, //!< \writeme
+ BLEND_OVERLAY=20, //!< \writeme
BLEND_HARD_LIGHT=17, //!< \writeme
-
- //! Deprecated
- BLEND_ALPHA_BRIGHTEN=14, //!< If A is less opaque than B, use A
- BLEND_ALPHA_DARKEN=15, //!< If A is more opaque than B, use B
- BLEND_ALPHA_OVER=19,//!< multiply alphas and then straight blends that using the amount
- BLEND_STRAIGHT_ONTO=21,//!< \writeme
-
- BLEND_END=22 //!< \internal
+ BLEND_MULTIPLY=6, //!< Simple A*B.
+ BLEND_DIVIDE=7, //!< Simple B/A
+ BLEND_ADD=4, //!< Simple A+B.
+ BLEND_SUBTRACT=5, //!< Simple A-B.
+ BLEND_DIFFERENCE=18, //!< Simple |A-B|.
+ BLEND_BRIGHTEN=2, //!< If composite is brighter than B, use composite. B otherwise.
+ BLEND_DARKEN=3, //!< If composite is darker than B, use composite. B otherwise.
+ BLEND_COLOR=8, //!< Preserves the U and V channels of color A
+ BLEND_HUE=9, //!< Preserves the angle of the UV vector of color A
+ BLEND_SATURATION=10, //!< Preserves the magnitude of the UV Vector of color A
+ BLEND_LUMINANCE=11, //!< Preserves the Y channel of color A
+
+ BLEND_ALPHA_BRIGHTEN=14, //!< <deprecated> If A is less opaque than B, use A
+ BLEND_ALPHA_DARKEN=15, //!< <deprecated> If A is more opaque than B, use B
+ BLEND_ALPHA_OVER=19, //!< <deprecated> multiply alphas and then straight blends using the amount
+
+ BLEND_END=22 //!< \internal
};
/* Other */