AWT is forbidden on 1.13+ (this includes BufferedImage)

Instead use NativeImage on 1.13+ via newly introduced Image class.
See Image docs for details.

Also fixes an issue with thumbnail taking on 1.13+: The original
ScreenshotHelper method is now async, luckily there's a sync
variant and as a bonus it directly returns a NativeImage so we can
skip having to read the screenshot from disk.
This commit is contained in:
Jonas Herzig
2019-06-30 11:11:02 +02:00
parent 732e1ab32e
commit 7241036e61
14 changed files with 132 additions and 134 deletions

View File

@@ -2,6 +2,7 @@ package com.replaymod.extras.advancedscreenshots;
import com.replaymod.core.ReplayMod;
import com.replaymod.core.SettingsRegistry;
import com.replaymod.core.versions.MCVer;
import com.replaymod.extras.Setting;
import com.replaymod.render.RenderSettings;
import de.johni0702.minecraft.gui.container.GuiContainer;
@@ -14,8 +15,6 @@ import de.johni0702.minecraft.gui.layout.VerticalLayout;
import de.johni0702.minecraft.gui.popup.AbstractGuiPopup;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor;
import java.awt.*;
import java.io.IOException;
import java.net.URI;
public class GuiUploadScreenshot extends AbstractGuiPopup<GuiUploadScreenshot> {
@@ -68,22 +67,10 @@ public class GuiUploadScreenshot extends AbstractGuiPopup<GuiUploadScreenshot> {
}
if (veer) {
veerUploadButton.onClick(() -> {
try {
Desktop.getDesktop().browse(URI.create("https://veer.tv/upload"));
} catch (IOException e) {
e.printStackTrace();
}
});
veerUploadButton.onClick(() -> MCVer.openURL(URI.create("https://veer.tv/upload")));
}
showOnDiskButton.onClick(() -> {
try {
Desktop.getDesktop().browse(renderSettings.getOutputFile().toURI());
} catch (IOException e) {
e.printStackTrace();
}
});
showOnDiskButton.onClick(() -> MCVer.openFile(renderSettings.getOutputFile().getParentFile()));
closeButton.onClick(() -> {
if (neverOpenCheckbox.isChecked()) {

View File

@@ -8,10 +8,9 @@ import com.replaymod.render.frame.RGBFrame;
import com.replaymod.render.rendering.FrameConsumer;
import com.replaymod.replay.ReplayModReplay;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
import de.johni0702.minecraft.gui.versions.Image;
import net.minecraft.util.crash.CrashReport;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
@@ -28,23 +27,20 @@ public class ScreenshotWriter implements FrameConsumer<RGBFrame> {
// skip the first frame, in which not all chunks are properly loaded
if (frame.getFrameId() == 0) return;
try {
final ReadableDimension frameSize = frame.getSize();
BufferedImage img = new BufferedImage(frameSize.getWidth(), frameSize.getHeight(), BufferedImage.TYPE_INT_RGB);
final ReadableDimension frameSize = frame.getSize();
try (Image img = new Image(frameSize.getWidth(), frameSize.getHeight())) {
for (int y = 0; y < frameSize.getHeight(); y++) {
for (int x = 0; x < frameSize.getWidth(); x++) {
byte r = frame.getByteBuffer().get();
byte g = frame.getByteBuffer().get();
byte b = frame.getByteBuffer().get();
int color = ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff);
img.setRGB(x, y, color);
img.setRGBA(x, y, r, g, b, 0xff);
}
}
outputFile.getParentFile().mkdirs();
ImageIO.write(img, "PNG", outputFile);
img.writePNG(outputFile);
} catch (OutOfMemoryError e) {
e.printStackTrace();
CrashReport report = CrashReport.create(e, "Exporting frame");

View File

@@ -6,6 +6,7 @@ import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.replaymod.core.utils.Utils;
import com.replaymod.core.versions.MCVer;
import com.replaymod.render.RenderSettings;
import de.johni0702.minecraft.gui.GuiRenderer;
import de.johni0702.minecraft.gui.RenderInfo;
@@ -19,6 +20,7 @@ import de.johni0702.minecraft.gui.layout.CustomLayout;
import de.johni0702.minecraft.gui.layout.VerticalLayout;
import de.johni0702.minecraft.gui.popup.GuiFileChooserPopup;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
import de.johni0702.minecraft.gui.versions.Image;
import joptsimple.internal.Strings;
import lombok.RequiredArgsConstructor;
import net.minecraft.client.resource.language.I18n;
@@ -34,8 +36,6 @@ import javax.annotation.Nullable;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
@@ -43,6 +43,7 @@ import java.io.IOException;
import java.net.URL;
import java.security.GeneralSecurityException;
import static com.replaymod.extras.ReplayModExtras.LOGGER;
import static java.util.Arrays.asList;
@RequiredArgsConstructor
@@ -125,13 +126,13 @@ public class GuiYoutubeUpload extends GuiScreen {
public void onSuccess(@Nullable File result) {
if (result != null) {
thumbnailButton.setLabel(result.getName());
BufferedImage image;
Image image;
try {
thumbnailImage = IOUtils.toByteArray(new FileInputStream(result));
ImageInputStream in = ImageIO.createImageInputStream(new ByteArrayInputStream(thumbnailImage));
ImageReader reader = ImageIO.getImageReaders(in).next();
thumbnailFormat = reader.getFormatName().toLowerCase();
image = ImageIO.read(new ByteArrayInputStream(thumbnailImage));
image = Image.read(new ByteArrayInputStream(thumbnailImage));
} catch (Throwable t) {
t.printStackTrace();
thumbnailImage = null;
@@ -216,17 +217,9 @@ public class GuiYoutubeUpload extends GuiScreen {
public void onSuccess(Video result) {
String url = "https://youtu.be/" + result.getId();
try {
Desktop.getDesktop().browse(new URL(url).toURI());
MCVer.openURL(new URL(url).toURI());
} catch(Throwable throwable) {
//#if MC>=11400
SystemUtil.getOperatingSystem().open(url);
//#else
//#if MC>=11300
//$$ Util.getOSType().openURI(url);
//#else
//$$ Sys.openURL(url);
//#endif
//#endif
LOGGER.error("Failed to open video URL \"{}\":", url, throwable);
}
upload = null;
progressBar.setLabel(I18n.translate("replaymod.gui.ytuploadprogress.done", url));