Skip to content

Commit

Permalink
Changed TextureAtlas parsing to store unrecognized values as name/val…
Browse files Browse the repository at this point in the history
…ue pairs. Moved split and pad to name/value pairs. Changed TexturePacker to omit entries that are default values and write a pma entry for each page.
  • Loading branch information
NathanSweet committed Dec 16, 2020
1 parent c175c6a commit c13809c
Show file tree
Hide file tree
Showing 6 changed files with 278 additions and 220 deletions.
Expand Up @@ -44,6 +44,7 @@
import com.badlogic.gdx.utils.FloatArray;
import com.badlogic.gdx.utils.GdxRuntimeException;
import com.badlogic.gdx.utils.Json;
import com.badlogic.gdx.utils.Null;

import java.awt.Color;
import java.awt.Graphics2D;
Expand Down Expand Up @@ -405,10 +406,17 @@ private void writePackFile (File outputDir, String scaledPackFileName, Array<Pag
Writer writer = new OutputStreamWriter(new FileOutputStream(packFile, true), "UTF-8");
for (Page page : pages) {
writer.write("\n" + page.imageName + "\n");
writer.write("size: " + page.imageWidth + "," + page.imageHeight + "\n");
writer.write("format: " + settings.format + "\n");
writer.write("filter: " + settings.filterMin + "," + settings.filterMag + "\n");
writer.write("repeat: " + getRepeatValue() + "\n");
writer.write("\tsize: " + page.imageWidth + "," + page.imageHeight + "\n");

if (settings.format != Format.RGBA8888) writer.write("\tformat: " + settings.format + "\n");

if (settings.filterMin != TextureFilter.Nearest || settings.filterMag != TextureFilter.Nearest)
writer.write("\tfilter: " + settings.filterMin + "," + settings.filterMag + "\n");

String repeatValue = getRepeatValue();
if (repeatValue != null) writer.write("\trepeat: " + repeatValue + "\n");

if (settings.premultiplyAlpha) writer.write("\tpma: true\n");

page.outputRects.sort();
for (Rect rect : page.outputRects) {
Expand All @@ -428,29 +436,34 @@ private void writePackFile (File outputDir, String scaledPackFileName, Array<Pag

private void writeRect (Writer writer, Page page, Rect rect, String name) throws IOException {
writer.write(Rect.getAtlasName(name, settings.flattenPaths) + "\n");
writer.write(" rotate: " + rect.rotated + "\n");
if (rect.rotated) writer.write("\trotate: " + rect.rotated + "\n");
writer
.write(" xy: " + (page.x + rect.x) + ", " + (page.y + page.height - rect.y - (rect.height - settings.paddingY)) + "\n");
.write("\txy: " + (page.x + rect.x) + ", " + (page.y + page.height - rect.y - (rect.height - settings.paddingY)) + "\n");
writer.write("\tsize: " + rect.regionWidth + ", " + rect.regionHeight + "\n");

writer.write(" size: " + rect.regionWidth + ", " + rect.regionHeight + "\n");
if (rect.splits != null) {
writer.write(" split: " //
writer.write("\tsplit: " //
+ rect.splits[0] + ", " + rect.splits[1] + ", " + rect.splits[2] + ", " + rect.splits[3] + "\n");
}

if (rect.pads != null) {
if (rect.splits == null) writer.write(" split: 0, 0, 0, 0\n");
writer.write(" pad: " + rect.pads[0] + ", " + rect.pads[1] + ", " + rect.pads[2] + ", " + rect.pads[3] + "\n");
if (rect.splits == null) writer.write("\tsplit: 0, 0, 0, 0\n");
writer.write("\tpad: " + rect.pads[0] + ", " + rect.pads[1] + ", " + rect.pads[2] + ", " + rect.pads[3] + "\n");
}
writer.write(" orig: " + rect.originalWidth + ", " + rect.originalHeight + "\n");
writer.write(" offset: " + rect.offsetX + ", " + (rect.originalHeight - rect.regionHeight - rect.offsetY) + "\n");
writer.write(" index: " + rect.index + "\n");

writer.write("\torig: " + rect.originalWidth + ", " + rect.originalHeight + "\n");

int offsetY = rect.originalHeight - rect.regionHeight - rect.offsetY;
if (rect.offsetX != 0 || offsetY != 0) writer.write("\toffset: " + rect.offsetX + ", " + offsetY + "\n");

if (rect.index != -1) writer.write("\tindex: " + rect.index + "\n");
}

private String getRepeatValue () {
private @Null String getRepeatValue () {
if (settings.wrapX == TextureWrap.Repeat && settings.wrapY == TextureWrap.Repeat) return "xy";
if (settings.wrapX == TextureWrap.Repeat && settings.wrapY == TextureWrap.ClampToEdge) return "x";
if (settings.wrapX == TextureWrap.ClampToEdge && settings.wrapY == TextureWrap.Repeat) return "y";
return "none";
return null;
}

private int getBufferedImageType (Format format) {
Expand Down
Expand Up @@ -100,7 +100,7 @@ public void splitAtlas (TextureAtlasData atlas, String outputDir) {
String extension = null;

// check if the region is a ninepatch or a normal image and delegate accordingly
if (region.splits == null) {
if (region.findValue("split") == null) {
splitImage = extractImage(img, region, outputDirFile, 0);
if (region.width != region.originalWidth || region.height != region.originalHeight) {
BufferedImage originalImg = new BufferedImage(region.originalWidth, region.originalHeight, img.getType());
Expand Down Expand Up @@ -181,17 +181,19 @@ private BufferedImage extractNinePatch (BufferedImage page, Region region, File
g2.setColor(Color.BLACK);

// Draw the four lines to save the ninepatch's padding and splits
int startX = region.splits[0] + NINEPATCH_PADDING;
int endX = region.width - region.splits[1] + NINEPATCH_PADDING - 1;
int startY = region.splits[2] + NINEPATCH_PADDING;
int endY = region.height - region.splits[3] + NINEPATCH_PADDING - 1;
int[] splits = region.findValue("split");
int startX = splits[0] + NINEPATCH_PADDING;
int endX = region.width - splits[1] + NINEPATCH_PADDING - 1;
int startY = splits[2] + NINEPATCH_PADDING;
int endY = region.height - splits[3] + NINEPATCH_PADDING - 1;
if (endX >= startX) g2.drawLine(startX, 0, endX, 0);
if (endY >= startY) g2.drawLine(0, startY, 0, endY);
if (region.pads != null) {
int padStartX = region.pads[0] + NINEPATCH_PADDING;
int padEndX = region.width - region.pads[1] + NINEPATCH_PADDING - 1;
int padStartY = region.pads[2] + NINEPATCH_PADDING;
int padEndY = region.height - region.pads[3] + NINEPATCH_PADDING - 1;
int[] pads = region.findValue("pad");
if (pads != null) {
int padStartX = pads[0] + NINEPATCH_PADDING;
int padEndX = region.width - pads[1] + NINEPATCH_PADDING - 1;
int padStartY = pads[2] + NINEPATCH_PADDING;
int padEndY = region.height - pads[3] + NINEPATCH_PADDING - 1;
g2.drawLine(padStartX, splitImage.getHeight() - 1, padEndX, splitImage.getHeight() - 1);
g2.drawLine(splitImage.getWidth() - 1, padStartY, splitImage.getWidth() - 1, padEndY);
}
Expand Down
4 changes: 2 additions & 2 deletions gdx/src/com/badlogic/gdx/graphics/g2d/PixmapPacker.java
Expand Up @@ -365,8 +365,8 @@ public synchronized void updateTextureAtlas (TextureAtlas atlas, TextureFilter m
TextureAtlas.AtlasRegion region = new TextureAtlas.AtlasRegion(page.texture, (int)rect.x, (int)rect.y, (int)rect.width, (int)rect.height);

if (rect.splits != null) {
region.splits = rect.splits;
region.pads = rect.pads;
region.names = new String[] {"split", "pad"};
region.values = new int[][] {rect.splits, rect.pads};
}

int imageIndex = -1;
Expand Down

0 comments on commit c13809c

Please sign in to comment.