summaryrefslogtreecommitdiffstats
path: root/src/libnr/nr-gradient.cpp
diff options
context:
space:
mode:
authorMenTaLguY <mental@rydia.net>2007-08-30 03:58:15 +0000
committermental <mental@users.sourceforge.net>2007-08-30 03:58:15 +0000
commit852b0b99e87207d5b95c9f1c7f4ebf9be14a1c6e (patch)
tree66757b9e48f0f26c397765c264a131d2442b2a47 /src/libnr/nr-gradient.cpp
parentupdated Slovak (sk) translation in trunk (diff)
downloadinkscape-852b0b99e87207d5b95c9f1c7f4ebf9be14a1c6e.tar.gz
inkscape-852b0b99e87207d5b95c9f1c7f4ebf9be14a1c6e.zip
fix compositing for premultiplication and non-alpha cases
(bzr r3617)
Diffstat (limited to 'src/libnr/nr-gradient.cpp')
-rw-r--r--src/libnr/nr-gradient.cpp43
1 files changed, 39 insertions, 4 deletions
diff --git a/src/libnr/nr-gradient.cpp b/src/libnr/nr-gradient.cpp
index fdeafa0ed..2d52767bf 100644
--- a/src/libnr/nr-gradient.cpp
+++ b/src/libnr/nr-gradient.cpp
@@ -101,13 +101,48 @@ static void compose(NRPixBlock *pb, unsigned char *dest,
}
};
-template <NR_PIXBLOCK_MODE mode>
-struct Compose<mode, true> {
-static const unsigned bpp=ModeTraits<mode>::bpp;
+template <>
+struct Compose<NR_PIXBLOCK_MODE_R8G8B8A8N, true> {
+static const unsigned bpp=4;
+static void compose(NRPixBlock *pb, unsigned char *dest,
+ NRPixBlock *spb, unsigned char const *src)
+{
+ std::memcpy(dest, src, 4);
+}
+};
+
+template <>
+struct Compose<NR_PIXBLOCK_MODE_R8G8B8A8P, true> {
+static const unsigned bpp=4;
+static void compose(NRPixBlock *pb, unsigned char *dest,
+ NRPixBlock *spb, unsigned char const *src)
+{
+ dest[0] = NR_PREMUL_111(src[0], src[3]);
+ dest[1] = NR_PREMUL_111(src[1], src[3]);
+ dest[2] = NR_PREMUL_111(src[2], src[3]);
+ dest[3] = src[3];
+}
+};
+
+template <>
+struct Compose<NR_PIXBLOCK_MODE_R8G8B8, true> {
+static const unsigned bpp=3;
+static void compose(NRPixBlock *pb, unsigned char *dest,
+ NRPixBlock *spb, unsigned char const *src)
+{
+ dest[0] = NR_COMPOSEN11_1111(src[0], src[3], 255);
+ dest[1] = NR_COMPOSEN11_1111(src[1], src[3], 255);
+ dest[2] = NR_COMPOSEN11_1111(src[2], src[3], 255);
+}
+};
+
+template <>
+struct Compose<NR_PIXBLOCK_MODE_A8, true> {
+static const unsigned bpp=1;
static void compose(NRPixBlock *pb, unsigned char *dest,
NRPixBlock *spb, unsigned char const *src)
{
- std::memcpy(dest, src, bpp);
+ dest[0] = src[3];
}
};