diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/common/utils/CatHashImageUtil.java b/apps/desktop/desktop/src/main/java/bisq/desktop/common/utils/CatHashImageUtil.java new file mode 100644 index 0000000000..12066eb510 --- /dev/null +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/common/utils/CatHashImageUtil.java @@ -0,0 +1,108 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq 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 Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.desktop.common.utils; + +import bisq.common.file.FileUtils; +import javafx.scene.SnapshotParameters; +import javafx.scene.canvas.Canvas; +import javafx.scene.canvas.GraphicsContext; +import javafx.scene.image.*; +import javafx.scene.paint.Color; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.nio.ByteBuffer; + +public class CatHashImageUtil { + private static final String BASE_PATH = "images/cathash/"; + + public static Image composeImage(String[] paths, double size) { + return composeImage(paths, size, size); + } + + public static Image composeImage(String[] paths, double width, double height) { + return composeImage(paths, BASE_PATH, width, height); + } + + public static Image composeImage(String[] paths, String basePath, double width, double height) { + Canvas canvas = new Canvas(); + canvas.setWidth(width); + canvas.setHeight(height); + GraphicsContext graphicsContext2D = canvas.getGraphicsContext2D(); + + double radius = Math.min(height, width) / 2d; + double x = width / 2d; + double y = height / 2d; + graphicsContext2D.beginPath(); + graphicsContext2D.moveTo(x - radius, y); + graphicsContext2D.arc(x, y, radius, radius, 180, 360); + graphicsContext2D.closePath(); + graphicsContext2D.clip(); + + for (String path : paths) { + graphicsContext2D.drawImage(new Image(basePath + path), 0, 0, width, height); + } + SnapshotParameters snapshotParameters = new SnapshotParameters(); + snapshotParameters.setFill(Color.TRANSPARENT); + return canvas.snapshot(snapshotParameters, null); + } + + public static Image readRawImage(File file) throws IOException { + byte[] rawData = FileUtils.read(file.getAbsolutePath()); + return byteArrayToImage(rawData); + } + + public static void writeRawImage(Image image, File file) throws IOException { + byte[] rawData = imageToByteArray(image); + FileUtils.write(file.getAbsolutePath(), rawData); + } + + public static Image byteArrayToImage(byte[] data) { + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data); + + int width = byteArrayInputStream.read(); + int height = byteArrayInputStream.read(); + + byte[] pixels = new byte[width * height * 4]; + byteArrayInputStream.read(pixels, 0, pixels.length); + + WritableImage image = new WritableImage(width, height); + PixelWriter pixelWriter = image.getPixelWriter(); + pixelWriter.setPixels(0, 0, width, height, PixelFormat.getByteBgraInstance(), pixels, 0, width * 4); + + return image; + } + + public static byte[] imageToByteArray(Image image) { + int width = (int) image.getWidth(); + int height = (int) image.getHeight(); + PixelReader pixelReader = image.getPixelReader(); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + byteArrayOutputStream.write(width); + byteArrayOutputStream.write(height); + + ByteBuffer buffer = ByteBuffer.allocate(width * height * 4); // 4 bytes per pixel (ARGB) + WritablePixelFormat format = WritablePixelFormat.getByteBgraInstance(); + pixelReader.getPixels(0, 0, width, height, format, buffer, width * 4); + + byteArrayOutputStream.write(buffer.array(), 0, buffer.array().length); + return byteArrayOutputStream.toByteArray(); + } +} diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/common/utils/ImageUtil.java b/apps/desktop/desktop/src/main/java/bisq/desktop/common/utils/ImageUtil.java index 836c33ba18..827f0bb426 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/common/utils/ImageUtil.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/common/utils/ImageUtil.java @@ -17,12 +17,8 @@ package bisq.desktop.common.utils; -import bisq.common.file.FileUtils; import javafx.geometry.Pos; import javafx.scene.Node; -import javafx.scene.SnapshotParameters; -import javafx.scene.canvas.Canvas; -import javafx.scene.canvas.GraphicsContext; import javafx.scene.image.*; import javafx.scene.layout.StackPane; import javafx.scene.paint.Color; @@ -33,7 +29,6 @@ import lombok.extern.slf4j.Slf4j; import java.io.*; -import java.nio.ByteBuffer; import java.util.Objects; @Slf4j @@ -87,33 +82,6 @@ public static void addAppIcons(Stage stage) { stage.getIcons().add(ImageUtil.getImageByPath("images/app_window/icon_16.png")); } - public static Image composeImage(String[] paths, double size) { - return composeImage(paths, size, size); - } - - public static Image composeImage(String[] paths, double width, double height) { - Canvas canvas = new Canvas(); - canvas.setWidth(width); - canvas.setHeight(height); - GraphicsContext graphicsContext2D = canvas.getGraphicsContext2D(); - - double radius = Math.min(height, width) / 2d; - double x = width / 2d; - double y = height / 2d; - graphicsContext2D.beginPath(); - graphicsContext2D.moveTo(x - radius, y); - graphicsContext2D.arc(x, y, radius, radius, 180, 360); - graphicsContext2D.closePath(); - graphicsContext2D.clip(); - - for (String path : paths) { - graphicsContext2D.drawImage(new Image("images/cathash/" + path), 0, 0, width, height); - } - SnapshotParameters snapshotParameters = new SnapshotParameters(); - snapshotParameters.setFill(Color.TRANSPARENT); - return canvas.snapshot(snapshotParameters, null); - } - /** * @param size * @param cssStrokeColor E.g. -bisq2-green @@ -163,45 +131,4 @@ public static StackPane getOverlappedIconsPane(String leftIconId, return pane; } - public static Image readRawImage(File file) throws IOException { - byte[] rawData = FileUtils.read(file.getAbsolutePath()); - return byteArrayToImage(rawData); - } - - public static void writeRawImage(Image image, File file) throws IOException { - byte[] rawData = imageToByteArray(image); - FileUtils.write(file.getAbsolutePath(), rawData); - } - - public static Image byteArrayToImage(byte[] data) { - ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data); - - int width = byteArrayInputStream.read(); - int height = byteArrayInputStream.read(); - - byte[] pixels = new byte[width * height * 4]; - byteArrayInputStream.read(pixels, 0, pixels.length); - - WritableImage image = new WritableImage(width, height); - PixelWriter pixelWriter = image.getPixelWriter(); - pixelWriter.setPixels(0, 0, width, height, PixelFormat.getByteBgraInstance(), pixels, 0, width * 4); - - return image; - } - - public static byte[] imageToByteArray(Image image) { - int width = (int) image.getWidth(); - int height = (int) image.getHeight(); - PixelReader pixelReader = image.getPixelReader(); - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - byteArrayOutputStream.write(width); - byteArrayOutputStream.write(height); - - ByteBuffer buffer = ByteBuffer.allocate(width * height * 4); // 4 bytes per pixel (ARGB) - WritablePixelFormat format = WritablePixelFormat.getByteBgraInstance(); - pixelReader.getPixels(0, 0, width, height, format, buffer, width * 4); - - byteArrayOutputStream.write(buffer.array(), 0, buffer.array().length); - return byteArrayOutputStream.toByteArray(); - } } diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/components/cathash/JavaFxCatHashService.java b/apps/desktop/desktop/src/main/java/bisq/desktop/components/cathash/JavaFxCatHashService.java index 637f69124a..ef49edef38 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/components/cathash/JavaFxCatHashService.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/components/cathash/JavaFxCatHashService.java @@ -17,7 +17,7 @@ package bisq.desktop.components.cathash; -import bisq.desktop.common.utils.ImageUtil; +import bisq.desktop.common.utils.CatHashImageUtil; import bisq.user.cathash.CatHashService; import javafx.scene.image.Image; @@ -32,16 +32,16 @@ public JavaFxCatHashService(Path baseDir) { @Override protected Image composeImage(String[] paths, double size) { - return ImageUtil.composeImage(paths, size); + return CatHashImageUtil.composeImage(paths, size); } @Override protected void writeRawImage(Image image, File iconFile) throws IOException { - ImageUtil.writeRawImage(image, iconFile); + CatHashImageUtil.writeRawImage(image, iconFile); } @Override protected Image readRawImage(File iconFile) throws IOException { - return ImageUtil.readRawImage(iconFile); + return CatHashImageUtil.readRawImage(iconFile); } }