Skip to content

Commit 3000a21

Browse files
committed
fixed #122,#119 Unable to export large images.
1 parent a0d45c2 commit 3000a21

File tree

6 files changed

+53
-7
lines changed

6 files changed

+53
-7
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
# SequenceDiagram Changelog
22

33
## [Unreleased]
4+
### Fixed
5+
- Unable to export large images #122, #119
6+
47
## [2.1.7]
58
### Fixed
69
- Support for Mermaid when export diagram.

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ Please try to experience it and find what happen.
101101
Have fun!
102102

103103
## Version History
104-
**Current Version 2.1.6**
104+
**Current Version 2.1.7**
105105

106106
versions:
107107
[Changelog](CHANGELOG.md)

build.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,9 @@ tasks {
7272
// https://plugins.jetbrains.com/docs/intellij/deployment.html#specifying-a-release-channel
7373
channels.set(listOf(properties("pluginVersion").split('-').getOrElse(1) { "default" }.split('.').first()))
7474
}
75+
}
76+
77+
dependencies {
78+
// implementation("ar.com.hjg:pngj:2.1.0")
79+
implementation("org.apache.xmlgraphics:batik-svggen:1.14")
7580
}

src/main/java/org/intellij/sequencer/SequencePanel.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -319,23 +319,24 @@ public ExportAction() {
319319

320320
public void actionPerformed(@NotNull AnActionEvent event) {
321321
JFileChooser fileChooser = new JFileChooser();
322-
fileChooser.setSelectedFile(new File(getTitleName().replaceAll("\\.", "_") + ".png"));
322+
fileChooser.setSelectedFile(new File(getTitleName().replaceAll("\\.", "_") + ".svg"));
323323
fileChooser.setDialogType(JFileChooser.SAVE_DIALOG);
324324
fileChooser.setFileFilter(new FileFilter() {
325325
public boolean accept(File f) {
326-
return f.isDirectory() || f.getName().endsWith("png");
326+
return f.isDirectory() || f.getName().endsWith("svg");
327327
}
328328

329329
public String getDescription() {
330-
return "PNG Images";
330+
return "SVG Images";
331331
}
332332
});
333333
try {
334334
if (fileChooser.showSaveDialog(SequencePanel.this) == JFileChooser.APPROVE_OPTION) {
335335
File selectedFile = fileChooser.getSelectedFile();
336-
if (!selectedFile.getName().endsWith("png"))
337-
selectedFile = new File(selectedFile.getParentFile(), selectedFile.getName() + ".png");
338-
_display.saveImageToFile(selectedFile);
336+
if (!selectedFile.getName().endsWith("svg"))
337+
selectedFile = new File(selectedFile.getParentFile(), selectedFile.getName() + ".svg");
338+
// _display.saveImageToFile(selectedFile);
339+
_display.saveImageToSvgFile(selectedFile);
339340
}
340341
} catch (Exception e) {
341342
e.printStackTrace();

src/main/java/org/intellij/sequencer/diagram/Display.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,13 @@
22

33
import com.intellij.ui.JBColor;
44
import com.intellij.util.ui.ImageUtil;
5+
import kotlin.text.Charsets;
6+
import org.apache.batik.dom.GenericDOMImplementation;
7+
import org.apache.batik.svggen.SVGGraphics2D;
58
import org.intellij.sequencer.config.ConfigListener;
69
import org.intellij.sequencer.config.SequenceSettingsState;
10+
import org.w3c.dom.DOMImplementation;
11+
import org.w3c.dom.Document;
712

813
import javax.imageio.ImageIO;
914
import javax.swing.*;
@@ -12,6 +17,7 @@
1217
import java.awt.event.MouseEvent;
1318
import java.awt.image.BufferedImage;
1419
import java.io.File;
20+
import java.io.FileWriter;
1521
import java.io.IOException;
1622
import java.util.HashMap;
1723

@@ -184,6 +190,14 @@ public Dimension getFullSize() {
184190
return new Dimension(width, height);
185191
}
186192

193+
/**
194+
* Save image as png file.
195+
* Known issue: when image width * height greater than Int.MAX_VALUE, will throw <code> java.lang.NegativeArraySizeException</code>.
196+
* which is the limits of <code>Raster</code>
197+
* @param file file to be saved
198+
* @throws IOException
199+
*/
200+
@Deprecated
187201
public void saveImageToFile(File file) throws IOException {
188202
Dimension size = getFullSize();
189203
BufferedImage image = ImageUtil.createImage(size.width, size.height, BufferedImage.TYPE_INT_ARGB);
@@ -205,8 +219,24 @@ public void saveImageToFile(File file) throws IOException {
205219
ImageIO.write(image, "png", file);
206220
}
207221

222+
public void saveImageToSvgFile(File file) throws IOException {
223+
DOMImplementation domImpl = GenericDOMImplementation.getDOMImplementation();
224+
String svgNS = "http://www.w3.org/2000/svg";
225+
Document document = domImpl.createDocument(svgNS, "svg", null);
226+
227+
SVGGraphics2D svgGraphics2D = new SVGGraphics2D(document);
228+
229+
paintComponentWithHeader(svgGraphics2D);
230+
231+
FileWriter fileWriter = new FileWriter(file);
232+
233+
svgGraphics2D.stream(fileWriter, false);
234+
235+
}
236+
208237
public void paintComponentWithHeader(Graphics2D graphics) {
209238
Dimension size = getFullSize();
239+
graphics.setColor(JBColor.background());
210240
graphics.fillRect(0, 0, size.width, size.height);
211241
_displayHeader.paintComponent(graphics);
212242
graphics.translate(0, _displayHeader.getHeight());

src/test/java/org/intellij/sequencer/generator/MethodDescriptionTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.junit.Before;
55
import org.junit.Test;
66

7+
import java.awt.image.DataBufferInt;
78
import java.util.ArrayList;
89

910
import static org.junit.Assert.*;
@@ -48,4 +49,10 @@ public void toJson() {
4849

4950
assertEquals(m, method);
5051
}
52+
53+
@Test(expected = NegativeArraySizeException.class)
54+
public void maxSize() {
55+
int size = -1233295232;
56+
DataBufferInt bufferInt = new DataBufferInt(size);
57+
}
5158
}

0 commit comments

Comments
 (0)