this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

generate 2x thumbnail for hidpi users

+58 -32
+4 -6
src/main/java/app/pane/AssetsPanel.java
··· 11 11 import java.awt.RenderingHints; 12 12 import java.awt.event.MouseAdapter; 13 13 import java.awt.event.MouseEvent; 14 - import java.awt.image.BufferedImage; 15 14 import java.io.File; 16 15 import java.io.IOException; 17 16 import java.nio.file.FileSystems; ··· 256 255 JLabel icon = new JLabel(ThemedIcon.PACKAGE_24); 257 256 258 257 // Load thumbnail asynchronously 259 - new SwingWorker<BufferedImage, Void>() { 258 + new SwingWorker<Image, Void>() { 260 259 @Override 261 - protected BufferedImage doInBackground() 260 + protected Image doInBackground() 262 261 { 263 262 return asset.loadThumbnail(); 264 263 } ··· 267 266 protected void done() 268 267 { 269 268 try { 270 - BufferedImage thumb = get(); 269 + Image thumb = get(); 271 270 if (thumb != null) { 272 - Image scaled = thumb.getScaledInstance(64, -1, Image.SCALE_FAST); 273 - icon.setIcon(new ImageIcon(scaled)); 271 + icon.setIcon(new ImageIcon(thumb)); 274 272 panel.revalidate(); 275 273 } 276 274 }
+2 -2
src/main/java/assets/AssetHandle.java
··· 1 1 package assets; 2 2 3 - import java.awt.image.BufferedImage; 3 + import java.awt.Image; 4 4 import java.io.File; 5 5 6 6 import assets.ui.BackgroundAsset; ··· 42 42 * Loads a thumbnail image for this asset. 43 43 * Returns null if no thumbnail is available. 44 44 */ 45 - public BufferedImage loadThumbnail() { 45 + public Image loadThumbnail() { 46 46 return null; 47 47 } 48 48
+2 -1
src/main/java/assets/ui/BackgroundAsset.java
··· 1 1 package assets.ui; 2 2 3 3 import java.awt.Graphics2D; 4 + import java.awt.Image; 4 5 import java.awt.RenderingHints; 5 6 import java.awt.image.BufferedImage; 6 7 import java.io.IOException; ··· 28 29 } 29 30 30 31 @Override 31 - public BufferedImage loadThumbnail() 32 + public Image loadThumbnail() 32 33 { 33 34 return thumbnail; 34 35 }
+35 -9
src/main/java/assets/ui/MapAsset.java
··· 2 2 3 3 import static app.Directories.PROJ_THUMBNAIL; 4 4 5 - import java.awt.image.BufferedImage; 5 + import java.awt.GraphicsEnvironment; 6 + import java.awt.Image; 7 + import java.awt.image.BaseMultiResolutionImage; 6 8 import java.io.BufferedReader; 7 9 import java.io.File; 8 10 import java.io.FileReader; 9 11 import java.io.IOException; 10 - 12 + import java.util.ArrayList; 11 13 import java.util.regex.Matcher; 12 14 import java.util.regex.Pattern; 13 15 ··· 85 87 } 86 88 87 89 @Override 88 - public BufferedImage loadThumbnail() 90 + public Image loadThumbnail() 89 91 { 92 + var variants = new ArrayList<Image>(); 93 + 90 94 File thumbFile = new File(PROJ_THUMBNAIL + assetPath + ".png"); 91 95 if (thumbFile.exists()) { 92 96 try { 93 - return ImageIO.read(thumbFile); 97 + variants.add(ImageIO.read(thumbFile)); 94 98 } 95 - catch (IOException e) { 96 - return null; 99 + catch (IOException e) {} 100 + } 101 + 102 + File thumb2xFile = new File(PROJ_THUMBNAIL + assetPath + "@2x.png"); 103 + if (thumb2xFile.exists()) { 104 + try { 105 + variants.add(ImageIO.read(thumb2xFile)); 97 106 } 107 + catch (IOException e) {} 98 108 } 99 - return null; 109 + 110 + if (variants.isEmpty()) 111 + return null; 112 + 113 + return new BaseMultiResolutionImage(variants.toArray(new Image[0])); 100 114 } 101 115 102 116 /** 103 117 * Generates thumbnails for all maps that don't already have one. 104 118 * Creates a MapEditor instance, so must not be called while one is open. 105 119 */ 120 + private static final int THUMBNAIL_SIZE = 64; 121 + 106 122 public static void generateMissingThumbnails() 107 123 { 124 + boolean hiDpi = GraphicsEnvironment.getLocalGraphicsEnvironment() 125 + .getDefaultScreenDevice().getDefaultConfiguration() 126 + .getDefaultTransform().getScaleX() > 1; 127 + 108 128 MapEditor editor = null; 109 129 110 130 try { 111 131 for (AssetHandle asset : AssetManager.getMapSources()) { 112 132 File thumbFile = new File(PROJ_THUMBNAIL + asset.assetPath + ".png"); 113 - if (thumbFile.exists()) 133 + File thumb2xFile = new File(PROJ_THUMBNAIL + asset.assetPath + "@2x.png"); 134 + boolean need1x = !thumbFile.exists(); 135 + boolean need2x = hiDpi && !thumb2xFile.exists(); 136 + if (!need1x && !need2x) 114 137 continue; 115 138 Logger.log("Capturing thumbnail for " + asset.assetPath + "...", Priority.MILESTONE); 116 139 if (editor == null) 117 140 editor = new MapEditor(false); 118 - editor.generateThumbnail(asset, thumbFile); 141 + if (need1x) 142 + editor.generateThumbnail(asset, thumbFile, THUMBNAIL_SIZE); 143 + if (need2x) 144 + editor.generateThumbnail(asset, thumb2xFile, THUMBNAIL_SIZE * 2); 119 145 } 120 146 } 121 147 catch (Exception e) {
+15 -14
src/main/java/game/map/editor/MapEditor.java
··· 734 734 735 735 private boolean thumbnailInitialized = false; 736 736 737 - public void generateThumbnail(File mapFile, File thumbFile) 737 + public void generateThumbnail(File mapFile, File thumbFile, int size) 738 738 { 739 739 Map newMap = Map.loadMap(mapFile); 740 740 if (newMap == null) 741 741 return; 742 742 743 743 thumbnailMode = true; 744 + thumbnailSize = size; 744 745 openMap(newMap, true); 745 746 for (MapObject obj : getCollisionMap().colliderTree) 746 747 obj.hidden = true; ··· 750 751 751 752 if (!thumbnailInitialized) 752 753 initThumbnail(); 754 + 755 + perspectiveView.resize(0, 0, size, size); 753 756 754 757 for (int i = 0; i < 2; i++) { 755 758 step(); ··· 3446 3449 { 3447 3450 RenderingOptions opts = new RenderingOptions(); 3448 3451 if (thumbnailMode) { 3449 - opts.canvasSizeX = THUMBNAIL_SIZE; 3450 - opts.canvasSizeY = THUMBNAIL_SIZE; 3452 + opts.canvasSizeX = thumbnailSize; 3453 + opts.canvasSizeY = thumbnailSize; 3451 3454 } 3452 3455 else { 3453 3456 opts.canvasSizeX = glCanvasPixelWidth(); ··· 3581 3584 obj.prepareVertexBuffers(opts); 3582 3585 } 3583 3586 3584 - private static final int THUMBNAIL_SIZE = 64; 3587 + private int thumbnailSize; 3585 3588 3586 3589 private void initThumbnail() 3587 3590 { ··· 3600 3603 useTextureLOD = true; 3601 3604 useMapBackgroundColor = true; 3602 3605 3603 - perspectiveView.resize(0, 0, THUMBNAIL_SIZE, THUMBNAIL_SIZE); 3604 - 3605 3606 thumbnailMode = true; 3606 3607 } 3607 3608 ··· 3610 3611 runInContext(() -> { 3611 3612 glBindFramebuffer(GL_READ_FRAMEBUFFER, perspectiveView.getSceneFrameBuffer()); 3612 3613 glReadBuffer(GL_COLOR_ATTACHMENT0); 3614 + int size = thumbnailSize; 3613 3615 int bpp = 4; 3614 - ByteBuffer buffer = BufferUtils.createByteBuffer(THUMBNAIL_SIZE * THUMBNAIL_SIZE * bpp); 3615 - glReadPixels(0, 0, THUMBNAIL_SIZE, THUMBNAIL_SIZE, 3616 - GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, buffer); 3616 + ByteBuffer buffer = BufferUtils.createByteBuffer(size * size * bpp); 3617 + glReadPixels(0, 0, size, size, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, buffer); 3617 3618 glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); 3618 3619 3619 - BufferedImage image = new BufferedImage(THUMBNAIL_SIZE, THUMBNAIL_SIZE, BufferedImage.TYPE_INT_ARGB); 3620 - for (int x = 0; x < THUMBNAIL_SIZE; x++) { 3621 - for (int y = 0; y < THUMBNAIL_SIZE; y++) { 3622 - int i = (x + (THUMBNAIL_SIZE * y)) * bpp; 3620 + BufferedImage image = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB); 3621 + for (int x = 0; x < size; x++) { 3622 + for (int y = 0; y < size; y++) { 3623 + int i = (x + (size * y)) * bpp; 3623 3624 int r = buffer.get(i) & 0xFF; 3624 3625 int g = buffer.get(i + 1) & 0xFF; 3625 3626 int b = buffer.get(i + 2) & 0xFF; 3626 3627 int a = buffer.get(i + 3) & 0xFF; 3627 - image.setRGB(x, THUMBNAIL_SIZE - (y + 1), (a << 24) | (r << 16) | (g << 8) | b); 3628 + image.setRGB(x, size - (y + 1), (a << 24) | (r << 16) | (g << 8) | b); 3628 3629 } 3629 3630 } 3630 3631