diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2015-07-06 12:57:12 +0200 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2015-07-08 19:46:02 +0200 |
commit | a57f3ddceb889ec67d25659d0e6e324c87231cb4 (patch) | |
tree | c0e2f25332614d0764cf6b1af716933b7c4bb1f2 /test | |
parent | c5ed00ae7a3d82d28f6175b404e16cfffd782bbf (diff) | |
download | qtlocation-mapboxgl-a57f3ddceb889ec67d25659d0e6e324c87231cb4.tar.gz |
add basic SpriteAtlas test
Diffstat (limited to 'test')
-rw-r--r-- | test/annotations/sprite_atlas.cpp | 84 | ||||
-rw-r--r-- | test/test.gypi | 1 |
2 files changed, 85 insertions, 0 deletions
diff --git a/test/annotations/sprite_atlas.cpp b/test/annotations/sprite_atlas.cpp new file mode 100644 index 0000000000..92091a16c7 --- /dev/null +++ b/test/annotations/sprite_atlas.cpp @@ -0,0 +1,84 @@ +#include "../fixtures/util.hpp" + +#include <mbgl/geometry/sprite_atlas.hpp> +#include <mbgl/annotation/sprite_store.hpp> +#include <mbgl/annotation/sprite_parser.hpp> +#include <mbgl/util/io.hpp> +#include <mbgl/util/image.hpp> + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wshadow" +#include <boost/crc.hpp> +#pragma GCC diagnostic pop + +namespace { + +// from https://gist.github.com/ArtemGr/997887 +uint64_t crc64(const char* data, size_t size) { + boost::crc_optimal<64, 0x04C11DB7, 0, 0, false, false> crc; + crc.process_bytes(data, size); + return crc.checksum(); +} + +} // anonymous namespace + +using namespace mbgl; + +using namespace mbgl; + +TEST(Annotations, SpriteAtlas) { + SpriteStore store; + store.setSprites(parseSprite(util::read_file("test/fixtures/annotations/emerald.png"), + util::read_file("test/fixtures/annotations/emerald.json"))); + + SpriteAtlas atlas(63, 112, 1, store); + + EXPECT_EQ(1.0f, atlas.getPixelRatio()); + EXPECT_EQ(63, atlas.getWidth()); + EXPECT_EQ(112, atlas.getHeight()); + EXPECT_EQ(63, atlas.getTextureWidth()); + EXPECT_EQ(112, atlas.getTextureHeight()); + + // Image hasn't been created yet. + EXPECT_FALSE(atlas.getData()); + + auto metro = atlas.getImage("metro", false); + EXPECT_EQ(0, metro.pos.x); + EXPECT_EQ(0, metro.pos.y); + EXPECT_EQ(20, metro.pos.w); + EXPECT_EQ(20, metro.pos.h); + EXPECT_EQ(18, metro.pos.originalW); + EXPECT_EQ(18, metro.pos.originalH); + EXPECT_EQ(18, metro.texture->width); + EXPECT_EQ(18, metro.texture->height); + EXPECT_EQ(18, metro.texture->pixelWidth); + EXPECT_EQ(18, metro.texture->pixelHeight); + EXPECT_EQ(1.0f, metro.texture->pixelRatio); + + auto pos = atlas.getPosition("metro", false); + EXPECT_DOUBLE_EQ(20, pos.size[0]); + EXPECT_DOUBLE_EQ(20, pos.size[1]); + EXPECT_DOUBLE_EQ(1.0f / 63, pos.tl[0]); + EXPECT_DOUBLE_EQ(1.0f / 112, pos.tl[1]); + EXPECT_DOUBLE_EQ(21.0f / 63, pos.br[0]); + EXPECT_DOUBLE_EQ(21.0f / 112, pos.br[1]); + + // Different wrapping mode produces different image. + auto metro2 = atlas.getImage("metro", true); + EXPECT_EQ(20, metro2.pos.x); + EXPECT_EQ(0, metro2.pos.y); + EXPECT_EQ(20, metro2.pos.w); + EXPECT_EQ(20, metro2.pos.h); + EXPECT_EQ(18, metro2.pos.originalW); + EXPECT_EQ(18, metro2.pos.originalH); + + EXPECT_TRUE(atlas.getData()); + + const size_t bytes = atlas.getTextureWidth() * atlas.getTextureHeight() * 4; + const auto hash = crc64(reinterpret_cast<const char*>(atlas.getData()), bytes); + EXPECT_EQ(0x9875fc0595489a9fu, hash) << std::hex << hash; + + // util::write_file( + // "test/fixtures/annotations/atlas1.png", + // util::compress_png(atlas.getTextureWidth(), atlas.getTextureHeight(), atlas.getData())); +} diff --git a/test/test.gypi b/test/test.gypi index 93f1cc81ed..f5930867bb 100644 --- a/test/test.gypi +++ b/test/test.gypi @@ -37,6 +37,7 @@ 'miscellaneous/assert.cpp', + 'annotations/sprite_atlas.cpp', 'annotations/sprite_image.cpp', 'annotations/sprite_store.cpp', 'annotations/sprite_parser.cpp', |