File: image_premultiply.cpp

package info (click to toggle)
mapnik 4.2.1%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 18,592 kB
  • sloc: cpp: 163,859; python: 1,332; sh: 690; xml: 161; makefile: 123; perl: 28; lisp: 13
file content (147 lines) | stat: -rw-r--r-- 6,888 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147

#include "catch.hpp"

// mapnik
#include <mapnik/image_any.hpp>
#include <mapnik/color.hpp>
#include <mapnik/image_util.hpp>

TEST_CASE("image premultiply")
{
    SECTION("test rgba8")
    {
        mapnik::image_rgba8 im(4, 4);
        mapnik::image_rgba8 im2(4, 4, true, true); // Initialize as already premultiplied
        mapnik::image_any im_any(mapnik::image_rgba8(4, 4));
        mapnik::image_any im2_any(mapnik::image_rgba8(4, 4, true, true));

        // First test that the default state is correct for each
        CHECK_FALSE(im.get_premultiplied());
        CHECK_FALSE(im_any.get_premultiplied());
        CHECK(im2.get_premultiplied());
        CHECK(im2_any.get_premultiplied());

        // Set the image to premultiplied
        im.set_premultiplied(true);
        CHECK(im.get_premultiplied());
        // Set back to not premultiplied
        im.set_premultiplied(false);
        CHECK_FALSE(im.get_premultiplied());

        mapnik::set_premultiplied_alpha(im, true);
        CHECK(im.get_premultiplied());
        mapnik::set_premultiplied_alpha(im, false);
        CHECK_FALSE(im.get_premultiplied());

        // Fill the images with meaningfull values
        mapnik::color c1(57, 70, 128, 128);       // This color is not premultiplied
        mapnik::color c2(57, 70, 128, 128, true); // This color is premultiplied
        mapnik::fill(im, c2);                     // Because c2 is premultiplied it will make the image premultiplied
        mapnik::fill(im_any, c2);                 // Because c2 is premultiplied it will make the image premultiplied
        mapnik::fill(im2, c1);     // Because c1 is not premultiplied it will make the image not premultiplied
        mapnik::fill(im2_any, c1); // Because c1 is not premultiplied it will make the image not premultiplied

        // Demultipled via image_util
        CHECK(mapnik::demultiply_alpha(im));            // Should return true as was premultiplied
        CHECK(mapnik::demultiply_alpha(im_any));        // Should return true as was premultiplied
        CHECK_FALSE(mapnik::demultiply_alpha(im2));     // Should return false as was demultiplied
        CHECK_FALSE(mapnik::demultiply_alpha(im2_any)); // Should return false as was demultiplied

        mapnik::color out;
        // This will be higher because it became demultiplied!
        out = mapnik::get_pixel<mapnik::color>(im, 0, 0);
        CHECK(static_cast<int>(out.red()) == 113);
        CHECK(static_cast<int>(out.green()) == 139);
        CHECK(static_cast<int>(out.blue()) == 255);
        CHECK(static_cast<int>(out.alpha()) == 128);
        out = mapnik::get_pixel<mapnik::color>(im_any, 0, 0);
        CHECK(static_cast<int>(out.red()) == 113);
        CHECK(static_cast<int>(out.green()) == 139);
        CHECK(static_cast<int>(out.blue()) == 255);
        CHECK(static_cast<int>(out.alpha()) == 128);
        // This will be the same because it was already demultiplied
        out = mapnik::get_pixel<mapnik::color>(im2, 0, 0);
        CHECK(static_cast<int>(out.red()) == 57);
        CHECK(static_cast<int>(out.green()) == 70);
        CHECK(static_cast<int>(out.blue()) == 128);
        CHECK(static_cast<int>(out.alpha()) == 128);
        out = mapnik::get_pixel<mapnik::color>(im2_any, 0, 0);
        CHECK(static_cast<int>(out.red()) == 57);
        CHECK(static_cast<int>(out.green()) == 70);
        CHECK(static_cast<int>(out.blue()) == 128);
        CHECK(static_cast<int>(out.alpha()) == 128);

        // Set back to im2s to "premultiplied" with out changing underlying values
        mapnik::set_premultiplied_alpha(im2, true);
        mapnik::set_premultiplied_alpha(im2_any, true);

        // Demultipled via image_util
        CHECK(mapnik::premultiply_alpha(im));            // Should return true as was demultiplied
        CHECK(mapnik::premultiply_alpha(im_any));        // Should return true as was demultiplied
        CHECK_FALSE(mapnik::premultiply_alpha(im2));     // Should return false as was premultiplied
        CHECK_FALSE(mapnik::premultiply_alpha(im2_any)); // Should return false as was premultiplied

        // This will be the same because it was already demultiplied
        out = mapnik::get_pixel<mapnik::color>(im, 0, 0);
        CHECK(static_cast<int>(out.red()) == 57);
        CHECK(static_cast<int>(out.green()) == 70);
        CHECK(static_cast<int>(out.blue()) == 128);
        CHECK(static_cast<int>(out.alpha()) == 128);
        out = mapnik::get_pixel<mapnik::color>(im_any, 0, 0);
        CHECK(static_cast<int>(out.red()) == 57);
        CHECK(static_cast<int>(out.green()) == 70);
        CHECK(static_cast<int>(out.blue()) == 128);
        CHECK(static_cast<int>(out.alpha()) == 128);
        // This will be the same because it was already demultiplied
        out = mapnik::get_pixel<mapnik::color>(im2, 0, 0);
        CHECK(static_cast<int>(out.red()) == 57);
        CHECK(static_cast<int>(out.green()) == 70);
        CHECK(static_cast<int>(out.blue()) == 128);
        CHECK(static_cast<int>(out.alpha()) == 128);
        out = mapnik::get_pixel<mapnik::color>(im2_any, 0, 0);
        CHECK(static_cast<int>(out.red()) == 57);
        CHECK(static_cast<int>(out.green()) == 70);
        CHECK(static_cast<int>(out.blue()) == 128);
        CHECK(static_cast<int>(out.alpha()) == 128);

    } // END SECTION

    SECTION("test gray8")
    {
        mapnik::image_gray8 im(4, 4);
        mapnik::image_gray8 im2(4, 4, true, true); // Initialize as already premultiplied
        mapnik::image_any im_any(mapnik::image_gray8(4, 4));
        mapnik::image_any im2_any(mapnik::image_gray8(4, 4, true, true));

        // First test that the default state is correct for each
        CHECK_FALSE(im.get_premultiplied());
        CHECK_FALSE(im_any.get_premultiplied());
        CHECK(im2.get_premultiplied());
        CHECK(im2_any.get_premultiplied());

        // Set the image to premultiplied
        im.set_premultiplied(true);
        CHECK(im.get_premultiplied());
        // Set back to not premultiplied
        im.set_premultiplied(false);
        CHECK_FALSE(im.get_premultiplied());

        mapnik::set_premultiplied_alpha(im, true);
        CHECK(im.get_premultiplied());
        mapnik::set_premultiplied_alpha(im, false);
        CHECK_FALSE(im.get_premultiplied());

        // Always fails on demultiply since its gray8
        CHECK_FALSE(mapnik::demultiply_alpha(im));
        CHECK_FALSE(mapnik::demultiply_alpha(im_any));
        CHECK_FALSE(mapnik::demultiply_alpha(im2));
        CHECK_FALSE(mapnik::demultiply_alpha(im2_any));

        // Always fails on premultiply since its gray8
        CHECK_FALSE(mapnik::premultiply_alpha(im));
        CHECK_FALSE(mapnik::premultiply_alpha(im_any));
        CHECK_FALSE(mapnik::premultiply_alpha(im2));
        CHECK_FALSE(mapnik::premultiply_alpha(im2_any));

    } // END SECTION
} // END TEST_CASE