You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
digikam/digikam/libs/dimg/dcolorcomposer.h

134 lines
4.5 KiB

/* ============================================================
*
* This file is a part of digiKam project
* http://www.digikam.org
*
* Date : 2006-03-02
* Description : DColor methods for composing
*
* Copyright (C) 2006-2007 by Marcel Wiesweg <marcel.wiesweg@gmx.de>
*
* This program is free software; you can redistribute it
* and/or modify it under the terms of the GNU General
* Public License as published by the Free Software Foundation;
* either version 2, or (at your option)
* any later version.
*
* This program 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 General Public License for more details.
*
* ============================================================ */
#ifndef DCOLORCOMPOSER_H
#define DCOLORCOMPOSER_H
// Local includes.
#include "dcolor.h"
#include "digikam_export.h"
namespace Digikam
{
class DIGIKAM_EXPORT DColorComposer
{
public:
/** The available rules to combine src and destination color.
For the Porter-Duff rules, the formula is
component = (source * fs + destination * fd)
where
fs, fd according to the following table with
sa = source alpha,
da = destination alpha:
None fs: sa fd: 1.0-sa
Clear fs: 0.0 fd: 0.0
Src fs: 1.0 fd: 0.0
Src Over fs: 1.0 fd: 1.0-sa
Dst Over fs: 1.0-da fd: 1.0
Src In fs: da fd: 0.0
Dst In fs: 0.0 fd: sa
Src Out fs: 1.0-da fd: 0.0
Dst Out fs: 0.0 fd: 1.0-sa
Src Atop fs: da fd: 1.0-sa
Dst Atop fs: 1.0-da fd: sa
Xor fs: 1.0-da fd: 1.0-sa
None is the default, classical blending mode, a "Src over" simplification:
Blend non-premultiplied RGBA data "src over" a fully opaque background.
Src is the painter's algorithm.
All other operations require premultiplied colors.
The documentation of java.awt.AlphaComposite (Java 1.5)
provides a good introduction and documentation on Porter Duff.
*/
enum CompositingOperation
{
PorterDuffNone,
PorterDuffClear,
PorterDuffSrc,
PorterDuffSrcOver,
PorterDuffDstOver,
PorterDuffSrcIn,
PorterDuffDstIn,
PorterDuffSrcOut,
PorterDuffDstOut,
PorterDuffSrcAtop,
PorterDuffDstAtop,
PorterDuffXor
};
enum MultiplicationFlags
{
NoMultiplication = 0x00,
PremultiplySrc = 0x01,
PremultiplyDst = 0x02,
DemultiplyDst = 0x04,
MultiplicationFlagsDImg = PremultiplySrc | PremultiplyDst | DemultiplyDst,
MultiplicationFlagsPremultipliedColorOnDImg = PremultiplyDst | DemultiplyDst
};
/**
Retrieve a DColorComposer object for one of the predefined rules.
The object needs to be deleted by the caller.
*/
static DColorComposer *getComposer(CompositingOperation rule);
/**
Carry out the actual composition process.
Src and Dest are composed and the result is written to dest.
No pre-/demultiplication is done by this method, use the other overloaded
methods, which call this method, if you need pre- or demultiplication
(you need it if any of the colors are read from or written to a DImg).
If you just pass the object to a DImg method, you do not need to call this.
Call this function if you want to compose two colors.
Implement this function if you create a custom DColorComposer.
The bit depth of source and destination color must be identical.
*/
virtual void compose(DColor &dest, DColor src) = 0;
/**
Compose the two colors by calling compose(dest, src).
Pre- and demultiplication operations are done as specified.
For PorterDuff operations except PorterDuffNone, you need
- PremultiplySrc if src is not premultiplied (read from a DImg)
- PremultiplyDst if dst is not premultiplied (read from a DImg)
- DemultiplyDst if dst will be written to non-premultiplied data (a DImg)
*/
virtual void compose(DColor &dest, DColor src, MultiplicationFlags multiplicationFlags);
virtual ~DColorComposer(){};
};
} // namespace Digikam
#endif // DCOLORCOMPOSER_H