Add initial code
This commit is contained in:
		
				commit
				
					
						5e60c2deb1
					
				
			
		
					 7 changed files with 250 additions and 0 deletions
				
			
		
							
								
								
									
										41
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,41 @@ | ||||||
|  | target/ | ||||||
|  | !.mvn/wrapper/maven-wrapper.jar | ||||||
|  | !**/src/main/**/target/ | ||||||
|  | !**/src/test/**/target/ | ||||||
|  | 
 | ||||||
|  | ### IntelliJ IDEA ### | ||||||
|  | .idea/modules.xml | ||||||
|  | .idea/jarRepositories.xml | ||||||
|  | .idea/compiler.xml | ||||||
|  | .idea/libraries/ | ||||||
|  | *.iws | ||||||
|  | *.iml | ||||||
|  | *.ipr | ||||||
|  | 
 | ||||||
|  | ### Eclipse ### | ||||||
|  | .apt_generated | ||||||
|  | .classpath | ||||||
|  | .factorypath | ||||||
|  | .project | ||||||
|  | .settings | ||||||
|  | .springBeans | ||||||
|  | .sts4-cache | ||||||
|  | 
 | ||||||
|  | ### NetBeans ### | ||||||
|  | /nbproject/private/ | ||||||
|  | /nbbuild/ | ||||||
|  | /dist/ | ||||||
|  | /nbdist/ | ||||||
|  | /.nb-gradle/ | ||||||
|  | build/ | ||||||
|  | !**/src/main/**/build/ | ||||||
|  | !**/src/test/**/build/ | ||||||
|  | 
 | ||||||
|  | ### VS Code ### | ||||||
|  | .vscode/ | ||||||
|  | 
 | ||||||
|  | ### Mac OS ### | ||||||
|  | .DS_Store | ||||||
|  | 
 | ||||||
|  | /tmp/ | ||||||
|  | *.png | ||||||
							
								
								
									
										10
									
								
								.idea/.gitignore
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								.idea/.gitignore
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | # Default ignored files | ||||||
|  | /shelf/ | ||||||
|  | /workspace.xml | ||||||
|  | # Editor-based HTTP Client requests | ||||||
|  | /httpRequests/ | ||||||
|  | # Datasource local storage ignored files | ||||||
|  | /dataSources/ | ||||||
|  | /dataSources.local.xml | ||||||
|  | 
 | ||||||
|  | /discord.xml | ||||||
							
								
								
									
										7
									
								
								.idea/encodings.xml
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								.idea/encodings.xml
									
										
									
										generated
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,7 @@ | ||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <project version="4"> | ||||||
|  |   <component name="Encoding"> | ||||||
|  |     <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" /> | ||||||
|  |     <file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" /> | ||||||
|  |   </component> | ||||||
|  | </project> | ||||||
							
								
								
									
										14
									
								
								.idea/misc.xml
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								.idea/misc.xml
									
										
									
										generated
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,14 @@ | ||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <project version="4"> | ||||||
|  |   <component name="ExternalStorageConfigurationManager" enabled="true" /> | ||||||
|  |   <component name="MavenProjectsManager"> | ||||||
|  |     <option name="originalFiles"> | ||||||
|  |       <list> | ||||||
|  |         <option value="$PROJECT_DIR$/pom.xml" /> | ||||||
|  |       </list> | ||||||
|  |     </option> | ||||||
|  |   </component> | ||||||
|  |   <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="homebrew-23" project-jdk-type="JavaSDK"> | ||||||
|  |     <output url="file://$PROJECT_DIR$/out" /> | ||||||
|  |   </component> | ||||||
|  | </project> | ||||||
							
								
								
									
										6
									
								
								.idea/vcs.xml
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.idea/vcs.xml
									
										
									
										generated
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,6 @@ | ||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <project version="4"> | ||||||
|  |   <component name="VcsDirectoryMappings"> | ||||||
|  |     <mapping directory="$PROJECT_DIR$" vcs="Git" /> | ||||||
|  |   </component> | ||||||
|  | </project> | ||||||
							
								
								
									
										42
									
								
								pom.xml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								pom.xml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,42 @@ | ||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <project xmlns="http://maven.apache.org/POM/4.0.0" | ||||||
|  |          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||||
|  |          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||||
|  |     <modelVersion>4.0.0</modelVersion> | ||||||
|  | 
 | ||||||
|  |     <groupId>moe.wah</groupId> | ||||||
|  |     <artifactId>PGN-ator</artifactId> | ||||||
|  |     <version>1.0-SNAPSHOT</version> | ||||||
|  | 
 | ||||||
|  |     <properties> | ||||||
|  |         <maven.compiler.source>21</maven.compiler.source> | ||||||
|  |         <maven.compiler.target>21</maven.compiler.target> | ||||||
|  |         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||||||
|  |     </properties> | ||||||
|  | 
 | ||||||
|  |     <repositories> | ||||||
|  |         <repository> | ||||||
|  |             <id>jitpack.io</id> | ||||||
|  |             <url>https://jitpack.io</url> | ||||||
|  |         </repository> | ||||||
|  |     </repositories> | ||||||
|  | 
 | ||||||
|  |     <dependencies> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>com.github.bhlangonijr</groupId> | ||||||
|  |             <artifactId>chesslib</artifactId> | ||||||
|  |             <version>1.3.4</version> | ||||||
|  |         </dependency> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>com.github.alexandreroman</groupId> | ||||||
|  |             <artifactId>chessimage</artifactId> | ||||||
|  |             <version>1.0.0</version> | ||||||
|  |         </dependency> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>com.sksamuel.scrimage</groupId> | ||||||
|  |             <artifactId>scrimage-core</artifactId> | ||||||
|  |             <version>4.3.1</version> | ||||||
|  |         </dependency> | ||||||
|  |     </dependencies> | ||||||
|  | 
 | ||||||
|  | </project> | ||||||
							
								
								
									
										130
									
								
								src/main/java/moe/wah/Main.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								src/main/java/moe/wah/Main.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,130 @@ | ||||||
|  | package moe.wah; | ||||||
|  | 
 | ||||||
|  | import com.github.alexandreroman.chessimage.ChessRenderer; | ||||||
|  | import com.github.alexandreroman.chessimage.ChessThemeLibrary; | ||||||
|  | import com.github.bhlangonijr.chesslib.Board; | ||||||
|  | import com.github.bhlangonijr.chesslib.game.Game; | ||||||
|  | import com.github.bhlangonijr.chesslib.move.Move; | ||||||
|  | import com.github.bhlangonijr.chesslib.move.MoveList; | ||||||
|  | import com.github.bhlangonijr.chesslib.pgn.PgnHolder; | ||||||
|  | import com.sksamuel.scrimage.ImmutableImage; | ||||||
|  | import com.sksamuel.scrimage.nio.StreamingGifWriter; | ||||||
|  | import com.sksamuel.scrimage.nio.StreamingGifWriter.GifStream; | ||||||
|  | 
 | ||||||
|  | import javax.imageio.ImageIO; | ||||||
|  | import java.awt.image.BufferedImage; | ||||||
|  | import java.io.File; | ||||||
|  | import java.io.FileOutputStream; | ||||||
|  | import java.io.IOException; | ||||||
|  | import java.nio.file.Files; | ||||||
|  | import java.nio.file.Paths; | ||||||
|  | import java.time.Duration; | ||||||
|  | import java.time.Instant; | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.Arrays; | ||||||
|  | import java.util.List; | ||||||
|  | 
 | ||||||
|  | public class Main { | ||||||
|  |     public static void main(String[] args) throws Exception { | ||||||
|  |         Files.createDirectories(Paths.get("./temp/")); | ||||||
|  |         // Load PGN from file | ||||||
|  |         PgnHolder pgn = new PgnHolder("game.pgn"); | ||||||
|  |         pgnToGif(pgn); | ||||||
|  |     } | ||||||
|  |     private static void pgnToGif(PgnHolder pgn) throws Exception { | ||||||
|  |         ChessRenderer renderer = new ChessRenderer(ChessThemeLibrary.GREEN_THEME, 60); | ||||||
|  |         Game game = pgnToGame(pgn); | ||||||
|  |         String boardID = String.valueOf(Instant.now().toEpochMilli()); | ||||||
|  |         game.loadMoveText(); | ||||||
|  |         System.out.println(game.getTermination()); | ||||||
|  | 
 | ||||||
|  |         MoveList moves = game.getHalfMoves(); | ||||||
|  |         Board board = new Board(); | ||||||
|  |         int index = 1; | ||||||
|  |         for (Move move : moves) { | ||||||
|  |             board.doMove(move); | ||||||
|  |             renderBoard(board, renderer, boardID, index); | ||||||
|  | 
 | ||||||
|  |             // Add 5 extra frames of final board | ||||||
|  |             if (index == moves.size()) { | ||||||
|  |                 for (int x = 0; x < 5; x++) { | ||||||
|  |                     index++; | ||||||
|  |                     renderBoard(board, renderer, boardID, index); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             index++; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         System.out.println("Rendered " + moves.size() + " moves"); | ||||||
|  | 
 | ||||||
|  |         boardToGif(boardID); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private static void renderBoard(Board board, ChessRenderer renderer, String boardID, int index) { | ||||||
|  |         String index_padded = String.format("%03d", index); | ||||||
|  |         File targetFile = new File("./temp/", "board_" + boardID + "_" + index_padded + ".png"); | ||||||
|  |         try (FileOutputStream out = new FileOutputStream(targetFile)) { | ||||||
|  |             renderer.render(board.getFen(), out); | ||||||
|  |         } catch (IOException e) { | ||||||
|  |             System.out.println("Error rendering move " + index_padded + ", " + e.getMessage()); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private static Game pgnToGame(PgnHolder pgn) throws Exception { | ||||||
|  |         pgn.loadPgn(); | ||||||
|  |         return pgn.getGames().getFirst(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Converts a chess board to a GIF | ||||||
|  |      * Output file is board_x.gif where x is the boardID | ||||||
|  |      * @param boardID   ID of the board (UNIX epoch) | ||||||
|  |      */ | ||||||
|  |     public static void boardToGif(String boardID) throws Exception { | ||||||
|  |         List<File> boardFiles = getBoardFiles(new File("./temp/"), boardID); | ||||||
|  |         if (boardFiles.isEmpty()) { | ||||||
|  |             throw new RuntimeException("No PNG files found for board with ID: " + boardID); | ||||||
|  |         } | ||||||
|  |         List<BufferedImage> images = new ArrayList<>(); | ||||||
|  |         for (File file : boardFiles) { | ||||||
|  |             BufferedImage image = ImageIO.read(file); | ||||||
|  |             images.add(image); | ||||||
|  |         } | ||||||
|  |         System.out.println("There are " + (long) images.size() + " frames for board " + boardID); | ||||||
|  |         String gif_name = "board_" + boardID + ".gif"; | ||||||
|  |         StreamingGifWriter writer = new StreamingGifWriter(Duration.ofMillis(500), true, false); | ||||||
|  |         GifStream gif = writer.prepareStream(gif_name, BufferedImage.TYPE_INT_ARGB); | ||||||
|  |         for (BufferedImage image : images) { | ||||||
|  |             gif.writeFrame(ImmutableImage.fromAwt(image)); | ||||||
|  |         } | ||||||
|  |         gif.close(); | ||||||
|  |         System.out.println("Rendered " + gif_name); | ||||||
|  |         for (File file : boardFiles) { | ||||||
|  |             boolean delete_success = file.delete(); | ||||||
|  |             if (!delete_success) { | ||||||
|  |                 System.out.println("Failed to delete " + file.getName() + "!"); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         System.out.println("Removed " + boardFiles.size() + " temp files"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Gets the PNG files for the specified board | ||||||
|  |      * @param directory Directory to search | ||||||
|  |      * @param boardID   Board ID (UNIX epoch) | ||||||
|  |      * @return A list of board Files | ||||||
|  |      */ | ||||||
|  |     private static List<File> getBoardFiles(File directory, String boardID) { | ||||||
|  |         List<File> boardFiles = new ArrayList<>(); | ||||||
|  |         File[] files = directory.listFiles(); | ||||||
|  |         assert files != null; | ||||||
|  |         Arrays.sort(files); | ||||||
|  |         for (File file : files) { | ||||||
|  |             if (file.isFile() && file.getName().toLowerCase().endsWith(".png") | ||||||
|  |                     && file.getName().startsWith("board_" + boardID)) { | ||||||
|  |                 boardFiles.add(file); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return boardFiles; | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue