summaryrefslogtreecommitdiff
path: root/test/renderer/pattern_atlas.test.cpp
blob: 2a19e463bdc86d3cc5206b24bc74c9597ab8d21c (plain)
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
#include <mbgl/test/util.hpp>
#include <mbgl/test/fixture_log_observer.hpp>
#include <mbgl/test/stub_style_observer.hpp>

#include <mbgl/renderer/pattern_atlas.hpp>
#include <mbgl/sprite/sprite_parser.hpp>
#include <mbgl/style/image_impl.hpp>
#include <mbgl/util/io.hpp>
#include <mbgl/util/image.hpp>
#include <mbgl/util/run_loop.hpp>
#include <mbgl/util/string.hpp>

#include <utility>

using namespace mbgl;

TEST(PatternAtlas, Basic) {
    FixtureLog log;
    PatternAtlas patternAtlas;

    auto images = parseSprite(util::read_file("test/fixtures/annotations/emerald.png"),
                              util::read_file("test/fixtures/annotations/emerald.json"));
    for (auto& image : images) {
        if (image->getID() == "metro") {
            ASSERT_TRUE(patternAtlas.addPattern(*image->baseImpl));
        }
    }
    auto found = patternAtlas.getPattern("metro");
    ASSERT_TRUE(found);

    auto metro = *found;
    EXPECT_EQ(1, metro.tl()[0]);
    EXPECT_EQ(1, metro.tl()[1]);
    EXPECT_EQ(19, metro.br()[0]);
    EXPECT_EQ(19, metro.br()[1]);
    EXPECT_EQ(18, metro.displaySize()[0]);
    EXPECT_EQ(18, metro.displaySize()[1]);
    EXPECT_EQ(1.0f, metro.pixelRatio);
    EXPECT_EQ(patternAtlas.getPixelSize(), patternAtlas.getAtlasImageForTests().size);

    test::checkImage("test/fixtures/image_manager/basic", patternAtlas.getAtlasImageForTests());
}

TEST(PatternAtlas, Updates) {
    PatternAtlas patternAtlas;

    PremultipliedImage imageA({ 16, 12 });
    imageA.fill(255);

    auto added = patternAtlas.addPattern(*makeMutable<style::Image::Impl>("one", std::move(imageA), 1));
    ASSERT_TRUE(added);
    auto found = patternAtlas.getPattern("one");
    ASSERT_TRUE(found);
    EXPECT_EQ(added->textureRect, found->textureRect);

    auto a = *found;
    EXPECT_EQ(1, a.tl()[0]);
    EXPECT_EQ(1, a.tl()[1]);
    EXPECT_EQ(17, a.br()[0]);
    EXPECT_EQ(13, a.br()[1]);
    EXPECT_EQ(16, a.displaySize()[0]);
    EXPECT_EQ(12, a.displaySize()[1]);
    EXPECT_EQ(1.0f, a.pixelRatio);
    test::checkImage("test/fixtures/image_manager/updates_before", patternAtlas.getAtlasImageForTests());

    auto imageB = makeMutable<style::Image::Impl>("one", PremultipliedImage({ 5, 5 }), 1);
    EXPECT_FALSE(patternAtlas.addPattern(*imageB)); // Already added.

    patternAtlas.removePattern("one");
    ASSERT_FALSE(patternAtlas.getPattern("one"));
    EXPECT_TRUE(patternAtlas.addPattern(*imageB)); 

    auto b = *patternAtlas.getPattern("one");
    EXPECT_EQ(1, b.tl()[0]);
    EXPECT_EQ(1, b.tl()[1]);
    EXPECT_EQ(6, b.br()[0]);
    EXPECT_EQ(6, b.br()[1]);
    EXPECT_EQ(5, b.displaySize()[0]);
    EXPECT_EQ(5, b.displaySize()[1]);
    EXPECT_EQ(1.0f, b.pixelRatio);
    test::checkImage("test/fixtures/image_manager/updates_after", patternAtlas.getAtlasImageForTests());
}