[core] Move Sprite parsing to thread pool

This commit is contained in:
Konstantin Käfer
2017-04-20 12:28:35 +02:00
parent 03f26cb508
commit ed2ccda0e9
20 changed files with 144 additions and 74 deletions

View File

@@ -9,6 +9,7 @@
#include <mbgl/util/io.hpp>
#include <mbgl/util/image.hpp>
#include <mbgl/util/run_loop.hpp>
#include <mbgl/util/default_thread_pool.hpp>
#include <mbgl/util/string.hpp>
#include <utility>
@@ -22,7 +23,7 @@ TEST(SpriteAtlas, Basic) {
util::read_file("test/fixtures/annotations/emerald.json"));
SpriteAtlas atlas({ 63, 112 }, 1);
atlas.setSprites(spriteParseResult.get<Sprites>());
atlas.setSprites(spriteParseResult);
EXPECT_EQ(1.0f, atlas.getPixelRatio());
EXPECT_EQ(63u, atlas.getSize().width);
@@ -75,7 +76,7 @@ TEST(SpriteAtlas, Size) {
util::read_file("test/fixtures/annotations/emerald.json"));
SpriteAtlas atlas({ 63, 112 }, 1.4);
atlas.setSprites(spriteParseResult.get<Sprites>());
atlas.setSprites(spriteParseResult);
EXPECT_DOUBLE_EQ(1.4f, atlas.getPixelRatio());
EXPECT_EQ(63u, atlas.getSize().width);
@@ -266,6 +267,7 @@ public:
util::RunLoop loop;
StubFileSource fileSource;
StubStyleObserver observer;
ThreadPool threadPool { 1 };
SpriteAtlas spriteAtlas{ { 32, 32 }, 1 };
void run() {
@@ -273,7 +275,7 @@ public:
Log::setObserver(std::make_unique<Log::NullObserver>());
spriteAtlas.setObserver(&observer);
spriteAtlas.load("test/fixtures/resources/sprite", fileSource);
spriteAtlas.load("test/fixtures/resources/sprite", threadPool, fileSource);
loop.run();
}

View File

@@ -198,7 +198,7 @@ TEST(Sprite, SpriteParsing) {
const auto image_1x = util::read_file("test/fixtures/annotations/emerald.png");
const auto json_1x = util::read_file("test/fixtures/annotations/emerald.json");
const auto images = parseSprite(image_1x, json_1x).get<Sprites>();
const auto images = parseSprite(image_1x, json_1x);
std::set<std::string> names;
std::transform(images.begin(), images.end(), std::inserter(names, names.begin()),
@@ -294,10 +294,14 @@ TEST(Sprite, SpriteParsingInvalidJSON) {
const auto image_1x = util::read_file("test/fixtures/annotations/emerald.png");
const auto json_1x = R"JSON({ "image": " })JSON";
const auto error = parseSprite(image_1x, json_1x).get<std::exception_ptr>();
EXPECT_EQ(util::toString(error),
std::string("Failed to parse JSON: Missing a closing quotation mark in string. at offset 14"));
try {
parseSprite(image_1x, json_1x);
FAIL() << "Expected exception";
} catch (std::runtime_error& err) {
EXPECT_STREQ(
"Failed to parse JSON: Missing a closing quotation mark in string. at offset 14",
err.what());
}
}
TEST(Sprite, SpriteParsingEmptyImage) {
@@ -306,7 +310,7 @@ TEST(Sprite, SpriteParsingEmptyImage) {
const auto image_1x = util::read_file("test/fixtures/annotations/emerald.png");
const auto json_1x = R"JSON({ "image": {} })JSON";
const auto images = parseSprite(image_1x, json_1x).get<Sprites>();
const auto images = parseSprite(image_1x, json_1x);
EXPECT_EQ(0u, images.size());
EXPECT_EQ(1u, log.count({
@@ -323,7 +327,7 @@ TEST(Sprite, SpriteParsingSimpleWidthHeight) {
const auto image_1x = util::read_file("test/fixtures/annotations/emerald.png");
const auto json_1x = R"JSON({ "image": { "width": 32, "height": 32 } })JSON";
const auto images = parseSprite(image_1x, json_1x).get<Sprites>();
const auto images = parseSprite(image_1x, json_1x);
EXPECT_EQ(1u, images.size());
}
@@ -333,7 +337,7 @@ TEST(Sprite, SpriteParsingWidthTooBig) {
const auto image_1x = util::read_file("test/fixtures/annotations/emerald.png");
const auto json_1x = R"JSON({ "image": { "width": 65536, "height": 32 } })JSON";
const auto images = parseSprite(image_1x, json_1x).get<Sprites>();
const auto images = parseSprite(image_1x, json_1x);
EXPECT_EQ(0u, images.size());
EXPECT_EQ(1u, log.count({
@@ -356,7 +360,7 @@ TEST(Sprite, SpriteParsingNegativeWidth) {
const auto image_1x = util::read_file("test/fixtures/annotations/emerald.png");
const auto json_1x = R"JSON({ "image": { "width": -1, "height": 32 } })JSON";
const auto images = parseSprite(image_1x, json_1x).get<Sprites>();
const auto images = parseSprite(image_1x, json_1x);
EXPECT_EQ(0u, images.size());
EXPECT_EQ(1u, log.count({
@@ -379,7 +383,7 @@ TEST(Sprite, SpriteParsingNullRatio) {
const auto image_1x = util::read_file("test/fixtures/annotations/emerald.png");
const auto json_1x = R"JSON({ "image": { "width": 32, "height": 32, "pixelRatio": 0 } })JSON";
const auto images = parseSprite(image_1x, json_1x).get<Sprites>();
const auto images = parseSprite(image_1x, json_1x);
EXPECT_EQ(0u, images.size());
EXPECT_EQ(1u, log.count({

View File

@@ -33,7 +33,7 @@ public:
TransformState transformState;
ThreadPool threadPool { 1 };
AnnotationManager annotationManager { 1.0 };
style::Style style { fileSource, 1.0 };
style::Style style { threadPool, fileSource, 1.0 };
style::UpdateParameters updateParameters {
1.0,

View File

@@ -7,6 +7,7 @@
#include <mbgl/style/layer.hpp>
#include <mbgl/util/io.hpp>
#include <mbgl/util/run_loop.hpp>
#include <mbgl/util/default_thread_pool.hpp>
#include <memory>
@@ -16,8 +17,9 @@ using namespace mbgl::style;
TEST(Style, UnusedSource) {
util::RunLoop loop;
ThreadPool threadPool{ 1 };
StubFileSource fileSource;
Style style { fileSource, 1.0 };
Style style { threadPool, fileSource, 1.0 };
auto now = Clock::now();
@@ -53,8 +55,9 @@ TEST(Style, UnusedSource) {
TEST(Style, UnusedSourceActiveViaClassUpdate) {
util::RunLoop loop;
ThreadPool threadPool{ 1 };
StubFileSource fileSource;
Style style { fileSource, 1.0 };
Style style { threadPool, fileSource, 1.0 };
style.setJSON(util::read_file("test/fixtures/resources/style-unused-sources.json"));
EXPECT_TRUE(style.addClass("visible"));
@@ -86,8 +89,9 @@ TEST(Style, UnusedSourceActiveViaClassUpdate) {
TEST(Style, Properties) {
util::RunLoop loop;
ThreadPool threadPool{ 1 };
StubFileSource fileSource;
Style style { fileSource, 1.0 };
Style style { threadPool, fileSource, 1.0 };
style.setJSON(R"STYLE({"name": "Test"})STYLE");
ASSERT_EQ("Test", style.getName());
@@ -120,8 +124,9 @@ TEST(Style, Properties) {
TEST(Style, DuplicateSource) {
util::RunLoop loop;
ThreadPool threadPool{ 1 };
StubFileSource fileSource;
Style style { fileSource, 1.0 };
Style style { threadPool, fileSource, 1.0 };
style.setJSON(util::read_file("test/fixtures/resources/style-unused-sources.json"));

View File

@@ -18,6 +18,7 @@
#include <mbgl/style/layers/symbol_layer_impl.hpp>
#include <mbgl/util/color.hpp>
#include <mbgl/util/run_loop.hpp>
#include <mbgl/util/default_thread_pool.hpp>
#include <mbgl/util/io.hpp>
#include <memory>
@@ -279,8 +280,9 @@ TEST(Layer, DuplicateLayer) {
util::RunLoop loop;
// Setup style
ThreadPool threadPool{ 1 };
StubFileSource fileSource;
Style style { fileSource, 1.0 };
Style style { threadPool, fileSource, 1.0 };
style.setJSON(util::read_file("test/fixtures/resources/style-unused-sources.json"));
// Add initial layer

View File

@@ -24,7 +24,7 @@ public:
util::RunLoop loop;
ThreadPool threadPool { 1 };
AnnotationManager annotationManager { 1.0 };
style::Style style { fileSource, 1.0 };
style::Style style { threadPool, fileSource, 1.0 };
style::UpdateParameters updateParameters {
1.0,

View File

@@ -24,7 +24,7 @@ public:
util::RunLoop loop;
ThreadPool threadPool { 1 };
AnnotationManager annotationManager { 1.0 };
style::Style style { fileSource, 1.0 };
style::Style style { threadPool, fileSource, 1.0 };
Tileset tileset { { "https://example.com" }, { 0, 22 }, "none" };
style::UpdateParameters updateParameters {

View File

@@ -20,7 +20,7 @@ public:
util::RunLoop loop;
ThreadPool threadPool { 1 };
AnnotationManager annotationManager { 1.0 };
style::Style style { fileSource, 1.0 };
style::Style style { threadPool, fileSource, 1.0 };
Tileset tileset { { "https://example.com" }, { 0, 22 }, "none" };
style::UpdateParameters updateParameters {

View File

@@ -26,7 +26,7 @@ public:
util::RunLoop loop;
ThreadPool threadPool { 1 };
AnnotationManager annotationManager { 1.0 };
style::Style style { fileSource, 1.0 };
style::Style style { threadPool, fileSource, 1.0 };
Tileset tileset { { "https://example.com" }, { 0, 22 }, "none" };
style::UpdateParameters updateParameters {