/
image_premultiply.cpp
147 lines (124 loc) · 6.19 KB
/
image_premultiply.cpp
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