/************************************************************** * * 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. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_basegfx.hxx" #include ////////////////////////////////////////////////////////////////////////////// namespace basegfx { BColorModifier::~BColorModifier() { } } // end of namespace basegfx ////////////////////////////////////////////////////////////////////////////// namespace basegfx { BColorModifier_gray::~BColorModifier_gray() { } bool BColorModifier_gray::operator==(const BColorModifier& rCompare) const { return 0 != dynamic_cast< const BColorModifier_gray* >(&rCompare); } ::basegfx::BColor BColorModifier_gray::getModifiedColor(const ::basegfx::BColor& aSourceColor) const { const double fLuminance(aSourceColor.luminance()); return ::basegfx::BColor(fLuminance, fLuminance, fLuminance); } } // end of namespace basegfx ////////////////////////////////////////////////////////////////////////////// namespace basegfx { BColorModifier_invert::~BColorModifier_invert() { } bool BColorModifier_invert::operator==(const BColorModifier& rCompare) const { return 0 != dynamic_cast< const BColorModifier_invert* >(&rCompare); } ::basegfx::BColor BColorModifier_invert::getModifiedColor(const ::basegfx::BColor& aSourceColor) const { return ::basegfx::BColor(1.0 - aSourceColor.getRed(), 1.0 - aSourceColor.getGreen(), 1.0 - aSourceColor.getBlue()); } } // end of namespace basegfx ////////////////////////////////////////////////////////////////////////////// namespace basegfx { BColorModifier_luminance_to_alpha::~BColorModifier_luminance_to_alpha() { } bool BColorModifier_luminance_to_alpha::operator==(const BColorModifier& rCompare) const { return 0 != dynamic_cast< const BColorModifier_luminance_to_alpha* >(&rCompare); } ::basegfx::BColor BColorModifier_luminance_to_alpha::getModifiedColor(const ::basegfx::BColor& aSourceColor) const { const double fAlpha(1.0 - ((aSourceColor.getRed() * 0.2125) + (aSourceColor.getGreen() * 0.7154) + (aSourceColor.getBlue() * 0.0721))); return ::basegfx::BColor(fAlpha, fAlpha, fAlpha); } } // end of namespace basegfx ////////////////////////////////////////////////////////////////////////////// namespace basegfx { BColorModifier_replace::~BColorModifier_replace() { } bool BColorModifier_replace::operator==(const BColorModifier& rCompare) const { const BColorModifier_replace* pCompare = dynamic_cast< const BColorModifier_replace* >(&rCompare); if(!pCompare) { return false; } return getBColor() == pCompare->getBColor(); } ::basegfx::BColor BColorModifier_replace::getModifiedColor(const ::basegfx::BColor& /*aSourceColor*/) const { return maBColor; } } // end of namespace basegfx ////////////////////////////////////////////////////////////////////////////// namespace basegfx { BColorModifier_interpolate::~BColorModifier_interpolate() { } bool BColorModifier_interpolate::operator==(const BColorModifier& rCompare) const { const BColorModifier_interpolate* pCompare = dynamic_cast< const BColorModifier_interpolate* >(&rCompare); if(!pCompare) { return false; } return getBColor() == pCompare->getBColor() && getValue() == pCompare->getValue(); } ::basegfx::BColor BColorModifier_interpolate::getModifiedColor(const ::basegfx::BColor& aSourceColor) const { return interpolate(maBColor, aSourceColor, mfValue); } } // end of namespace basegfx ////////////////////////////////////////////////////////////////////////////// namespace basegfx { BColorModifier_black_and_white::~BColorModifier_black_and_white() { } bool BColorModifier_black_and_white::operator==(const BColorModifier& rCompare) const { const BColorModifier_black_and_white* pCompare = dynamic_cast< const BColorModifier_black_and_white* >(&rCompare); if(!pCompare) { return false; } return getValue() == pCompare->getValue(); } ::basegfx::BColor BColorModifier_black_and_white::getModifiedColor(const ::basegfx::BColor& aSourceColor) const { const double fLuminance(aSourceColor.luminance()); if(fLuminance < mfValue) { return ::basegfx::BColor::getEmptyBColor(); } else { return ::basegfx::BColor(1.0, 1.0, 1.0); } } } // end of namespace basegfx ////////////////////////////////////////////////////////////////////////////// namespace basegfx { BColorModifier_gamma::BColorModifier_gamma(double fValue) : BColorModifier(), mfValue(fValue), mfInvValue(fValue), mbUseIt(!basegfx::fTools::equal(fValue, 1.0) && basegfx::fTools::more(fValue, 0.0) && basegfx::fTools::lessOrEqual(fValue, 10.0)) { if(mbUseIt) { mfInvValue = 1.0 / mfValue; } } BColorModifier_gamma::~BColorModifier_gamma() { } bool BColorModifier_gamma::operator==(const BColorModifier& rCompare) const { const BColorModifier_gamma* pCompare = dynamic_cast< const BColorModifier_gamma* >(&rCompare); if(!pCompare) { return false; } // getValue is sufficient, mfInvValue and mbUseIt are only helper values return getValue() == pCompare->getValue(); } ::basegfx::BColor BColorModifier_gamma::getModifiedColor(const ::basegfx::BColor& aSourceColor) const { if(mbUseIt) { ::basegfx::BColor aRetval( pow(aSourceColor.getRed(), mfInvValue), pow(aSourceColor.getGreen(), mfInvValue), pow(aSourceColor.getBlue(), mfInvValue)); aRetval.clamp(); return aRetval; } else { return aSourceColor; } } } // end of namespace basegfx ////////////////////////////////////////////////////////////////////////////// namespace basegfx { BColorModifier_RGBLuminanceContrast::BColorModifier_RGBLuminanceContrast(double fRed, double fGreen, double fBlue, double fLuminance, double fContrast) : BColorModifier(), mfRed(basegfx::clamp(fRed, -1.0, 1.0)), mfGreen(basegfx::clamp(fGreen, -1.0, 1.0)), mfBlue(basegfx::clamp(fBlue, -1.0, 1.0)), mfLuminance(basegfx::clamp(fLuminance, -1.0, 1.0)), mfContrast(basegfx::clamp(fContrast, -1.0, 1.0)), mfContrastOff(1.0), mfRedOff(0.0), mfGreenOff(0.0), mfBlueOff(0.0), mbUseIt(false) { if(!basegfx::fTools::equalZero(mfRed) || !basegfx::fTools::equalZero(mfGreen) || !basegfx::fTools::equalZero(mfBlue) || !basegfx::fTools::equalZero(mfLuminance) || !basegfx::fTools::equalZero(mfContrast)) { // calculate slope if(mfContrast >= 0.0) { mfContrastOff = 128.0 / (128.0 - (mfContrast * 127.0)); } else { mfContrastOff = ( 128.0 + (mfContrast * 127.0)) / 128.0; } // calculate unified contrast offset const double fPreparedContrastOff((128.0 - mfContrastOff * 128.0) / 255.0); const double fCombinedOffset(mfLuminance + fPreparedContrastOff); // set full offsets mfRedOff = mfRed + fCombinedOffset; mfGreenOff = mfGreen + fCombinedOffset; mfBlueOff = mfBlue + fCombinedOffset; mbUseIt = true; } } BColorModifier_RGBLuminanceContrast::~BColorModifier_RGBLuminanceContrast() { } bool BColorModifier_RGBLuminanceContrast::operator==(const BColorModifier& rCompare) const { const BColorModifier_RGBLuminanceContrast* pCompare = dynamic_cast< const BColorModifier_RGBLuminanceContrast* >(&rCompare); if(!pCompare) { return false; } // no need to compare other values, these are just helpers return getRed() == pCompare->getRed() && getGreen() == pCompare->getGreen() && getBlue() == pCompare->getBlue() && getLuminance() == pCompare->getLuminance() && getContrast() == pCompare->getContrast(); } ::basegfx::BColor BColorModifier_RGBLuminanceContrast::getModifiedColor(const ::basegfx::BColor& aSourceColor) const { if(mbUseIt) { return basegfx::BColor( basegfx::clamp(aSourceColor.getRed() * mfContrastOff + mfRedOff, 0.0, 1.0), basegfx::clamp(aSourceColor.getGreen() * mfContrastOff + mfGreenOff, 0.0, 1.0), basegfx::clamp(aSourceColor.getBlue() * mfContrastOff + mfBlueOff, 0.0, 1.0)); } else { return aSourceColor; } } } // end of namespace basegfx ////////////////////////////////////////////////////////////////////////////// namespace basegfx { ::basegfx::BColor BColorModifierStack::getModifiedColor(const ::basegfx::BColor& rSource) const { if(maBColorModifiers.empty()) { return rSource; } ::basegfx::BColor aRetval(rSource); for(sal_uInt32 a(maBColorModifiers.size()); a;) { a--; aRetval = maBColorModifiers[a]->getModifiedColor(aRetval); } return aRetval; } } // end of namespace basegfx ////////////////////////////////////////////////////////////////////////////// // eof