[Marble-devel] [PATCH 06/13] Move blending related classe to src/lib/blendings.

Torsten Rahn tackat at t-online.de
Wed Mar 31 09:36:51 CEST 2010


Looks reasonable to me. Ship it.

Torsten


On Dienstag 30 März 2010 20:32:13 Jens-Michael Hoffmann wrote:
> Move blending related classe to src/lib/blendings.
> 
> ---
>  marble/src/lib/Blending.cpp                        |   25 --
>  marble/src/lib/Blending.h                          |   36 ---
>  marble/src/lib/BlendingAlgorithms.cpp              |  285
> -------------------- marble/src/lib/BlendingAlgorithms.h                | 
> 246 ----------------- marble/src/lib/BlendingFactory.cpp                 |
>   88 ------
>  marble/src/lib/BlendingFactory.h                   |   40 ---
>  marble/src/lib/CMakeLists.txt                      |    6 +-
>  marble/src/lib/StackedTile.cpp                     |    2 +-
>  marble/src/lib/blendings/Blending.cpp              |   25 ++
>  marble/src/lib/blendings/Blending.h                |   36 +++
>  marble/src/lib/blendings/BlendingAlgorithms.cpp    |  285
> ++++++++++++++++++++ marble/src/lib/blendings/BlendingAlgorithms.h      | 
> 246 +++++++++++++++++ marble/src/lib/blendings/BlendingFactory.cpp       |
>   88 ++++++
>  marble/src/lib/blendings/BlendingFactory.h         |   40 +++
>  .../handlers/dgml/DgmlBlendingTagHandler.cpp       |    2 +-
>  15 files changed, 725 insertions(+), 725 deletions(-)
>  delete mode 100644 marble/src/lib/Blending.cpp
>  delete mode 100644 marble/src/lib/Blending.h
>  delete mode 100644 marble/src/lib/BlendingAlgorithms.cpp
>  delete mode 100644 marble/src/lib/BlendingAlgorithms.h
>  delete mode 100644 marble/src/lib/BlendingFactory.cpp
>  delete mode 100644 marble/src/lib/BlendingFactory.h
>  create mode 100644 marble/src/lib/blendings/Blending.cpp
>  create mode 100644 marble/src/lib/blendings/Blending.h
>  create mode 100644 marble/src/lib/blendings/BlendingAlgorithms.cpp
>  create mode 100644 marble/src/lib/blendings/BlendingAlgorithms.h
>  create mode 100644 marble/src/lib/blendings/BlendingFactory.cpp
>  create mode 100644 marble/src/lib/blendings/BlendingFactory.h
> 
> diff --git a/marble/src/lib/Blending.cpp b/marble/src/lib/Blending.cpp
> deleted file mode 100644
> index 6b3100d..0000000
> --- a/marble/src/lib/Blending.cpp
> +++ /dev/null
> @@ -1,25 +0,0 @@
> -// Copyright 2010 Jens-Michael Hoffmann <jmho at c-xx.com>
> -//
> -// This library is free software; you can redistribute it and/or
> -// modify it under the terms of the GNU Lesser General Public
> -// License as published by the Free Software Foundation; either
> -// version 2.1 of the License, or (at your option) any later version.
> -//
> -// This library is distributed in the hope that it will be useful,
> -// but WITHOUT ANY WARRANTY; without even the implied warranty of
> -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> -// Lesser General Public License for more details.
> -//
> -// You should have received a copy of the GNU Lesser General Public
> -// License along with this library. If not, see
> <http://www.gnu.org/licenses/>. -
> -#include "Blending.h"
> -
> -namespace Marble
> -{
> -
> -Blending::~Blending()
> -{
> -}
> -
> -}
> diff --git a/marble/src/lib/Blending.h b/marble/src/lib/Blending.h
> deleted file mode 100644
> index e9e3b42..0000000
> --- a/marble/src/lib/Blending.h
> +++ /dev/null
> @@ -1,36 +0,0 @@
> -// Copyright 2010 Jens-Michael Hoffmann <jmho at c-xx.com>
> -//
> -// This library is free software; you can redistribute it and/or
> -// modify it under the terms of the GNU Lesser General Public
> -// License as published by the Free Software Foundation; either
> -// version 2.1 of the License, or (at your option) any later version.
> -//
> -// This library is distributed in the hope that it will be useful,
> -// but WITHOUT ANY WARRANTY; without even the implied warranty of
> -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> -// Lesser General Public License for more details.
> -//
> -// You should have received a copy of the GNU Lesser General Public
> -// License along with this library. If not, see
> <http://www.gnu.org/licenses/>. -
> -#ifndef MARBLE_BLENDING_H
> -#define MARBLE_BLENDING_H
> -
> -#include <QtCore/QSharedPointer>
> -
> -class QImage;
> -
> -namespace Marble
> -{
> -class TextureTile;
> -
> -class Blending
> -{
> - public:
> -    virtual ~Blending();
> -    virtual void blend( QImage * const bottom, QSharedPointer<TextureTile>
> const & top ) const = 0; -};
> -
> -}
> -
> -#endif
> diff --git a/marble/src/lib/BlendingAlgorithms.cpp
> b/marble/src/lib/BlendingAlgorithms.cpp deleted file mode 100644
> index a11bd2e..0000000
> --- a/marble/src/lib/BlendingAlgorithms.cpp
> +++ /dev/null
> @@ -1,285 +0,0 @@
> -// Copyright 2010 Jens-Michael Hoffmann <jmho at c-xx.com>
> -//
> -// This library is free software; you can redistribute it and/or
> -// modify it under the terms of the GNU Lesser General Public
> -// License as published by the Free Software Foundation; either
> -// version 2.1 of the License, or (at your option) any later version.
> -//
> -// This library is distributed in the hope that it will be useful,
> -// but WITHOUT ANY WARRANTY; without even the implied warranty of
> -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> -// Lesser General Public License for more details.
> -//
> -// You should have received a copy of the GNU Lesser General Public
> -// License along with this library. If not, see
> <http://www.gnu.org/licenses/>. -
> -#include "BlendingAlgorithms.h"
> -
> -#include "TextureTile.h"
> -
> -#include <cmath>
> -
> -#include <QtGui/QImage>
> -
> -namespace Marble
> -{
> -
> -void IndependentChannelBlending::blend( QImage * const bottom,
> QSharedPointer<TextureTile> const & top ) const -{
> -    QImage const * const topImage = top->image();
> -    Q_ASSERT( topImage );
> -    Q_ASSERT( bottom->size() == topImage->size() );
> -    int const width = bottom->width();
> -    int const height = bottom->height();
> -    for ( int y = 0; y < height; ++y ) {
> -        for ( int x = 0; x < width; ++x ) {
> -            QRgb const bottomPixel = bottom->pixel( x, y );
> -            QRgb const topPixel = topImage->pixel( x, y );
> -            qreal const resultRed = blendChannel( qRed( bottomPixel ) /
> 255.0, -                                                  qRed( topPixel )
> / 255.0 ); -            qreal const resultGreen = blendChannel( qGreen(
> bottomPixel ) / 255.0, -                                                  
>  qGreen( topPixel ) / 255.0 ); -            qreal const resultBlue =
> blendChannel( qBlue( bottomPixel ) / 255.0, -                             
>                      qBlue( topPixel ) / 255.0 ); -           
> bottom->setPixel( x, y, qRgb( resultRed * 255.0,
> -                                          resultGreen * 255.0,
> -                                          resultBlue * 255.0 ));
> -        }
> -    }
> -}
> -
> -
> -// Neutral blendings
> -
> -qreal AllanonBlending::blendChannel( qreal const bottomColorIntensity,
> -                                     qreal const topColorIntensity ) const
> -{
> -    return ( bottomColorIntensity + topColorIntensity ) / 2.0;
> -}
> -
> -qreal ArcusTangentBlending::blendChannel( qreal const
> bottomColorIntensity, -                                          qreal
> const topColorIntensity ) const -{
> -    return 2.0 * atan( topColorIntensity / bottomColorIntensity ) / M_PI;
> -}
> -
> -qreal GeometricMeanBlending::blendChannel( qreal const
> bottomColorIntensity, -                                           qreal
> const topColorIntensity ) const -{
> -    return sqrt( bottomColorIntensity * topColorIntensity );
> -}
> -
> -qreal LinearLightBlending::blendChannel( qreal const bottomColorIntensity,
> -                                         qreal const topColorIntensity )
> const -{
> -    return qMin( 1.0, qMax( 0.0, ( bottomColorIntensity + 2.0 *
> topColorIntensity ) - 1.0 )); -}
> -
> -qreal OverlayBlending::blendChannel( qreal const bottomColorIntensity,
> -                                     qreal const topColorIntensity ) const
> -{
> -    if ( bottomColorIntensity < 0.5 )
> -        return 2.0 * bottomColorIntensity * topColorIntensity;
> -    else
> -        return 1.0 - 2.0 * ( 1.0 - bottomColorIntensity ) * ( 1.0 -
> topColorIntensity ); -}
> -
> -qreal ParallelBlending::blendChannel( qreal const bottomColorIntensity,
> -                                      qreal const topColorIntensity )
> const -{
> -    // FIXME:    return qMin( qMax( 2.0 / ( 1.0 / bottomColorIntensity +
> 1.0 / topColorIntensity )), 0.0, 1.0 ); -    return 0.0;
> -}
> -
> -qreal TextureBlending::blendChannel( qreal const bottomColorIntensity,
> -                                     qreal const topColorIntensity ) const
> -{
> -    // FIXME: return qMax( qMin( topColorIntensity + bottomColorIntensity
> ) - 0.5 ), 1.0 ), 0.0 ); -    return 0.0;
> -}
> -
> -
> -// Darkening blendings
> -
> -qreal ColorBurnBlending::blendChannel( qreal const bottomColorIntensity,
> -                                       qreal const topColorIntensity )
> const -{
> -    // FIXME: check if this formula makes sense
> -    return qMin( 1.0, qMax( 0.0, 1.0 - ( 1.0 - bottomColorIntensity ) /
> topColorIntensity )); -}
> -
> -qreal DarkBlending::blendChannel( qreal const bottomColorIntensity,
> -                                  qreal const topColorIntensity ) const
> -{
> -    return ( bottomColorIntensity + 1.0 - topColorIntensity ) *
> topColorIntensity; -}
> -
> -qreal DarkenBlending::blendChannel( qreal const bottomColorIntensity,
> -                                    qreal const topColorIntensity ) const
> -{
> -    // FIXME: is this really ok? not vice versa?
> -    return bottomColorIntensity > topColorIntensity ? topColorIntensity :
> bottomColorIntensity; -}
> -
> -qreal DivideBlending::blendChannel( qreal const bottomColorIntensity,
> -                                    qreal const topColorIntensity ) const
> -{
> -    return log2( 1.0 + bottomColorIntensity / ( 1.0 - topColorIntensity )
> / 8.0 ); -}
> -
> -qreal GammaDarkBlending::blendChannel( qreal const bottomColorIntensity,
> -                                       qreal const topColorIntensity )
> const -{
> -    return pow( bottomColorIntensity, 1.0 / topColorIntensity );
> -}
> -
> -qreal LinearBurnBlending::blendChannel( qreal const bottomColorIntensity,
> -                                        qreal const topColorIntensity )
> const -{
> -    return qMax( 0.0, bottomColorIntensity + topColorIntensity - 1.0 );
> -}
> -
> -qreal MultiplyBlending::blendChannel( qreal const bottomColorIntensity,
> -                                      qreal const topColorIntensity )
> const -{
> -    return bottomColorIntensity * topColorIntensity;
> -}
> -
> -qreal SubtractiveBlending::blendChannel( qreal const bottomColorIntensity,
> -                                         qreal const topColorIntensity )
> const -{
> -    return qMax( bottomColorIntensity - topColorIntensity, 0.0 );
> -}
> -
> -
> -// Lightening blendings
> -
> -qreal AdditiveBlending::blendChannel( qreal const bottomColorIntensity,
> -                                      qreal const topColorIntensity )
> const -{
> -    return qMin( topColorIntensity + bottomColorIntensity, 1.0 );
> -}
> -
> -qreal ColorDodgeBlending::blendChannel( qreal const bottomColorIntensity,
> -                                        qreal const topColorIntensity )
> const -{
> -    return qMin( 1.0, qMax( 0.0, bottomColorIntensity / ( 1.0 -
> topColorIntensity ))); -}
> -
> -qreal GammaLightBlending::blendChannel( qreal const bottomColorIntensity,
> -                                        qreal const topColorIntensity )
> const -{
> -    return pow( bottomColorIntensity, topColorIntensity );
> -}
> -
> -qreal HardLightBlending::blendChannel( qreal const bottomColorIntensity,
> -                                       qreal const topColorIntensity )
> const -{
> -    return topColorIntensity < 0.5
> -        ? 2.0 * bottomColorIntensity * topColorIntensity
> -        : 1.0 - 2.0 * ( 1.0 - bottomColorIntensity ) * ( 1.0 -
> topColorIntensity ); -}
> -
> -qreal LightBlending::blendChannel( qreal const bottomColorIntensity,
> -                                   qreal const topColorIntensity ) const
> -{
> -    return bottomColorIntensity * ( 1.0 - topColorIntensity ) + pow(
> topColorIntensity, 2 ); -}
> -
> -qreal LightenBlending::blendChannel( qreal const bottomColorIntensity,
> -                                     qreal const topColorIntensity ) const
> -{
> -    // is this ok?
> -    return bottomColorIntensity < topColorIntensity ? topColorIntensity :
> bottomColorIntensity; -}
> -
> -qreal PinLightBlending::blendChannel( qreal const bottomColorIntensity,
> -                                      qreal const topColorIntensity )
> const -{
> -    return qMax( 0.0, qMax( 2.0 + topColorIntensity - 1.0,
> -                            qMin( bottomColorIntensity, 2.0 *
> topColorIntensity ))); -}
> -
> -qreal ScreenBlending::blendChannel( qreal const bottomColorIntensity,
> -                                    qreal const topColorIntensity ) const
> -{
> -    return 1.0 - ( 1.0 - bottomColorIntensity ) * ( 1.0 -
> topColorIntensity ); -}
> -
> -qreal SoftLightBlending::blendChannel( qreal const bottomColorIntensity,
> -                                       qreal const topColorIntensity )
> const -{
> -    return pow( bottomColorIntensity, pow( 2.0, ( 2.0 * ( 0.5 -
> topColorIntensity )))); -}
> -
> -qreal VividLightBlending::blendChannel( qreal const bottomColorIntensity,
> -                                        qreal const topColorIntensity )
> const -{
> -    return topColorIntensity < 0.5
> -        ? qMin( 1.0, qMax( 0.0, 1.0 - ( 1.0 - bottomColorIntensity ) / (
> 2.0 * topColorIntensity ))) -        : qMin( 1.0, qMax( 0.0,
> bottomColorIntensity / ( 2.0 * ( 1.0 - topColorIntensity )))); -}
> -
> -
> -// Inverter blendings
> -
> -qreal AdditiveSubtractiveBlending::blendChannel( qreal const
> bottomColorIntensity, -                                                
> qreal const topColorIntensity ) const -{
> -    // FIXME:
> -    //    return qMin( 1.0, qMax( 0.0, abs( bottomColorIntensity *
> bottomColorIntensity -    //                                      -
> topColorIntensity * topColorIntensity ))); -    return 0.0;
> -}
> -
> -qreal BleachBlending::blendChannel( qreal const bottomColorIntensity,
> -                                    qreal const topColorIntensity ) const
> -{
> -    // FIXME: "why this is the same formula as Screen Blending? Please
> correct.)" -    return 1.0 - ( 1.0 - bottomColorIntensity ) * ( 1.0 -
> topColorIntensity ); -}
> -
> -qreal DifferenceBlending::blendChannel( qreal const bottomColorIntensity,
> -                                        qreal const topColorIntensity )
> const -{
> -    return qMax( qMin( 1.0, bottomColorIntensity - topColorIntensity + 0.5
> ), 0.0 ); -}
> -
> -qreal EquivalenceBlending::blendChannel( qreal const bottomColorIntensity,
> -                                         qreal const topColorIntensity )
> const -{
> -    return 1.0 - abs( bottomColorIntensity - topColorIntensity );
> -}
> -
> -qreal HalfDifferenceBlending::blendChannel( qreal const
> bottomColorIntensity, -                                            qreal
> const topColorIntensity ) const -{
> -    return bottomColorIntensity + topColorIntensity
> -        - 2.0 * ( bottomColorIntensity * topColorIntensity );
> -}
> -
> -
> -// Special purpose blendings
> -
> -void CloudsBlending::blend( QImage * const bottom,
> QSharedPointer<TextureTile> const & top ) const -{
> -    QImage const * const topImage = top->image();
> -    Q_ASSERT( topImage );
> -    Q_ASSERT( bottom->size() == topImage->size() );
> -    int const width = bottom->width();
> -    int const height = bottom->height();
> -    for ( int y = 0; y < height; ++y ) {
> -        for ( int x = 0; x < width; ++x ) {
> -            qreal const c = qRed( topImage->pixel( x, y )) / 255.0;
> -            QRgb const bottomPixel = bottom->pixel( x, y );
> -            int const bottomRed = qRed( bottomPixel );
> -            int const bottomGreen = qGreen( bottomPixel );
> -            int const bottomBlue = qBlue( bottomPixel );
> -            bottom->setPixel( x, y, qRgb(( int )( bottomRed + ( 255 -
> bottomRed ) * c ), -                                         ( int )(
> bottomGreen + ( 255 - bottomGreen ) * c ), -                              
>           ( int )( bottomBlue + ( 255 - bottomBlue ) * c ))); -        }
> -    }
> -}
> -
> -}
> diff --git a/marble/src/lib/BlendingAlgorithms.h
> b/marble/src/lib/BlendingAlgorithms.h deleted file mode 100644
> index a2987f3..0000000
> --- a/marble/src/lib/BlendingAlgorithms.h
> +++ /dev/null
> @@ -1,246 +0,0 @@
> -// Copyright 2010 Jens-Michael Hoffmann <jmho at c-xx.com>
> -//
> -// This library is free software; you can redistribute it and/or
> -// modify it under the terms of the GNU Lesser General Public
> -// License as published by the Free Software Foundation; either
> -// version 2.1 of the License, or (at your option) any later version.
> -//
> -// This library is distributed in the hope that it will be useful,
> -// but WITHOUT ANY WARRANTY; without even the implied warranty of
> -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> -// Lesser General Public License for more details.
> -//
> -// You should have received a copy of the GNU Lesser General Public
> -// License along with this library. If not, see
> <http://www.gnu.org/licenses/>. -
> -#ifndef MARBLE_BLENDING_ALGORITHMS_H
> -#define MARBLE_BLENDING_ALGORITHMS_H
> -
> -#include <QtCore/QtGlobal>
> -
> -#include "Blending.h"
> -
> -namespace Marble
> -{
> -
> -class IndependentChannelBlending: public Blending
> -{
> - public:
> -    virtual void blend( QImage * const bottom, QSharedPointer<TextureTile>
> const & top ) const; - private:
> -    // bottomColorIntensity: intensity of one color channel (of one pixel)
> of the bottom image -    // topColorIntensity: intensity of one color
> channel (of one pixel) of the top image -    // return: intensity of the
> color channel (of a given pixel) of the result image -    // all color
> intensity values are in the range 0..1
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const = 0;
> -};
> -
> -
> -// Neutral blendings
> -
> -class AllanonBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class ArcusTangentBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class GeometricMeanBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class LinearLightBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class NoiseBlending: public Blending // or IndependentChannelBlending?
> -{
> -};
> -
> -class OverlayBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class ParallelBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class TextureBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -
> -// Darkening blendings
> -
> -class ColorBurnBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class DarkBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class DarkenBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class DivideBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class GammaDarkBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class LinearBurnBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class MultiplyBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class SubtractiveBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -
> -// Lightening blendings
> -
> -class AdditiveBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class ColorDodgeBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class GammaLightBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class HardLightBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class LightBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class LightenBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class PinLightBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class ScreenBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class SoftLightBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class VividLightBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -
> -// Inverter blendings
> -
> -class AdditiveSubtractiveBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class BleachBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class DifferenceBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class EquivalenceBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -class HalfDifferenceBlending: public IndependentChannelBlending
> -{
> -    virtual qreal blendChannel( qreal const bottomColorIntensity,
> -                                qreal const topColorIntensity ) const;
> -};
> -
> -
> -// Special purpose blendings
> -
> -class CloudsBlending: public Blending
> -{
> - public:
> -    virtual void blend( QImage * const bottom, QSharedPointer<TextureTile>
> const & top ) const; -};
> -
> -}
> -
> -#endif
> diff --git a/marble/src/lib/BlendingFactory.cpp
> b/marble/src/lib/BlendingFactory.cpp deleted file mode 100644
> index c9247a3..0000000
> --- a/marble/src/lib/BlendingFactory.cpp
> +++ /dev/null
> @@ -1,88 +0,0 @@
> -// Copyright 2010 Jens-Michael Hoffmann <jmho at c-xx.com>
> -//
> -// This library is free software; you can redistribute it and/or
> -// modify it under the terms of the GNU Lesser General Public
> -// License as published by the Free Software Foundation; either
> -// version 2.1 of the License, or (at your option) any later version.
> -//
> -// This library is distributed in the hope that it will be useful,
> -// but WITHOUT ANY WARRANTY; without even the implied warranty of
> -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> -// Lesser General Public License for more details.
> -//
> -// You should have received a copy of the GNU Lesser General Public
> -// License along with this library. If not, see
> <http://www.gnu.org/licenses/>. -
> -#include "BlendingFactory.h"
> -
> -#include "blendings/SunLightBlending.h"
> -#include "BlendingAlgorithms.h"
> -#include "MarbleDebug.h"
> -
> -namespace Marble
> -{
> -
> -BlendingFactory const * BlendingFactory::s_instance = 0;
> -
> -BlendingFactory const * BlendingFactory::instance()
> -{
> -    if ( s_instance == 0 )
> -        s_instance = new BlendingFactory;
> -    return s_instance;
> -}
> -
> -Blending const * BlendingFactory::findBlending( QString const & name )
> const -{
> -    Blending const * const result = m_blendings.value( name, 0 );
> -    if ( !result )
> -        mDebug() << "BlendingFactory::findBlending: unknown blending:" <<
> name; -    return result;
> -}
> -
> -BlendingFactory::BlendingFactory()
> -{
> -    // Neutral blendings
> -    m_blendings.insert( "AllanonBlending", new AllanonBlending );
> -    m_blendings.insert( "ArcusTangentBlending", new ArcusTangentBlending
> ); -    m_blendings.insert( "GeometricMeanBlending", new
> GeometricMeanBlending ); -    m_blendings.insert( "LinearLightBlending",
> new LinearLightBlending ); -    //m_blendings.insert( "NoiseBlending", new
> NoiseBlending );
> -    m_blendings.insert( "OverlayBlending", new OverlayBlending );
> -    m_blendings.insert( "ParallelBlending", new ParallelBlending );
> -    m_blendings.insert( "TextureBlending", new TextureBlending );
> -
> -    // Darkening blendings
> -    m_blendings.insert( "ColorBurnBlending", new ColorBurnBlending );
> -    m_blendings.insert( "DarkBlending", new DarkBlending );
> -    m_blendings.insert( "DarkenBlending", new DarkenBlending );
> -    m_blendings.insert( "DivideBlending", new DivideBlending );
> -    m_blendings.insert( "GammaDarkBlending", new GammaDarkBlending );
> -    m_blendings.insert( "LinearBurnBlending", new LinearBurnBlending );
> -    m_blendings.insert( "MultiplyBlending", new MultiplyBlending );
> -    m_blendings.insert( "SubtractiveBlending", new SubtractiveBlending );
> -
> -    // Lightening blendings
> -    m_blendings.insert( "AdditiveBlending", new AdditiveBlending );
> -    m_blendings.insert( "ColorDodgeBlending", new ColorDodgeBlending );
> -    m_blendings.insert( "GammaLightBlending", new GammaLightBlending );
> -    m_blendings.insert( "HardLightBlending", new HardLightBlending );
> -    m_blendings.insert( "LightBlending", new LightBlending );
> -    m_blendings.insert( "LightenBlending", new LightenBlending );
> -    m_blendings.insert( "PinLightBlending", new PinLightBlending );
> -    m_blendings.insert( "ScreenBlending", new ScreenBlending );
> -    m_blendings.insert( "SoftLightBlending", new SoftLightBlending );
> -    m_blendings.insert( "VividLightBlending", new VividLightBlending );
> -
> -    // Inverter blendings
> -    m_blendings.insert( "AdditiveSubtractiveBlending", new
> AdditiveSubtractiveBlending ); -    m_blendings.insert( "BleachBlending",
> new BleachBlending );
> -    m_blendings.insert( "DifferenceBlending", new DifferenceBlending );
> -    m_blendings.insert( "EquivalenceBlending", new EquivalenceBlending );
> -    m_blendings.insert( "HalfDifferenceBlending", new
> HalfDifferenceBlending ); -
> -    // Special purpose blendings
> -    m_blendings.insert( "CloudsBlending", new CloudsBlending );
> -    m_blendings.insert( "SunLightBlending", new SunLightBlending );
> -}
> -
> -}
> diff --git a/marble/src/lib/BlendingFactory.h
> b/marble/src/lib/BlendingFactory.h deleted file mode 100644
> index d1bfc68..0000000
> --- a/marble/src/lib/BlendingFactory.h
> +++ /dev/null
> @@ -1,40 +0,0 @@
> -// Copyright 2010 Jens-Michael Hoffmann <jmho at c-xx.com>
> -//
> -// This library is free software; you can redistribute it and/or
> -// modify it under the terms of the GNU Lesser General Public
> -// License as published by the Free Software Foundation; either
> -// version 2.1 of the License, or (at your option) any later version.
> -//
> -// This library is distributed in the hope that it will be useful,
> -// but WITHOUT ANY WARRANTY; without even the implied warranty of
> -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> -// Lesser General Public License for more details.
> -//
> -// You should have received a copy of the GNU Lesser General Public
> -// License along with this library. If not, see
> <http://www.gnu.org/licenses/>. -
> -#ifndef MARBLE_BLENDING_FACTORY_H
> -#define MARBLE_BLENDING_FACTORY_H
> -
> -#include <QtCore/QHash>
> -#include <QtCore/QString>
> -
> -namespace Marble
> -{
> -class Blending;
> -
> -class BlendingFactory
> -{
> - public:
> -    static BlendingFactory const * instance();
> -    Blending const * findBlending( QString const & name ) const;
> -
> - private:
> -    static BlendingFactory const * s_instance;
> -    BlendingFactory();
> -    QHash<QString, Blending const *> m_blendings;
> -};
> -
> -}
> -
> -#endif
> diff --git a/marble/src/lib/CMakeLists.txt b/marble/src/lib/CMakeLists.txt
> index 59e4505..88a84c4 100644
> --- a/marble/src/lib/CMakeLists.txt
> +++ b/marble/src/lib/CMakeLists.txt
> @@ -59,10 +59,10 @@ set(marblewidget_SRCS
>      ${geodata_SRCS}
>      ${graphicsview_SRCS}
>      ${screengraphicsitem_SRCS}
> +    blendings/Blending.cpp
> +    blendings/BlendingAlgorithms.cpp
> +    blendings/BlendingFactory.cpp
>      blendings/SunLightBlending.cpp
> -    Blending.cpp
> -    BlendingAlgorithms.cpp
> -    BlendingFactory.cpp
>      MarbleWidget.cpp
>      MarbleModel.cpp
>      MarbleMap.cpp
> diff --git a/marble/src/lib/StackedTile.cpp
> b/marble/src/lib/StackedTile.cpp index c3cb0ef..0c2778e 100644
> --- a/marble/src/lib/StackedTile.cpp
> +++ b/marble/src/lib/StackedTile.cpp
> @@ -17,7 +17,7 @@
> 
>  #include <cmath>
> 
> -#include "Blending.h"
> +#include "blendings/Blending.h"
>  #include "GeoSceneTexture.h"
>  #include "MarbleDebug.h"
>  #include "TextureTile.h"
> diff --git a/marble/src/lib/blendings/Blending.cpp
> b/marble/src/lib/blendings/Blending.cpp new file mode 100644
> index 0000000..6b3100d
> --- /dev/null
> +++ b/marble/src/lib/blendings/Blending.cpp
> @@ -0,0 +1,25 @@
> +// Copyright 2010 Jens-Michael Hoffmann <jmho at c-xx.com>
> +//
> +// This library is free software; you can redistribute it and/or
> +// modify it under the terms of the GNU Lesser General Public
> +// License as published by the Free Software Foundation; either
> +// version 2.1 of the License, or (at your option) any later version.
> +//
> +// This library is distributed in the hope that it will be useful,
> +// but WITHOUT ANY WARRANTY; without even the implied warranty of
> +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> +// Lesser General Public License for more details.
> +//
> +// You should have received a copy of the GNU Lesser General Public
> +// License along with this library. If not, see
> <http://www.gnu.org/licenses/>. +
> +#include "Blending.h"
> +
> +namespace Marble
> +{
> +
> +Blending::~Blending()
> +{
> +}
> +
> +}
> diff --git a/marble/src/lib/blendings/Blending.h
> b/marble/src/lib/blendings/Blending.h new file mode 100644
> index 0000000..e9e3b42
> --- /dev/null
> +++ b/marble/src/lib/blendings/Blending.h
> @@ -0,0 +1,36 @@
> +// Copyright 2010 Jens-Michael Hoffmann <jmho at c-xx.com>
> +//
> +// This library is free software; you can redistribute it and/or
> +// modify it under the terms of the GNU Lesser General Public
> +// License as published by the Free Software Foundation; either
> +// version 2.1 of the License, or (at your option) any later version.
> +//
> +// This library is distributed in the hope that it will be useful,
> +// but WITHOUT ANY WARRANTY; without even the implied warranty of
> +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> +// Lesser General Public License for more details.
> +//
> +// You should have received a copy of the GNU Lesser General Public
> +// License along with this library. If not, see
> <http://www.gnu.org/licenses/>. +
> +#ifndef MARBLE_BLENDING_H
> +#define MARBLE_BLENDING_H
> +
> +#include <QtCore/QSharedPointer>
> +
> +class QImage;
> +
> +namespace Marble
> +{
> +class TextureTile;
> +
> +class Blending
> +{
> + public:
> +    virtual ~Blending();
> +    virtual void blend( QImage * const bottom, QSharedPointer<TextureTile>
> const & top ) const = 0; +};
> +
> +}
> +
> +#endif
> diff --git a/marble/src/lib/blendings/BlendingAlgorithms.cpp
> b/marble/src/lib/blendings/BlendingAlgorithms.cpp new file mode 100644
> index 0000000..a11bd2e
> --- /dev/null
> +++ b/marble/src/lib/blendings/BlendingAlgorithms.cpp
> @@ -0,0 +1,285 @@
> +// Copyright 2010 Jens-Michael Hoffmann <jmho at c-xx.com>
> +//
> +// This library is free software; you can redistribute it and/or
> +// modify it under the terms of the GNU Lesser General Public
> +// License as published by the Free Software Foundation; either
> +// version 2.1 of the License, or (at your option) any later version.
> +//
> +// This library is distributed in the hope that it will be useful,
> +// but WITHOUT ANY WARRANTY; without even the implied warranty of
> +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> +// Lesser General Public License for more details.
> +//
> +// You should have received a copy of the GNU Lesser General Public
> +// License along with this library. If not, see
> <http://www.gnu.org/licenses/>. +
> +#include "BlendingAlgorithms.h"
> +
> +#include "TextureTile.h"
> +
> +#include <cmath>
> +
> +#include <QtGui/QImage>
> +
> +namespace Marble
> +{
> +
> +void IndependentChannelBlending::blend( QImage * const bottom,
> QSharedPointer<TextureTile> const & top ) const +{
> +    QImage const * const topImage = top->image();
> +    Q_ASSERT( topImage );
> +    Q_ASSERT( bottom->size() == topImage->size() );
> +    int const width = bottom->width();
> +    int const height = bottom->height();
> +    for ( int y = 0; y < height; ++y ) {
> +        for ( int x = 0; x < width; ++x ) {
> +            QRgb const bottomPixel = bottom->pixel( x, y );
> +            QRgb const topPixel = topImage->pixel( x, y );
> +            qreal const resultRed = blendChannel( qRed( bottomPixel ) /
> 255.0, +                                                  qRed( topPixel )
> / 255.0 ); +            qreal const resultGreen = blendChannel( qGreen(
> bottomPixel ) / 255.0, +                                                  
>  qGreen( topPixel ) / 255.0 ); +            qreal const resultBlue =
> blendChannel( qBlue( bottomPixel ) / 255.0, +                             
>                      qBlue( topPixel ) / 255.0 ); +           
> bottom->setPixel( x, y, qRgb( resultRed * 255.0,
> +                                          resultGreen * 255.0,
> +                                          resultBlue * 255.0 ));
> +        }
> +    }
> +}
> +
> +
> +// Neutral blendings
> +
> +qreal AllanonBlending::blendChannel( qreal const bottomColorIntensity,
> +                                     qreal const topColorIntensity ) const
> +{
> +    return ( bottomColorIntensity + topColorIntensity ) / 2.0;
> +}
> +
> +qreal ArcusTangentBlending::blendChannel( qreal const
> bottomColorIntensity, +                                          qreal
> const topColorIntensity ) const +{
> +    return 2.0 * atan( topColorIntensity / bottomColorIntensity ) / M_PI;
> +}
> +
> +qreal GeometricMeanBlending::blendChannel( qreal const
> bottomColorIntensity, +                                           qreal
> const topColorIntensity ) const +{
> +    return sqrt( bottomColorIntensity * topColorIntensity );
> +}
> +
> +qreal LinearLightBlending::blendChannel( qreal const bottomColorIntensity,
> +                                         qreal const topColorIntensity )
> const +{
> +    return qMin( 1.0, qMax( 0.0, ( bottomColorIntensity + 2.0 *
> topColorIntensity ) - 1.0 )); +}
> +
> +qreal OverlayBlending::blendChannel( qreal const bottomColorIntensity,
> +                                     qreal const topColorIntensity ) const
> +{
> +    if ( bottomColorIntensity < 0.5 )
> +        return 2.0 * bottomColorIntensity * topColorIntensity;
> +    else
> +        return 1.0 - 2.0 * ( 1.0 - bottomColorIntensity ) * ( 1.0 -
> topColorIntensity ); +}
> +
> +qreal ParallelBlending::blendChannel( qreal const bottomColorIntensity,
> +                                      qreal const topColorIntensity )
> const +{
> +    // FIXME:    return qMin( qMax( 2.0 / ( 1.0 / bottomColorIntensity +
> 1.0 / topColorIntensity )), 0.0, 1.0 ); +    return 0.0;
> +}
> +
> +qreal TextureBlending::blendChannel( qreal const bottomColorIntensity,
> +                                     qreal const topColorIntensity ) const
> +{
> +    // FIXME: return qMax( qMin( topColorIntensity + bottomColorIntensity
> ) - 0.5 ), 1.0 ), 0.0 ); +    return 0.0;
> +}
> +
> +
> +// Darkening blendings
> +
> +qreal ColorBurnBlending::blendChannel( qreal const bottomColorIntensity,
> +                                       qreal const topColorIntensity )
> const +{
> +    // FIXME: check if this formula makes sense
> +    return qMin( 1.0, qMax( 0.0, 1.0 - ( 1.0 - bottomColorIntensity ) /
> topColorIntensity )); +}
> +
> +qreal DarkBlending::blendChannel( qreal const bottomColorIntensity,
> +                                  qreal const topColorIntensity ) const
> +{
> +    return ( bottomColorIntensity + 1.0 - topColorIntensity ) *
> topColorIntensity; +}
> +
> +qreal DarkenBlending::blendChannel( qreal const bottomColorIntensity,
> +                                    qreal const topColorIntensity ) const
> +{
> +    // FIXME: is this really ok? not vice versa?
> +    return bottomColorIntensity > topColorIntensity ? topColorIntensity :
> bottomColorIntensity; +}
> +
> +qreal DivideBlending::blendChannel( qreal const bottomColorIntensity,
> +                                    qreal const topColorIntensity ) const
> +{
> +    return log2( 1.0 + bottomColorIntensity / ( 1.0 - topColorIntensity )
> / 8.0 ); +}
> +
> +qreal GammaDarkBlending::blendChannel( qreal const bottomColorIntensity,
> +                                       qreal const topColorIntensity )
> const +{
> +    return pow( bottomColorIntensity, 1.0 / topColorIntensity );
> +}
> +
> +qreal LinearBurnBlending::blendChannel( qreal const bottomColorIntensity,
> +                                        qreal const topColorIntensity )
> const +{
> +    return qMax( 0.0, bottomColorIntensity + topColorIntensity - 1.0 );
> +}
> +
> +qreal MultiplyBlending::blendChannel( qreal const bottomColorIntensity,
> +                                      qreal const topColorIntensity )
> const +{
> +    return bottomColorIntensity * topColorIntensity;
> +}
> +
> +qreal SubtractiveBlending::blendChannel( qreal const bottomColorIntensity,
> +                                         qreal const topColorIntensity )
> const +{
> +    return qMax( bottomColorIntensity - topColorIntensity, 0.0 );
> +}
> +
> +
> +// Lightening blendings
> +
> +qreal AdditiveBlending::blendChannel( qreal const bottomColorIntensity,
> +                                      qreal const topColorIntensity )
> const +{
> +    return qMin( topColorIntensity + bottomColorIntensity, 1.0 );
> +}
> +
> +qreal ColorDodgeBlending::blendChannel( qreal const bottomColorIntensity,
> +                                        qreal const topColorIntensity )
> const +{
> +    return qMin( 1.0, qMax( 0.0, bottomColorIntensity / ( 1.0 -
> topColorIntensity ))); +}
> +
> +qreal GammaLightBlending::blendChannel( qreal const bottomColorIntensity,
> +                                        qreal const topColorIntensity )
> const +{
> +    return pow( bottomColorIntensity, topColorIntensity );
> +}
> +
> +qreal HardLightBlending::blendChannel( qreal const bottomColorIntensity,
> +                                       qreal const topColorIntensity )
> const +{
> +    return topColorIntensity < 0.5
> +        ? 2.0 * bottomColorIntensity * topColorIntensity
> +        : 1.0 - 2.0 * ( 1.0 - bottomColorIntensity ) * ( 1.0 -
> topColorIntensity ); +}
> +
> +qreal LightBlending::blendChannel( qreal const bottomColorIntensity,
> +                                   qreal const topColorIntensity ) const
> +{
> +    return bottomColorIntensity * ( 1.0 - topColorIntensity ) + pow(
> topColorIntensity, 2 ); +}
> +
> +qreal LightenBlending::blendChannel( qreal const bottomColorIntensity,
> +                                     qreal const topColorIntensity ) const
> +{
> +    // is this ok?
> +    return bottomColorIntensity < topColorIntensity ? topColorIntensity :
> bottomColorIntensity; +}
> +
> +qreal PinLightBlending::blendChannel( qreal const bottomColorIntensity,
> +                                      qreal const topColorIntensity )
> const +{
> +    return qMax( 0.0, qMax( 2.0 + topColorIntensity - 1.0,
> +                            qMin( bottomColorIntensity, 2.0 *
> topColorIntensity ))); +}
> +
> +qreal ScreenBlending::blendChannel( qreal const bottomColorIntensity,
> +                                    qreal const topColorIntensity ) const
> +{
> +    return 1.0 - ( 1.0 - bottomColorIntensity ) * ( 1.0 -
> topColorIntensity ); +}
> +
> +qreal SoftLightBlending::blendChannel( qreal const bottomColorIntensity,
> +                                       qreal const topColorIntensity )
> const +{
> +    return pow( bottomColorIntensity, pow( 2.0, ( 2.0 * ( 0.5 -
> topColorIntensity )))); +}
> +
> +qreal VividLightBlending::blendChannel( qreal const bottomColorIntensity,
> +                                        qreal const topColorIntensity )
> const +{
> +    return topColorIntensity < 0.5
> +        ? qMin( 1.0, qMax( 0.0, 1.0 - ( 1.0 - bottomColorIntensity ) / (
> 2.0 * topColorIntensity ))) +        : qMin( 1.0, qMax( 0.0,
> bottomColorIntensity / ( 2.0 * ( 1.0 - topColorIntensity )))); +}
> +
> +
> +// Inverter blendings
> +
> +qreal AdditiveSubtractiveBlending::blendChannel( qreal const
> bottomColorIntensity, +                                                
> qreal const topColorIntensity ) const +{
> +    // FIXME:
> +    //    return qMin( 1.0, qMax( 0.0, abs( bottomColorIntensity *
> bottomColorIntensity +    //                                      -
> topColorIntensity * topColorIntensity ))); +    return 0.0;
> +}
> +
> +qreal BleachBlending::blendChannel( qreal const bottomColorIntensity,
> +                                    qreal const topColorIntensity ) const
> +{
> +    // FIXME: "why this is the same formula as Screen Blending? Please
> correct.)" +    return 1.0 - ( 1.0 - bottomColorIntensity ) * ( 1.0 -
> topColorIntensity ); +}
> +
> +qreal DifferenceBlending::blendChannel( qreal const bottomColorIntensity,
> +                                        qreal const topColorIntensity )
> const +{
> +    return qMax( qMin( 1.0, bottomColorIntensity - topColorIntensity + 0.5
> ), 0.0 ); +}
> +
> +qreal EquivalenceBlending::blendChannel( qreal const bottomColorIntensity,
> +                                         qreal const topColorIntensity )
> const +{
> +    return 1.0 - abs( bottomColorIntensity - topColorIntensity );
> +}
> +
> +qreal HalfDifferenceBlending::blendChannel( qreal const
> bottomColorIntensity, +                                            qreal
> const topColorIntensity ) const +{
> +    return bottomColorIntensity + topColorIntensity
> +        - 2.0 * ( bottomColorIntensity * topColorIntensity );
> +}
> +
> +
> +// Special purpose blendings
> +
> +void CloudsBlending::blend( QImage * const bottom,
> QSharedPointer<TextureTile> const & top ) const +{
> +    QImage const * const topImage = top->image();
> +    Q_ASSERT( topImage );
> +    Q_ASSERT( bottom->size() == topImage->size() );
> +    int const width = bottom->width();
> +    int const height = bottom->height();
> +    for ( int y = 0; y < height; ++y ) {
> +        for ( int x = 0; x < width; ++x ) {
> +            qreal const c = qRed( topImage->pixel( x, y )) / 255.0;
> +            QRgb const bottomPixel = bottom->pixel( x, y );
> +            int const bottomRed = qRed( bottomPixel );
> +            int const bottomGreen = qGreen( bottomPixel );
> +            int const bottomBlue = qBlue( bottomPixel );
> +            bottom->setPixel( x, y, qRgb(( int )( bottomRed + ( 255 -
> bottomRed ) * c ), +                                         ( int )(
> bottomGreen + ( 255 - bottomGreen ) * c ), +                              
>           ( int )( bottomBlue + ( 255 - bottomBlue ) * c ))); +        }
> +    }
> +}
> +
> +}
> diff --git a/marble/src/lib/blendings/BlendingAlgorithms.h
> b/marble/src/lib/blendings/BlendingAlgorithms.h new file mode 100644
> index 0000000..a2987f3
> --- /dev/null
> +++ b/marble/src/lib/blendings/BlendingAlgorithms.h
> @@ -0,0 +1,246 @@
> +// Copyright 2010 Jens-Michael Hoffmann <jmho at c-xx.com>
> +//
> +// This library is free software; you can redistribute it and/or
> +// modify it under the terms of the GNU Lesser General Public
> +// License as published by the Free Software Foundation; either
> +// version 2.1 of the License, or (at your option) any later version.
> +//
> +// This library is distributed in the hope that it will be useful,
> +// but WITHOUT ANY WARRANTY; without even the implied warranty of
> +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> +// Lesser General Public License for more details.
> +//
> +// You should have received a copy of the GNU Lesser General Public
> +// License along with this library. If not, see
> <http://www.gnu.org/licenses/>. +
> +#ifndef MARBLE_BLENDING_ALGORITHMS_H
> +#define MARBLE_BLENDING_ALGORITHMS_H
> +
> +#include <QtCore/QtGlobal>
> +
> +#include "Blending.h"
> +
> +namespace Marble
> +{
> +
> +class IndependentChannelBlending: public Blending
> +{
> + public:
> +    virtual void blend( QImage * const bottom, QSharedPointer<TextureTile>
> const & top ) const; + private:
> +    // bottomColorIntensity: intensity of one color channel (of one pixel)
> of the bottom image +    // topColorIntensity: intensity of one color
> channel (of one pixel) of the top image +    // return: intensity of the
> color channel (of a given pixel) of the result image +    // all color
> intensity values are in the range 0..1
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const = 0;
> +};
> +
> +
> +// Neutral blendings
> +
> +class AllanonBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class ArcusTangentBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class GeometricMeanBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class LinearLightBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class NoiseBlending: public Blending // or IndependentChannelBlending?
> +{
> +};
> +
> +class OverlayBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class ParallelBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class TextureBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +
> +// Darkening blendings
> +
> +class ColorBurnBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class DarkBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class DarkenBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class DivideBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class GammaDarkBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class LinearBurnBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class MultiplyBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class SubtractiveBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +
> +// Lightening blendings
> +
> +class AdditiveBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class ColorDodgeBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class GammaLightBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class HardLightBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class LightBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class LightenBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class PinLightBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class ScreenBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class SoftLightBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class VividLightBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +
> +// Inverter blendings
> +
> +class AdditiveSubtractiveBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class BleachBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class DifferenceBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class EquivalenceBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +class HalfDifferenceBlending: public IndependentChannelBlending
> +{
> +    virtual qreal blendChannel( qreal const bottomColorIntensity,
> +                                qreal const topColorIntensity ) const;
> +};
> +
> +
> +// Special purpose blendings
> +
> +class CloudsBlending: public Blending
> +{
> + public:
> +    virtual void blend( QImage * const bottom, QSharedPointer<TextureTile>
> const & top ) const; +};
> +
> +}
> +
> +#endif
> diff --git a/marble/src/lib/blendings/BlendingFactory.cpp
> b/marble/src/lib/blendings/BlendingFactory.cpp new file mode 100644
> index 0000000..c9247a3
> --- /dev/null
> +++ b/marble/src/lib/blendings/BlendingFactory.cpp
> @@ -0,0 +1,88 @@
> +// Copyright 2010 Jens-Michael Hoffmann <jmho at c-xx.com>
> +//
> +// This library is free software; you can redistribute it and/or
> +// modify it under the terms of the GNU Lesser General Public
> +// License as published by the Free Software Foundation; either
> +// version 2.1 of the License, or (at your option) any later version.
> +//
> +// This library is distributed in the hope that it will be useful,
> +// but WITHOUT ANY WARRANTY; without even the implied warranty of
> +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> +// Lesser General Public License for more details.
> +//
> +// You should have received a copy of the GNU Lesser General Public
> +// License along with this library. If not, see
> <http://www.gnu.org/licenses/>. +
> +#include "BlendingFactory.h"
> +
> +#include "blendings/SunLightBlending.h"
> +#include "BlendingAlgorithms.h"
> +#include "MarbleDebug.h"
> +
> +namespace Marble
> +{
> +
> +BlendingFactory const * BlendingFactory::s_instance = 0;
> +
> +BlendingFactory const * BlendingFactory::instance()
> +{
> +    if ( s_instance == 0 )
> +        s_instance = new BlendingFactory;
> +    return s_instance;
> +}
> +
> +Blending const * BlendingFactory::findBlending( QString const & name )
> const +{
> +    Blending const * const result = m_blendings.value( name, 0 );
> +    if ( !result )
> +        mDebug() << "BlendingFactory::findBlending: unknown blending:" <<
> name; +    return result;
> +}
> +
> +BlendingFactory::BlendingFactory()
> +{
> +    // Neutral blendings
> +    m_blendings.insert( "AllanonBlending", new AllanonBlending );
> +    m_blendings.insert( "ArcusTangentBlending", new ArcusTangentBlending
> ); +    m_blendings.insert( "GeometricMeanBlending", new
> GeometricMeanBlending ); +    m_blendings.insert( "LinearLightBlending",
> new LinearLightBlending ); +    //m_blendings.insert( "NoiseBlending", new
> NoiseBlending );
> +    m_blendings.insert( "OverlayBlending", new OverlayBlending );
> +    m_blendings.insert( "ParallelBlending", new ParallelBlending );
> +    m_blendings.insert( "TextureBlending", new TextureBlending );
> +
> +    // Darkening blendings
> +    m_blendings.insert( "ColorBurnBlending", new ColorBurnBlending );
> +    m_blendings.insert( "DarkBlending", new DarkBlending );
> +    m_blendings.insert( "DarkenBlending", new DarkenBlending );
> +    m_blendings.insert( "DivideBlending", new DivideBlending );
> +    m_blendings.insert( "GammaDarkBlending", new GammaDarkBlending );
> +    m_blendings.insert( "LinearBurnBlending", new LinearBurnBlending );
> +    m_blendings.insert( "MultiplyBlending", new MultiplyBlending );
> +    m_blendings.insert( "SubtractiveBlending", new SubtractiveBlending );
> +
> +    // Lightening blendings
> +    m_blendings.insert( "AdditiveBlending", new AdditiveBlending );
> +    m_blendings.insert( "ColorDodgeBlending", new ColorDodgeBlending );
> +    m_blendings.insert( "GammaLightBlending", new GammaLightBlending );
> +    m_blendings.insert( "HardLightBlending", new HardLightBlending );
> +    m_blendings.insert( "LightBlending", new LightBlending );
> +    m_blendings.insert( "LightenBlending", new LightenBlending );
> +    m_blendings.insert( "PinLightBlending", new PinLightBlending );
> +    m_blendings.insert( "ScreenBlending", new ScreenBlending );
> +    m_blendings.insert( "SoftLightBlending", new SoftLightBlending );
> +    m_blendings.insert( "VividLightBlending", new VividLightBlending );
> +
> +    // Inverter blendings
> +    m_blendings.insert( "AdditiveSubtractiveBlending", new
> AdditiveSubtractiveBlending ); +    m_blendings.insert( "BleachBlending",
> new BleachBlending );
> +    m_blendings.insert( "DifferenceBlending", new DifferenceBlending );
> +    m_blendings.insert( "EquivalenceBlending", new EquivalenceBlending );
> +    m_blendings.insert( "HalfDifferenceBlending", new
> HalfDifferenceBlending ); +
> +    // Special purpose blendings
> +    m_blendings.insert( "CloudsBlending", new CloudsBlending );
> +    m_blendings.insert( "SunLightBlending", new SunLightBlending );
> +}
> +
> +}
> diff --git a/marble/src/lib/blendings/BlendingFactory.h
> b/marble/src/lib/blendings/BlendingFactory.h new file mode 100644
> index 0000000..d1bfc68
> --- /dev/null
> +++ b/marble/src/lib/blendings/BlendingFactory.h
> @@ -0,0 +1,40 @@
> +// Copyright 2010 Jens-Michael Hoffmann <jmho at c-xx.com>
> +//
> +// This library is free software; you can redistribute it and/or
> +// modify it under the terms of the GNU Lesser General Public
> +// License as published by the Free Software Foundation; either
> +// version 2.1 of the License, or (at your option) any later version.
> +//
> +// This library is distributed in the hope that it will be useful,
> +// but WITHOUT ANY WARRANTY; without even the implied warranty of
> +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> +// Lesser General Public License for more details.
> +//
> +// You should have received a copy of the GNU Lesser General Public
> +// License along with this library. If not, see
> <http://www.gnu.org/licenses/>. +
> +#ifndef MARBLE_BLENDING_FACTORY_H
> +#define MARBLE_BLENDING_FACTORY_H
> +
> +#include <QtCore/QHash>
> +#include <QtCore/QString>
> +
> +namespace Marble
> +{
> +class Blending;
> +
> +class BlendingFactory
> +{
> + public:
> +    static BlendingFactory const * instance();
> +    Blending const * findBlending( QString const & name ) const;
> +
> + private:
> +    static BlendingFactory const * s_instance;
> +    BlendingFactory();
> +    QHash<QString, Blending const *> m_blendings;
> +};
> +
> +}
> +
> +#endif
> diff --git
> a/marble/src/lib/geodata/handlers/dgml/DgmlBlendingTagHandler.cpp
> b/marble/src/lib/geodata/handlers/dgml/DgmlBlendingTagHandler.cpp index
> f085366..1a2aaf3 100644
> --- a/marble/src/lib/geodata/handlers/dgml/DgmlBlendingTagHandler.cpp
> +++ b/marble/src/lib/geodata/handlers/dgml/DgmlBlendingTagHandler.cpp
> @@ -15,7 +15,7 @@
> 
>  #include "DgmlBlendingTagHandler.h"
> 
> -#include "BlendingFactory.h"
> +#include "blendings/BlendingFactory.h"
>  #include "DgmlAttributeDictionary.h"
>  #include "DgmlElementDictionary.h"
>  #include "GeoParser.h"



More information about the Marble-devel mailing list