Class PixmapPacker

java.lang.Object
arc.graphics.g2d.PixmapPacker
All Implemented Interfaces:
Disposable

public class PixmapPacker extends Object implements Disposable
Packs pixmaps into one or more pages to generate an atlas of pixmap instances. Provides means to directly convert the pixmap atlas to a TextureAtlas. The packer supports padding and border pixel duplication, specified during construction. The packer supports incremental inserts and updates of TextureAtlases generated with this class. How bin packing is performed can be customized via PixmapPacker.PackStrategy.

All methods can be called from any thread unless otherwise noted.

One-off usage:

 // 512x512 pixel pages, RGB565 format, 2 pixels of padding, border duplication
 PixmapPacker packer = new PixmapPacker(512, 512, Format.RGB565, 2, true);
 packer.pack("First Pixmap", pixmap1);
 packer.pack("Second Pixmap", pixmap2);
 TextureAtlas atlas = packer.generateTextureAtlas(TextureFilter.nearest, TextureFilter.nearest, false);
 packer.dispose();
 // ...
 atlas.dispose();
 

With this usage pattern, disposing the packer will not dispose any pixmaps used by the texture atlas. The texture atlas must also be disposed when no longer needed.

Incremental texture atlas usage:

 // 512x512 pixel pages, RGB565 format, 2 pixels of padding, no border duplication
 PixmapPacker packer = new PixmapPacker(512, 512, Format.RGB565, 2, false);
 TextureAtlas atlas = new TextureAtlas();

 // potentially on a separate thread, e.g. downloading thumbnails
 packer.pack("thumbnail", thumbnail);

 // on the rendering thread, every frame
 packer.updateTextureAtlas(atlas, TextureFilter.Linear, TextureFilter.Linear, false);

 // once the atlas is no longer needed, make sure you get the final additions. This might
 // be more elaborate depending on your threading model.
 packer.updateTextureAtlas(atlas, TextureFilter.Linear, TextureFilter.Linear, false);
 // ...
 atlas.dispose();
 

Pixmap-only usage:

 PixmapPacker packer = new PixmapPacker(512, 512, Format.RGB565, 2, true);
 packer.pack("First Pixmap", pixmap1);
 packer.pack("Second Pixmap", pixmap2);

 // do something interesting with the resulting pages
 for (Page page : packer.getPages()) {
        // ...
 }

 packer.dispose();
 
  • Constructor Details

  • Method Details

    • sort

      public void sort(Seq<PixmapRegion> images)
      Sorts the images to the optimal order they should be packed. Some packing strategies rely heavily on the images being sorted.
    • pack

      public Rect pack(Pixmap image)
      Inserts the pixmap without a name. It cannot be looked up by name.
      See Also:
    • pack

      public Rect pack(String name, Pixmap image)
      Inserts the pixmap. If name was not null, you can later retrieve the image's position in the output image via getRect(String). Duplicate names will replace older rects.
      Parameters:
      name - If null, the image cannot be looked up by name.
      Returns:
      Rectangle describing the area the pixmap was rendered to.
      Throws:
      ArcRuntimeException - in case the image did not fit due to the page size being too small or providing a duplicate name.
    • pack

      public Rect pack(String name, PixmapRegion image)
      Inserts the pixmap. If name was not null, you can later retrieve the image's position in the output image via getRect(String). Duplicate names will replace older rects.
      Parameters:
      name - If null, the image cannot be looked up by name.
      Returns:
      Rectangle describing the area the pixmap was rendered to.
      Throws:
      ArcRuntimeException - in case the image did not fit due to the page size being too small.
    • pack

      public Rect pack(@Nullable String name, PixmapRegion image, int[] splits, int[] pads)
    • getPages

      public Seq<PixmapPacker.Page> getPages()
      Returns:
      the PixmapPacker.Page instances created so far. If multiple threads are accessing the packer, iterating over the pages must be done only after synchronizing on the packer.
    • getRect

      public Rect getRect(String name)
      Parameters:
      name - the name of the image
      Returns:
      the rectangle for the image in the page it's stored in or null
    • getRegion

      public PixmapRegion getRegion(String name)
      Returns:
      the newly allocated region for this name, or null.
    • getPage

      public PixmapPacker.Page getPage(String name)
      Parameters:
      name - the name of the image
      Returns:
      the page the image is stored in or null
    • getPageIndex

      public int getPageIndex(String name)
      Returns the index of the page containing the given packed rectangle.
      Parameters:
      name - the name of the image
      Returns:
      the index of the page the image is stored in or -1
    • dispose

      public void dispose()
      Disposes any pixmap pages which don't have a texture. Page pixmaps that have a texture will not be disposed until their texture is disposed.
      Specified by:
      dispose in interface Disposable
    • generateTextureAtlas

      public TextureAtlas generateTextureAtlas(Texture.TextureFilter minFilter, Texture.TextureFilter magFilter, boolean useMipMaps)
      Generates a new TextureAtlas from the pixmaps inserted so far. After calling this method, disposing the packer will no longer dispose the page pixmaps.
    • updateTextureAtlas

      public void updateTextureAtlas(TextureAtlas atlas, Texture.TextureFilter minFilter, Texture.TextureFilter magFilter, boolean useMipMaps)
    • updateTextureAtlas

      public void updateTextureAtlas(TextureAtlas atlas, Texture.TextureFilter minFilter, Texture.TextureFilter magFilter, boolean useMipMaps, boolean clearRects)
      Updates the TextureAtlas, adding any new Pixmap instances packed since the last call to this method. This can be used to insert Pixmap instances on a separate thread via pack(String, Pixmap) and update the TextureAtlas on the rendering thread. This method must be called on the rendering thread. After calling this method, disposing the packer will no longer dispose the page pixmaps.
    • updateTextureRegions

      public void updateTextureRegions(Seq<TextureRegion> regions, Texture.TextureFilter minFilter, Texture.TextureFilter magFilter, boolean useMipMaps)
      Calls updateTexture for each page and adds a region to the specified array for each page texture.
    • updatePageTextures

      public void updatePageTextures(Texture.TextureFilter minFilter, Texture.TextureFilter magFilter, boolean useMipMaps)
      Calls updateTexture for each page.
    • getPageWidth

      public int getPageWidth()
    • setPageWidth

      public void setPageWidth(int pageWidth)
    • getPageHeight

      public int getPageHeight()
    • setPageHeight

      public void setPageHeight(int pageHeight)
    • getPadding

      public int getPadding()
    • setPadding

      public void setPadding(int padding)
    • getDuplicateBorder

      public boolean getDuplicateBorder()
    • setDuplicateBorder

      public void setDuplicateBorder(boolean duplicateBorder)
    • getPackToTexture

      public boolean getPackToTexture()
    • setPackToTexture

      public void setPackToTexture(boolean packToTexture)
      If true, when a pixmap is packed to a page that has a texture, the portion of the texture where the pixmap was packed is updated using glTexSubImage2D. Note if packing many pixmaps, this may be slower than reuploading the whole texture. This setting is ignored if getDuplicateBorder() is true.
    • getTransparentColor

      public Color getTransparentColor()
      See Also:
    • setTransparentColor

      public void setTransparentColor(Color color)
      Sets the default color of the whole PixmapPacker.Page when a new one created. Helps to avoid texture bleeding or to highlight the page for debugging.
      See Also: