summaryrefslogtreecommitdiffstats
path: root/src/libs/dimg/dcolorcomposer.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/dimg/dcolorcomposer.h')
-rw-r--r--src/libs/dimg/dcolorcomposer.h133
1 files changed, 133 insertions, 0 deletions
diff --git a/src/libs/dimg/dcolorcomposer.h b/src/libs/dimg/dcolorcomposer.h
new file mode 100644
index 00000000..3e885ca8
--- /dev/null
+++ b/src/libs/dimg/dcolorcomposer.h
@@ -0,0 +1,133 @@
+/* ============================================================
+ *
+ * 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 <[email protected]>
+ *
+ * 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