mirror of
https://github.com/openeggbert/sprite-utils.git
synced 2025-03-25 15:37:50 +01:00
Refactoring
This commit is contained in:
parent
f0921bd31b
commit
ac1db49e01
4
CREDITS
4
CREDITS
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
N: Robert Vokac
|
N: Robert Vokac
|
||||||
E: mail@robertvokac.com
|
E: mail@robertvokac.com
|
||||||
W: https://nanoboot.org
|
W: https://robertvokac.com
|
||||||
P: 4096R/E3329055 322B D109 0AA8 C324 EA9C 72F5 693D 30BE E332 9055
|
P: 4096R/C459E1E4 B209 C3F1 25C7 2618 FB18 AC8E C459 E1E4 B4A9 86BB
|
||||||
D: Founder
|
D: Founder
|
||||||
S: Czech Republic
|
S: Czech Republic
|
||||||
|
@ -1,7 +1,22 @@
|
|||||||
/*
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
|
// sprite-utils: Tool used to work with sprites
|
||||||
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
|
// Copyright (C) 2024 the original author or authors.
|
||||||
*/
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU General Public License
|
||||||
|
// as published by the Free Software Foundation, either version 3
|
||||||
|
// of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program. If not, see
|
||||||
|
// <https://www.gnu.org/licenses/> or write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
package org.nanoboot.spriteutils.core;
|
package org.nanoboot.spriteutils.core;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@ -9,6 +24,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
|
|
||||||
@ -29,83 +45,93 @@ public class SpriteSheet {
|
|||||||
public SpriteSheet(File file) {
|
public SpriteSheet(File file) {
|
||||||
List<SpriteSheetRow> rows = new ArrayList<>();
|
List<SpriteSheetRow> rows = new ArrayList<>();
|
||||||
String text = Utils.readTextFromFile(file);
|
String text = Utils.readTextFromFile(file);
|
||||||
text.lines().skip(1).takeWhile(l->!l.contains("skipskip"))
|
text.lines().skip(1).takeWhile(l -> !l.contains("skipskip"))
|
||||||
.forEach(l -> {
|
.forEach(l -> {
|
||||||
final SpriteSheetRow spriteSheetRow = new SpriteSheetRow(l);
|
processLine(l, rows);
|
||||||
|
});
|
||||||
|
saveComputedFile(file, text, rows);
|
||||||
|
|
||||||
if (lastSpriteSheetRow != null) {
|
}
|
||||||
if (!spriteSheetRow.file.equals(lastSpriteSheetRow.file)) {
|
|
||||||
lastSpriteSheetRow = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (lastSpriteSheetRow == null) {
|
|
||||||
spriteSheetRow.numberPerSheet = 1;
|
|
||||||
if (spriteSheetRow.getRow() != 1) {
|
|
||||||
String msg = "Row of the first sprite in file must be equal to 1, but value for file " + spriteSheetRow.file + " is " + spriteSheetRow.getRow();
|
|
||||||
throw new SpriteUtilsException(msg);
|
|
||||||
}
|
|
||||||
if (spriteSheetRow.getColumn() != 1) {
|
|
||||||
String msg = "Column of the first sprite in file must be equal to 1, but value for file " + spriteSheetRow.file + " is " + spriteSheetRow.getColumn();
|
|
||||||
throw new SpriteUtilsException(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
private void saveComputedFile(File file, String text, List<SpriteSheetRow> rows) {
|
||||||
spriteSheetRow.numberPerSheet = lastSpriteSheetRow.numberPerSheet + 1;
|
|
||||||
|
|
||||||
if(spriteSheetRow.row > lastSpriteSheetRow.row) {
|
|
||||||
if(spriteSheetRow.row != (lastSpriteSheetRow.row + 1)) {
|
|
||||||
throw new SpriteUtilsException("Unexpected row for " + spriteSheetRow.createId());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(spriteSheetRow.row < lastSpriteSheetRow.row) {
|
|
||||||
throw new SpriteUtilsException("Unexpected row for " + spriteSheetRow.createId());
|
|
||||||
}
|
|
||||||
|
|
||||||
if(spriteSheetRow.row == lastSpriteSheetRow.row) {
|
|
||||||
if(spriteSheetRow.column != (lastSpriteSheetRow.column + 1))
|
|
||||||
throw new SpriteUtilsException("Unexpected column for " + spriteSheetRow.createId());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
rows.add(spriteSheetRow);
|
|
||||||
if (!map.containsKey(spriteSheetRow.file)) {
|
|
||||||
map.put(spriteSheetRow.file, new ArrayList<>());
|
|
||||||
}
|
|
||||||
map.get(spriteSheetRow.file).add(spriteSheetRow);
|
|
||||||
if (spriteSheetRow.x == -1) {
|
|
||||||
if (spriteSheetRow.column == 1) {
|
|
||||||
spriteSheetRow.x = 0;
|
|
||||||
} else {
|
|
||||||
if (lastX == -1) {
|
|
||||||
throw new SpriteUtilsException("Could not compute X for " + spriteSheetRow.createId());
|
|
||||||
} else {
|
|
||||||
spriteSheetRow.x = lastX + lastWidth;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
lastX = spriteSheetRow.getX();
|
|
||||||
lastWidth = spriteSheetRow.getWidth();
|
|
||||||
if (spriteSheetRow.height <= 0) {
|
|
||||||
if (lastHeight == -1) {
|
|
||||||
throw new SpriteUtilsException("Could not compute height for " + spriteSheetRow.createId());
|
|
||||||
} else {
|
|
||||||
spriteSheetRow.height = lastHeight + ((-1) * spriteSheetRow.height);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
lastHeight = spriteSheetRow.height;
|
|
||||||
lastSpriteSheetRow = spriteSheetRow;
|
|
||||||
System.out.println(spriteSheetRow.toCsvLine());
|
|
||||||
});
|
|
||||||
File computed = new File(file.getAbsolutePath() + ".computed.csv");
|
File computed = new File(file.getAbsolutePath() + ".computed.csv");
|
||||||
if(computed.exists()){
|
if (computed.exists()) {
|
||||||
computed.delete();
|
computed.delete();
|
||||||
}
|
}
|
||||||
StringBuilder sb = new StringBuilder(text.lines().limit(1).findFirst().orElse(""));
|
StringBuilder sb = new StringBuilder(text.lines().limit(1).findFirst().orElse(""));
|
||||||
sb.append("\n");
|
sb.append("\n");
|
||||||
rows.stream().forEach(r-> {
|
rows.stream().forEach(r -> {
|
||||||
sb.append(r.toCsvLine()).append("\n");
|
sb.append(r.toCsvLine()).append("\n");
|
||||||
});
|
});
|
||||||
Utils.writeTextToFile(sb.toString(), computed);
|
Utils.writeTextToFile(sb.toString(), computed);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processLine(String line, List<SpriteSheetRow> rows) throws SpriteUtilsException {
|
||||||
|
final SpriteSheetRow spriteSheetRow = new SpriteSheetRow(line);
|
||||||
|
|
||||||
|
validateRow(spriteSheetRow);
|
||||||
|
|
||||||
|
updateSpriteSheetRow(spriteSheetRow);
|
||||||
|
|
||||||
|
rows.add(spriteSheetRow);
|
||||||
|
updateMap(spriteSheetRow);
|
||||||
|
System.out.println(spriteSheetRow.toCsvLine());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateSpriteSheetRow(final SpriteSheetRow spriteSheetRow) {
|
||||||
|
if (spriteSheetRow.x == -1) {
|
||||||
|
spriteSheetRow.x = (spriteSheetRow.column == 1) ? 0
|
||||||
|
: Optional.of(lastX == -1 ? null : (lastX + lastWidth)).orElseThrow(() -> new SpriteUtilsException("Could not compute X for " + spriteSheetRow.createId()));
|
||||||
|
}
|
||||||
|
lastX = spriteSheetRow.getX();
|
||||||
|
lastWidth = spriteSheetRow.getWidth();
|
||||||
|
|
||||||
|
if (spriteSheetRow.height <= 0) {
|
||||||
|
spriteSheetRow.height = Optional.of((lastHeight != -1) ? (lastHeight + (-spriteSheetRow.height)) : null).orElseThrow(() -> new SpriteUtilsException("Could not compute height for " + spriteSheetRow.createId()));
|
||||||
|
}
|
||||||
|
lastHeight = spriteSheetRow.height;
|
||||||
|
lastSpriteSheetRow = spriteSheetRow;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateMap(final SpriteSheetRow spriteSheetRow) {
|
||||||
|
if (!map.containsKey(spriteSheetRow.file)) {
|
||||||
|
map.put(spriteSheetRow.file, new ArrayList<>());
|
||||||
|
}
|
||||||
|
map.get(spriteSheetRow.file).add(spriteSheetRow);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validateRow(final SpriteSheetRow spriteSheetRow) {
|
||||||
|
if (lastSpriteSheetRow != null) {
|
||||||
|
if (!spriteSheetRow.file.equals(lastSpriteSheetRow.file)) {
|
||||||
|
lastSpriteSheetRow = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (lastSpriteSheetRow == null) {
|
||||||
|
validateFirstRow(spriteSheetRow);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
validateSubsequentRow(spriteSheetRow);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validateSubsequentRow(SpriteSheetRow spriteSheetRow) {
|
||||||
|
spriteSheetRow.numberPerSheet = lastSpriteSheetRow.numberPerSheet + 1;
|
||||||
|
if (spriteSheetRow.row > lastSpriteSheetRow.row) {
|
||||||
|
if (spriteSheetRow.row != (lastSpriteSheetRow.row + 1)) {
|
||||||
|
throw new SpriteUtilsException("Unexpected row for " + spriteSheetRow.createId());
|
||||||
|
}
|
||||||
|
} else if (spriteSheetRow.row < lastSpriteSheetRow.row) {
|
||||||
|
throw new SpriteUtilsException("Unexpected row for " + spriteSheetRow.createId());
|
||||||
|
} else if (spriteSheetRow.column != (lastSpriteSheetRow.column + 1)) {
|
||||||
|
throw new SpriteUtilsException("Unexpected column for " + spriteSheetRow.createId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validateFirstRow(SpriteSheetRow spriteSheetRow) {
|
||||||
|
if (spriteSheetRow.getRow() != 1 || spriteSheetRow.getColumn() != 1) {
|
||||||
|
throw new SpriteUtilsException("Invalid initial row or column for file " + spriteSheetRow.file);
|
||||||
|
}
|
||||||
|
spriteSheetRow.numberPerSheet = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<SpriteSheetRow> getSpriteSheets(String file) {
|
public List<SpriteSheetRow> getSpriteSheets(String file) {
|
||||||
|
@ -17,13 +17,11 @@
|
|||||||
// <https://www.gnu.org/licenses/> or write to the Free Software
|
// <https://www.gnu.org/licenses/> or write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
package org.nanoboot.spriteutils.core;
|
package org.nanoboot.spriteutils.core;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collector;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import java.util.stream.Stream;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
|
|
||||||
@ -50,19 +48,21 @@ public class SpriteSheetRow {
|
|||||||
|
|
||||||
public SpriteSheetRow(String csvLine) {
|
public SpriteSheetRow(String csvLine) {
|
||||||
String[] csvColumn = csvLine.split(";");
|
String[] csvColumn = csvLine.split(";");
|
||||||
|
if (csvColumn.length < 10) {
|
||||||
|
throw new IllegalArgumentException("CSV line does not contain enough (10) columns.");
|
||||||
|
}
|
||||||
int i = 0;
|
int i = 0;
|
||||||
file = csvColumn[i++];
|
file = csvColumn[i++];
|
||||||
group = csvColumn[i++];
|
group = csvColumn[i++];
|
||||||
numberInGroup = Integer.valueOf(csvColumn[i++]);
|
numberInGroup = Integer.parseInt(csvColumn[i++]);
|
||||||
row = Integer.valueOf(csvColumn[i++]);
|
row = Integer.parseInt(csvColumn[i++]);
|
||||||
column = Integer.valueOf(csvColumn[i++]);
|
column = Integer.parseInt(csvColumn[i++]);
|
||||||
String xString = csvColumn[i++];
|
x = csvColumn[i++].isBlank() ? -1 : Integer.parseInt(csvColumn[i - 1]);
|
||||||
x = xString.isBlank() ? -1 : Integer.valueOf(xString);
|
y = Integer.parseInt(csvColumn[i++]);
|
||||||
y = Integer.valueOf(csvColumn[i++]);
|
width = Integer.parseInt(csvColumn[i++]);
|
||||||
width = Integer.valueOf(csvColumn[i++]);
|
height = Integer.parseInt(csvColumn[i++]);
|
||||||
height = Integer.valueOf(csvColumn[i++]);
|
|
||||||
if (column > 1) {
|
if (column > 1) {
|
||||||
height = height * (-1);
|
height = -height;
|
||||||
}
|
}
|
||||||
notes = csvColumn.length >= 10 ? csvColumn[i++] : "";
|
notes = csvColumn.length >= 10 ? csvColumn[i++] : "";
|
||||||
tags = csvColumn.length > 11 ? csvColumn[i++] : "";
|
tags = csvColumn.length > 11 ? csvColumn[i++] : "";
|
||||||
@ -72,9 +72,10 @@ public class SpriteSheetRow {
|
|||||||
return file + __ + group + __ + numberInGroup;
|
return file + __ + group + __ + numberInGroup;
|
||||||
}
|
}
|
||||||
private static final String __ = "__";
|
private static final String __ = "__";
|
||||||
|
private static final String DELIMITER = ";";
|
||||||
|
|
||||||
public String toCsvLine() {
|
public String toCsvLine() {
|
||||||
List<String> l = Stream.of(
|
List<String> fields = Arrays.asList(
|
||||||
file,
|
file,
|
||||||
group,
|
group,
|
||||||
String.valueOf(numberInGroup),
|
String.valueOf(numberInGroup),
|
||||||
@ -86,9 +87,9 @@ public class SpriteSheetRow {
|
|||||||
String.valueOf(height),
|
String.valueOf(height),
|
||||||
notes,
|
notes,
|
||||||
tags,
|
tags,
|
||||||
String.valueOf(numberPerSheet)).toList();
|
String.valueOf(numberPerSheet)
|
||||||
return l.stream().collect(Collectors.joining(";"));
|
);
|
||||||
|
return String.join(DELIMITER, fields);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user