[core] Combine SpriteAtlas::getPosition with SpriteAtlas::getImage

This commit is contained in:
John Firebaugh
2017-02-13 16:05:26 -08:00
parent 58de1e15c5
commit d819ece74c
11 changed files with 50 additions and 60 deletions

View File

@@ -13,8 +13,8 @@ static_assert(sizeof(FillLayoutVertex) == 4, "expected FillLayoutVertex size");
FillPatternUniforms::Values
FillPatternUniforms::values(mat4 matrix,
Size framebufferSize,
const SpriteAtlasPosition& a,
const SpriteAtlasPosition& b,
const SpriteAtlasElement& a,
const SpriteAtlasElement& b,
const Faded<std::string>& fading,
const UnwrappedTileID& tileID,
const TransformState& state)

View File

@@ -16,7 +16,7 @@
namespace mbgl {
class SpriteAtlasPosition;
class SpriteAtlasElement;
class UnwrappedTileID;
class TransformState;
@@ -61,8 +61,8 @@ struct FillPatternUniforms : gl::Uniforms<
{
static Values values(mat4 matrix,
Size framebufferSize,
const SpriteAtlasPosition&,
const SpriteAtlasPosition&,
const SpriteAtlasElement&,
const SpriteAtlasElement&,
const style::Faded<std::string>&,
const UnwrappedTileID&,
const TransformState&);

View File

@@ -88,8 +88,8 @@ LinePatternProgram::uniformValues(const LinePaintProperties::Evaluated& properti
const RenderTile& tile,
const TransformState& state,
const std::array<float, 2>& pixelsToGLUnits,
const SpriteAtlasPosition& posA,
const SpriteAtlasPosition& posB) {
const SpriteAtlasElement& posA,
const SpriteAtlasElement& posB) {
std::array<float, 2> sizeA {{
tile.id.pixelsToTileUnits(posA.size[0] * properties.get<LinePattern>().fromScale, state.getIntegerZoom()),
posA.size[1]

View File

@@ -16,7 +16,7 @@ namespace mbgl {
class RenderTile;
class TransformState;
class LinePatternPos;
class SpriteAtlasPosition;
class SpriteAtlasElement;
namespace uniforms {
MBGL_DEFINE_UNIFORM_SCALAR(float, u_ratio);
@@ -123,8 +123,8 @@ public:
const RenderTile&,
const TransformState&,
const std::array<float, 2>& pixelsToGLUnits,
const SpriteAtlasPosition& posA,
const SpriteAtlasPosition& posB);
const SpriteAtlasElement& posA,
const SpriteAtlasElement& posB);
};
class LineSDFProgram : public Program<

View File

@@ -24,9 +24,9 @@ void Painter::renderBackground(PaintParameters& parameters, const BackgroundLaye
const FillProgram::PaintPropertyBinders paintAttibuteData(properties, 0);
if (!background.get<BackgroundPattern>().to.empty()) {
optional<SpriteAtlasPosition> imagePosA = spriteAtlas->getPosition(
optional<SpriteAtlasElement> imagePosA = spriteAtlas->getImage(
background.get<BackgroundPattern>().from, SpritePatternMode::Repeating);
optional<SpriteAtlasPosition> imagePosB = spriteAtlas->getPosition(
optional<SpriteAtlasElement> imagePosB = spriteAtlas->getImage(
background.get<BackgroundPattern>().to, SpritePatternMode::Repeating);
if (!imagePosA || !imagePosB)

View File

@@ -24,9 +24,9 @@ void Painter::renderFill(PaintParameters& parameters,
return;
}
optional<SpriteAtlasPosition> imagePosA = spriteAtlas->getPosition(
optional<SpriteAtlasElement> imagePosA = spriteAtlas->getImage(
properties.get<FillPattern>().from, SpritePatternMode::Repeating);
optional<SpriteAtlasPosition> imagePosB = spriteAtlas->getPosition(
optional<SpriteAtlasElement> imagePosB = spriteAtlas->getImage(
properties.get<FillPattern>().to, SpritePatternMode::Repeating);
if (!imagePosA || !imagePosB) {

View File

@@ -61,9 +61,9 @@ void Painter::renderLine(PaintParameters& parameters,
lineAtlas->getSize().width));
} else if (!properties.get<LinePattern>().from.empty()) {
optional<SpriteAtlasPosition> posA = spriteAtlas->getPosition(
optional<SpriteAtlasElement> posA = spriteAtlas->getImage(
properties.get<LinePattern>().from, SpritePatternMode::Repeating);
optional<SpriteAtlasPosition> posB = spriteAtlas->getPosition(
optional<SpriteAtlasElement> posB = spriteAtlas->getImage(
properties.get<LinePattern>().to, SpritePatternMode::Repeating);
if (!posA || !posB)

View File

@@ -27,6 +27,23 @@ struct SpriteAtlas::Loader {
std::unique_ptr<AsyncRequest> spriteRequest;
};
SpriteAtlasElement::SpriteAtlasElement(Rect<uint16_t> rect_,
std::shared_ptr<const SpriteImage> image_,
Size size_, float pixelRatio)
: pos(std::move(rect_)),
spriteImage(std::move(image_)),
relativePixelRatio(spriteImage->pixelRatio / pixelRatio) {
const float padding = 1;
const float w = spriteImage->getWidth() * relativePixelRatio;
const float h = spriteImage->getHeight() * relativePixelRatio;
size = {{ float(spriteImage->getWidth()), spriteImage->getHeight() }};
tl = {{ float(pos.x + padding) / size_.width, float(pos.y + padding) / size_.height }};
br = {{ float(pos.x + padding + w) / size_.width, float(pos.y + padding + h) / size_.height }};
}
SpriteAtlas::SpriteAtlas(Size size_, float pixelRatio_)
: size(std::move(size_)),
pixelRatio(pixelRatio_),
@@ -192,7 +209,8 @@ optional<SpriteAtlasElement> SpriteAtlas::getImage(const std::string& name,
return SpriteAtlasElement {
*entry.iconRect,
entry.spriteImage,
entry.spriteImage->pixelRatio / pixelRatio
size,
pixelRatio
};
}
@@ -200,7 +218,8 @@ optional<SpriteAtlasElement> SpriteAtlas::getImage(const std::string& name,
return SpriteAtlasElement {
*entry.patternRect,
entry.spriteImage,
entry.spriteImage->pixelRatio / pixelRatio
size,
pixelRatio
};
}
@@ -233,31 +252,8 @@ optional<SpriteAtlasElement> SpriteAtlas::getImage(const std::string& name,
return SpriteAtlasElement {
rect,
entry.spriteImage,
entry.spriteImage->pixelRatio / pixelRatio
};
}
optional<SpriteAtlasPosition> SpriteAtlas::getPosition(const std::string& name,
const SpritePatternMode mode) {
std::lock_guard<std::recursive_mutex> lock(mutex);
auto img = getImage(name, mode);
if (!img) {
return {};
}
auto rect = (*img).pos;
const float padding = 1;
auto spriteImage = (*img).spriteImage;
const float w = spriteImage->getWidth() * (*img).relativePixelRatio;
const float h = spriteImage->getHeight() * (*img).relativePixelRatio;
return SpriteAtlasPosition {
{{ float(spriteImage->getWidth()), spriteImage->getHeight() }},
{{ float(rect.x + padding) / size.width, float(rect.y + padding) / size.height }},
{{ float(rect.x + padding + w) / size.width, float(rect.y + padding + h) / size.height }}
size,
pixelRatio
};
}

View File

@@ -23,21 +23,17 @@ namespace gl {
class Context;
} // namespace gl
class SpriteImage;
class SpritePosition;
class SpriteAtlasPosition {
public:
std::array<float, 2> size = {{ 0, 0 }};
std::array<float, 2> tl = {{ 0, 0 }};
std::array<float, 2> br = {{ 0, 0 }};
};
class SpriteAtlasElement {
public:
SpriteAtlasElement(Rect<uint16_t>, std::shared_ptr<const SpriteImage>, Size size, float pixelRatio);
Rect<uint16_t> pos;
std::shared_ptr<const SpriteImage> spriteImage;
float relativePixelRatio;
std::array<float, 2> size;
std::array<float, 2> tl;
std::array<float, 2> br;
};
enum class SpritePatternMode : bool {
@@ -78,10 +74,6 @@ public:
// the resulting icon measurements. If not, returns an empty optional.
optional<SpriteAtlasElement> getImage(const std::string& name, SpritePatternMode mode);
// This function is used for getting the position during render time.
optional<SpriteAtlasPosition> getPosition(const std::string& name,
SpritePatternMode mode = SpritePatternMode::Single);
// Binds the atlas texture to the GPU, and uploads data if it is out of date.
void bind(bool linear, gl::Context&, gl::TextureUnit unit);

View File

@@ -42,7 +42,7 @@ TEST(SpriteAtlas, Basic) {
EXPECT_EQ(63u, atlas.getAtlasImage().size.width);
EXPECT_EQ(112u, atlas.getAtlasImage().size.height);
auto pos = *atlas.getPosition("metro", SpritePatternMode::Single);
auto pos = *atlas.getImage("metro", SpritePatternMode::Single);
EXPECT_DOUBLE_EQ(18, pos.size[0]);
EXPECT_DOUBLE_EQ(18, pos.size[1]);
EXPECT_DOUBLE_EQ(1.0f / 63, pos.tl[0]);

View File

@@ -14,7 +14,8 @@ TEST(getIconQuads, normal) {
Anchor anchor(2.0, 3.0, 0.0, 0.5f, 0);
SpriteAtlasElement image = {
Rect<uint16_t>( 0, 0, 15, 11 ),
std::shared_ptr<const SpriteImage>(),
std::make_shared<const SpriteImage>(PremultipliedImage({1,1}), 1.0),
{ 0, 0 },
1.0f
};
PositionedIcon shapedIcon(image, -5.0, 6.0, -7.0, 8.0, 0);
@@ -44,7 +45,8 @@ TEST(getIconQuads, style) {
Anchor anchor(0.0, 0.0, 0.0, 0.5f, 0);
SpriteAtlasElement image = {
Rect<uint16_t>( 0, 0, 20, 20 ),
std::shared_ptr<const SpriteImage>(),
std::make_shared<const SpriteImage>(PremultipliedImage({1,1}), 1.0),
{ 0, 0 },
1.0f
};
PositionedIcon shapedIcon(image, -10.0, 10.0, -10.0, 10.0, 0);