[core] Combine SpriteAtlas::getPosition with SpriteAtlas::getImage
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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&);
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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<
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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]);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user