File: image_premultiply.cpp

package info (click to toggle)
mapnik 3.0.12%2Bds-3
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 17,084 kB
  • ctags: 18,454
  • sloc: cpp: 142,516; python: 1,416; sh: 769; makefile: 170; xml: 140; lisp: 13
file content (147 lines) | stat: -rw-r--r-- 6,335 bytes parent folder | download | duplicates (4)
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