DynamicAtlas argument passthrough, submodule update

This commit is contained in:
Chlumsky 2023-04-07 15:39:54 +02:00
parent f6a1bc9f76
commit 39b0f28b44
6 changed files with 34 additions and 11 deletions

@ -1 +1 @@
Subproject commit a3dcadb9df2b5d45db2691ceea84318c711cb3e1
Subproject commit 34134bde3cea35a93c2ae5703fa8d3d463793400

View File

@ -24,6 +24,9 @@ public:
typedef int ChangeFlags;
DynamicAtlas();
/// Initializes generator with dimensions and custom arguments for generator
template <typename... ARGS>
explicit DynamicAtlas(int minSide, ARGS... args);
/// Creates with a configured generator. The generator must not contain any prior glyphs!
explicit DynamicAtlas(AtlasGenerator &&generator);
/// Adds a batch of glyphs. Adding more than one glyph at a time may improve packing efficiency
@ -33,14 +36,14 @@ public:
const AtlasGenerator & atlasGenerator() const;
private:
AtlasGenerator generator;
RectanglePacker packer;
int glyphCount;
int side;
int padding;
int glyphCount;
int totalArea;
RectanglePacker packer;
AtlasGenerator generator;
std::vector<Rectangle> rectangles;
std::vector<Remap> remapBuffer;
int totalArea;
int padding;
};

View File

@ -3,11 +3,25 @@
namespace msdf_atlas {
template <class AtlasGenerator>
DynamicAtlas<AtlasGenerator>::DynamicAtlas() : glyphCount(0), side(0), totalArea(0), padding(0) { }
static int ceilPOT(int x) {
if (x > 0) {
int y = 1;
while (y < x)
y <<= 1;
return y;
}
return 0;
}
template <class AtlasGenerator>
DynamicAtlas<AtlasGenerator>::DynamicAtlas(AtlasGenerator &&generator) : generator((AtlasGenerator &&) generator), glyphCount(0), side(0), totalArea(0), padding(0) { }
DynamicAtlas<AtlasGenerator>::DynamicAtlas() : side(0), padding(0), glyphCount(0), totalArea(0) { }
template <class AtlasGenerator>
template <typename... ARGS>
DynamicAtlas<AtlasGenerator>::DynamicAtlas(int minSide, ARGS... args) : side(ceilPOT(minSide)), padding(0), glyphCount(0), totalArea(0), packer(side+padding, side+padding), generator(side, side, args...) { }
template <class AtlasGenerator>
DynamicAtlas<AtlasGenerator>::DynamicAtlas(AtlasGenerator &&generator) : side(0), padding(0), glyphCount(0), totalArea(0), generator((AtlasGenerator &&) generator) { }
template <class AtlasGenerator>
typename DynamicAtlas<AtlasGenerator>::ChangeFlags DynamicAtlas<AtlasGenerator>::add(GlyphGeometry *glyphs, int count, bool allowRearrange) {
@ -31,7 +45,7 @@ typename DynamicAtlas<AtlasGenerator>::ChangeFlags DynamicAtlas<AtlasGenerator>:
int packerStart = start;
int remaining;
while ((remaining = packer.pack(rectangles.data()+packerStart, rectangles.size()-packerStart)) > 0) {
side = (side+!side)<<1;
side = (side|!side)<<1;
while (side*side < totalArea)
side <<= 1;
if (allowRearrange) {

View File

@ -20,6 +20,8 @@ class ImmediateAtlasGenerator {
public:
ImmediateAtlasGenerator();
ImmediateAtlasGenerator(int width, int height);
template <typename... ARGS>
ImmediateAtlasGenerator(int width, int height, ARGS... storageArgs);
void generate(const GlyphGeometry *glyphs, int count);
void rearrange(int width, int height, const Remap *remapping, int count);
void resize(int width, int height);

View File

@ -11,6 +11,10 @@ ImmediateAtlasGenerator<T, N, GEN_FN, AtlasStorage>::ImmediateAtlasGenerator() :
template <typename T, int N, GeneratorFunction<T, N> GEN_FN, class AtlasStorage>
ImmediateAtlasGenerator<T, N, GEN_FN, AtlasStorage>::ImmediateAtlasGenerator(int width, int height) : storage(width, height), threadCount(1) { }
template <typename T, int N, GeneratorFunction<T, N> GEN_FN, class AtlasStorage>
template <typename... ARGS>
ImmediateAtlasGenerator<T, N, GEN_FN, AtlasStorage>::ImmediateAtlasGenerator(int width, int height, ARGS... storageArgs) : storage(width, height, storageArgs...), threadCount(1) { }
template <typename T, int N, GeneratorFunction<T, N> GEN_FN, class AtlasStorage>
void ImmediateAtlasGenerator<T, N, GEN_FN, AtlasStorage>::generate(const GlyphGeometry *glyphs, int count) {
int maxBoxArea = 0;

@ -1 +1 @@
Subproject commit 7ff249bcd4da6678c5779d9664633c039fb50c0a
Subproject commit 5eef2e59854717528574619d48bec03cc88ab1c9