text: 
  #pragma once
  
  #include "GlyphGeometry.h"
  
  namespace msdf_atlas {
  
  /**
   * This class computes the layout of a static atlas and may optionally
   * also find the minimum required dimensions and/or the maximum glyph scale
   */
  class TightAtlasPacker {
  
  public:
      /// Constraints for the atlas's dimensions - see size selectors for more info
      enum class DimensionsConstraint {
          POWER_OF_TWO_SQUARE,
          POWER_OF_TWO_RECTANGLE,
          MULTIPLE_OF_FOUR_SQUARE,
          EVEN_SQUARE,
          SQUARE
      };
  
      TightAtlasPacker();
  
      /// Computes the layout for the array of glyphs. Returns 0 on success
      int pack(GlyphGeometry *glyphs, int count);
  
      /// Sets the atlas's dimensions to be fixed
      void setDimensions(int width, int height);
      /// Sets the atlas's dimensions to be determined during pack
      void unsetDimensions();
      /// Sets the constraint to be used when determining dimensions
      void setDimensionsConstraint(DimensionsConstraint dimensionsConstraint);
      /// Sets the padding between glyph boxes
      void setPadding(int padding);
      /// Sets fixed glyph scale
      void setScale(double scale);
      /// Sets the minimum glyph scale
      void setMinimumScale(double minScale);
      /// Sets the unit component of the total distance range
      void setUnitRange(double unitRange);
      /// Sets the pixel component of the total distance range
      void setPixelRange(double pxRange);
      /// Sets the miter limit for bounds computation
      void setMiterLimit(double miterLimit);
  
      /// Outputs the atlas's final dimensions
      void getDimensions(int &width, int &height) const;
      /// Returns the final glyph scale
      double getScale() const;
      /// Returns the final combined pixel range (including converted unit range)
      double getPixelRange() const;
  
  private:
      int width, height;
      int padding;
      DimensionsConstraint dimensionsConstraint;
      double scale;
      double minScale;
      double unitRange;
      double pxRange;
      double miterLimit;
      double scaleMaximizationTolerance;
  
      static int tryPack(GlyphGeometry *glyphs, int count, DimensionsConstraint dimensionsConstraint, int &width, int &height, int padding, double scale, double range, double miterLimit);
      static double packAndScale(GlyphGeometry *glyphs, int count, int width, int height, int padding, double unitRange, double pxRange, double miterLimit, double tolerance);
  
  };
  
  }
  