blob: 9570220a27fb1cc44ba125541365b97355b11892 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef _BGFX_COLOR_BCOLOR_HXX
#define _BGFX_COLOR_BCOLOR_HXX
#include <basegfx/tuple/b3dtuple.hxx>
#include <com/sun/star/uno/Reference.hxx>
#include <com/sun/star/uno/Sequence.hxx>
#include <vector>
//////////////////////////////////////////////////////////////////////////////
// predeclarations
namespace com { namespace sun { namespace star { namespace rendering {
class XGraphicDevice;
}}}}
//////////////////////////////////////////////////////////////////////////////
namespace basegfx
{
/** Base Color class with three double values
This class derives all operators and common handling for
a 3D data class from B3DTuple. All necessary extensions
which are special for colors will be added here.
@see B3DTuple
*/
class BColor : public B3DTuple
{
public:
/** Create a Color with red, green and blue components from [0.0 to 1.0]
The color is initialized to (0.0, 0.0, 0.0)
*/
BColor()
: B3DTuple()
{}
/** Create a 3D Color
@param fRed
@param fGreen
@param fBlue
These parameters are used to initialize the red, green and blue intensities of the color
*/
BColor(double fRed, double fGreen, double fBlue)
: B3DTuple(fRed, fGreen, fBlue)
{}
/** Create a 3D Color
@param fLuminosity
The parameter is used to initialize the red, green and blue intensities of the color
*/
BColor(double fLuminosity)
: B3DTuple(fLuminosity, fLuminosity, fLuminosity)
{}
/** Create a copy of a Color
@param rVec
The Color which will be copied.
*/
BColor(const BColor& rVec)
: B3DTuple(rVec)
{}
/** constructor with tuple to allow copy-constructing
from B3DTuple-based classes
*/
BColor(const ::basegfx::B3DTuple& rTuple)
: B3DTuple(rTuple)
{}
~BColor()
{}
// data access read
double getRed() const { return mfX; }
double getGreen() const { return mfY; }
double getBlue() const { return mfZ; }
// data access write
void setRed(double fNew) { mfX = fNew; }
void setGreen(double fNew) { mfY = fNew; }
void setBlue(double fNew) { mfZ = fNew; }
/** *=operator to allow usage from BColor, too
*/
BColor& operator*=( const BColor& rPnt )
{
mfX *= rPnt.mfX;
mfY *= rPnt.mfY;
mfZ *= rPnt.mfZ;
return *this;
}
/** *=operator to allow usage from BColor, too
*/
BColor& operator*=(double t)
{
mfX *= t;
mfY *= t;
mfZ *= t;
return *this;
}
/** assignment operator to allow assigning the results
of B3DTuple calculations
*/
BColor& operator=( const ::basegfx::B3DTuple& rVec )
{
mfX = rVec.getX();
mfY = rVec.getY();
mfZ = rVec.getZ();
return *this;
}
// blend to another color using luminance
void blend(const BColor& rColor)
{
const double fLuminance(luminance());
mfX = rColor.getRed() * fLuminance;
mfY = rColor.getGreen() * fLuminance;
mfZ = rColor.getBlue() * fLuminance;
}
// luminance
double luminance() const
{
const double fRedWeight(77.0 / 256.0); // 0.30
const double fGreenWeight(151.0 / 256.0); // 0.59
const double fBlueWeight(28.0 / 256.0); // 0.11
return (mfX * fRedWeight + mfY * fGreenWeight + mfZ * fBlueWeight);
}
// distances in color space
double getDistanceRed(const BColor& rColor) const { return (getRed() > rColor.getRed() ? getRed() - rColor.getRed() : rColor.getRed() - getRed()); }
double getDistanceGreen(const BColor& rColor) const { return (getGreen() > rColor.getGreen() ? getGreen() - rColor.getGreen() : rColor.getGreen() - getGreen()); }
double getDistanceBlue(const BColor& rColor) const { return (getBlue() > rColor.getBlue() ? getBlue() - rColor.getBlue() : rColor.getBlue() - getBlue()); }
double getDistance(const BColor& rColor) const
{
const double fDistR(getDistanceRed(rColor));
const double fDistG(getDistanceGreen(rColor));
const double fDistB(getDistanceBlue(rColor));
return sqrt(fDistR * fDistR + fDistG * fDistG + fDistB * fDistB);
}
double getMinimumDistance(const BColor& rColor) const
{
const double fDistR(getDistanceRed(rColor));
const double fDistG(getDistanceGreen(rColor));
const double fDistB(getDistanceBlue(rColor));
double fRetval(fDistR < fDistG ? fDistR : fDistG);
return (fRetval < fDistB ? fRetval : fDistB);
}
double getMaximumDistance(const BColor& rColor) const
{
const double fDistR(getDistanceRed(rColor));
const double fDistG(getDistanceGreen(rColor));
const double fDistB(getDistanceBlue(rColor));
double fRetval(fDistR > fDistG ? fDistR : fDistG);
return (fRetval > fDistB ? fRetval : fDistB);
}
// clamp color to [0.0..1.0] values in all three intensity components
BColor& clamp()
{
mfX = basegfx::clamp(mfX, 0.0, 1.0);
mfY = basegfx::clamp(mfY, 0.0, 1.0);
mfZ = basegfx::clamp(mfZ, 0.0, 1.0);
return *this;
}
BColor& invert()
{
mfX = 1.0 - mfX;
mfY = 1.0 - mfY;
mfZ = 1.0 - mfZ;
return *this;
}
static const BColor& getEmptyBColor()
{
return (const BColor&) ::basegfx::B3DTuple::getEmptyTuple();
}
com::sun::star::uno::Sequence< double > colorToDoubleSequence(const com::sun::star::uno::Reference< com::sun::star::rendering::XGraphicDevice >& /*xGraphicDevice*/) const
{
com::sun::star::uno::Sequence< double > aRet(4);
double* pRet = aRet.getArray();
pRet[0] = mfX;
pRet[1] = mfY;
pRet[2] = mfZ;
pRet[3] = 1.0;
return aRet;
}
};
} // end of namespace basegfx
#endif /* _BGFX_COLOR_BCOLOR_HXX */
//////////////////////////////////////////////////////////////////////////////
// eof