1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #ifndef _BGFX_COLOR_BCOLOR_HXX 25 #define _BGFX_COLOR_BCOLOR_HXX 26 27 #include <basegfx/tuple/b3dtuple.hxx> 28 #include <com/sun/star/uno/Reference.hxx> 29 #include <com/sun/star/uno/Sequence.hxx> 30 #include <vector> 31 #include <basegfx/basegfxdllapi.h> 32 33 ////////////////////////////////////////////////////////////////////////////// 34 // predeclarations 35 36 namespace com { namespace sun { namespace star { namespace rendering { 37 class XGraphicDevice; 38 }}}} 39 40 ////////////////////////////////////////////////////////////////////////////// 41 42 namespace basegfx 43 { 44 /** Base Color class with three double values 45 46 This class derives all operators and common handling for 47 a 3D data class from B3DTuple. All necessary extensions 48 which are special for colors will be added here. 49 50 @see B3DTuple 51 */ 52 class BASEGFX_DLLPUBLIC BColor : public B3DTuple 53 { 54 public: 55 /** Create a Color with red, green and blue components from [0.0 to 1.0] 56 57 The color is initialized to (0.0, 0.0, 0.0) 58 */ BColor()59 BColor() 60 : B3DTuple() 61 {} 62 63 /** Create a 3D Color 64 65 @param fRed 66 @param fGreen 67 @param fBlue 68 These parameters are used to initialize the red, green and blue intensities of the color 69 */ BColor(double fRed,double fGreen,double fBlue)70 BColor(double fRed, double fGreen, double fBlue) 71 : B3DTuple(fRed, fGreen, fBlue) 72 {} 73 74 /** Create a 3D Color 75 76 @param fLuminosity 77 The parameter is used to initialize the red, green and blue intensities of the color 78 */ BColor(double fLuminosity)79 BColor(double fLuminosity) 80 : B3DTuple(fLuminosity, fLuminosity, fLuminosity) 81 {} 82 83 /** Create a copy of a Color 84 85 @param rVec 86 The Color which will be copied. 87 */ BColor(const BColor & rVec)88 BColor(const BColor& rVec) 89 : B3DTuple(rVec) 90 {} 91 92 /** constructor with tuple to allow copy-constructing 93 from B3DTuple-based classes 94 */ BColor(const::basegfx::B3DTuple & rTuple)95 BColor(const ::basegfx::B3DTuple& rTuple) 96 : B3DTuple(rTuple) 97 {} 98 ~BColor()99 ~BColor() 100 {} 101 102 // data access read getRed() const103 double getRed() const { return mfX; } getGreen() const104 double getGreen() const { return mfY; } getBlue() const105 double getBlue() const { return mfZ; } 106 107 // data access write setRed(double fNew)108 void setRed(double fNew) { mfX = fNew; } setGreen(double fNew)109 void setGreen(double fNew) { mfY = fNew; } setBlue(double fNew)110 void setBlue(double fNew) { mfZ = fNew; } 111 112 /** *=operator to allow usage from BColor, too 113 */ operator *=(const BColor & rPnt)114 BColor& operator*=( const BColor& rPnt ) 115 { 116 mfX *= rPnt.mfX; 117 mfY *= rPnt.mfY; 118 mfZ *= rPnt.mfZ; 119 return *this; 120 } 121 122 /** *=operator to allow usage from BColor, too 123 */ operator *=(double t)124 BColor& operator*=(double t) 125 { 126 mfX *= t; 127 mfY *= t; 128 mfZ *= t; 129 return *this; 130 } 131 132 /** assignment operator to allow assigning the results 133 of B3DTuple calculations 134 */ operator =(const::basegfx::B3DTuple & rVec)135 BColor& operator=( const ::basegfx::B3DTuple& rVec ) 136 { 137 mfX = rVec.getX(); 138 mfY = rVec.getY(); 139 mfZ = rVec.getZ(); 140 return *this; 141 } 142 143 // blend to another color using luminance blend(const BColor & rColor)144 void blend(const BColor& rColor) 145 { 146 const double fLuminance(luminance()); 147 mfX = rColor.getRed() * fLuminance; 148 mfY = rColor.getGreen() * fLuminance; 149 mfZ = rColor.getBlue() * fLuminance; 150 } 151 152 // luminance luminance() const153 double luminance() const 154 { 155 const double fRedWeight(77.0 / 256.0); // 0.30 156 const double fGreenWeight(151.0 / 256.0); // 0.59 157 const double fBlueWeight(28.0 / 256.0); // 0.11 158 159 return (mfX * fRedWeight + mfY * fGreenWeight + mfZ * fBlueWeight); 160 } 161 162 // distances in color space getDistanceRed(const BColor & rColor) const163 double getDistanceRed(const BColor& rColor) const { return (getRed() > rColor.getRed() ? getRed() - rColor.getRed() : rColor.getRed() - getRed()); } getDistanceGreen(const BColor & rColor) const164 double getDistanceGreen(const BColor& rColor) const { return (getGreen() > rColor.getGreen() ? getGreen() - rColor.getGreen() : rColor.getGreen() - getGreen()); } getDistanceBlue(const BColor & rColor) const165 double getDistanceBlue(const BColor& rColor) const { return (getBlue() > rColor.getBlue() ? getBlue() - rColor.getBlue() : rColor.getBlue() - getBlue()); } 166 getDistance(const BColor & rColor) const167 double getDistance(const BColor& rColor) const 168 { 169 const double fDistR(getDistanceRed(rColor)); 170 const double fDistG(getDistanceGreen(rColor)); 171 const double fDistB(getDistanceBlue(rColor)); 172 173 return sqrt(fDistR * fDistR + fDistG * fDistG + fDistB * fDistB); 174 } 175 getMinimumDistance(const BColor & rColor) const176 double getMinimumDistance(const BColor& rColor) const 177 { 178 const double fDistR(getDistanceRed(rColor)); 179 const double fDistG(getDistanceGreen(rColor)); 180 const double fDistB(getDistanceBlue(rColor)); 181 182 double fRetval(fDistR < fDistG ? fDistR : fDistG); 183 return (fRetval < fDistB ? fRetval : fDistB); 184 } 185 getMaximumDistance(const BColor & rColor) const186 double getMaximumDistance(const BColor& rColor) const 187 { 188 const double fDistR(getDistanceRed(rColor)); 189 const double fDistG(getDistanceGreen(rColor)); 190 const double fDistB(getDistanceBlue(rColor)); 191 192 double fRetval(fDistR > fDistG ? fDistR : fDistG); 193 return (fRetval > fDistB ? fRetval : fDistB); 194 } 195 196 // clamp color to [0.0..1.0] values in all three intensity components clamp()197 BColor& clamp() 198 { 199 mfX = basegfx::clamp(mfX, 0.0, 1.0); 200 mfY = basegfx::clamp(mfY, 0.0, 1.0); 201 mfZ = basegfx::clamp(mfZ, 0.0, 1.0); 202 return *this; 203 } 204 invert()205 BColor& invert() 206 { 207 mfX = 1.0 - mfX; 208 mfY = 1.0 - mfY; 209 mfZ = 1.0 - mfZ; 210 return *this; 211 } 212 getEmptyBColor()213 static const BColor& getEmptyBColor() 214 { 215 return (const BColor&) ::basegfx::B3DTuple::getEmptyTuple(); 216 } 217 colorToDoubleSequence(const com::sun::star::uno::Reference<com::sun::star::rendering::XGraphicDevice> &) const218 com::sun::star::uno::Sequence< double > colorToDoubleSequence(const com::sun::star::uno::Reference< com::sun::star::rendering::XGraphicDevice >& /*xGraphicDevice*/) const 219 { 220 com::sun::star::uno::Sequence< double > aRet(4); 221 double* pRet = aRet.getArray(); 222 223 pRet[0] = mfX; 224 pRet[1] = mfY; 225 pRet[2] = mfZ; 226 pRet[3] = 1.0; 227 228 return aRet; 229 } 230 }; 231 } // end of namespace basegfx 232 233 #endif /* _BGFX_COLOR_BCOLOR_HXX */ 234 235 ////////////////////////////////////////////////////////////////////////////// 236 // eof 237