mirror of
https://github.com/haraldk/TwelveMonkeys.git
synced 2026-05-01 00:00:02 -04:00
#490: Fix for "incomplete" paths with implicit line back to start.
This commit is contained in:
+82
-8
@@ -44,7 +44,8 @@ import java.util.Arrays;
|
||||
|
||||
import static com.twelvemonkeys.imageio.path.AdobePathSegment.*;
|
||||
import static com.twelvemonkeys.imageio.path.PathsTest.assertPathEquals;
|
||||
import static org.junit.Assert.*;
|
||||
import static org.junit.Assert.assertArrayEquals;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
/**
|
||||
* AdobePathWriterTest.
|
||||
@@ -92,6 +93,16 @@ public class AdobePathWriterTest {
|
||||
new AdobePathWriter(path);
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void testCreateNotClosed() {
|
||||
GeneralPath path = new GeneralPath(Path2D.WIND_EVEN_ODD);
|
||||
path.moveTo(.5, .5);
|
||||
path.lineTo(1, .5);
|
||||
path.curveTo(1, 1, 1, 1, .5, 1);
|
||||
|
||||
new AdobePathWriter(path).writePath();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateClosed() {
|
||||
GeneralPath path = new GeneralPath(Path2D.WIND_EVEN_ODD);
|
||||
@@ -100,9 +111,30 @@ public class AdobePathWriterTest {
|
||||
path.curveTo(1, 1, 1, 1, .5, 1);
|
||||
path.closePath();
|
||||
|
||||
new AdobePathWriter(path).writePath();
|
||||
byte[] bytes = new AdobePathWriter(path).writePath();
|
||||
|
||||
fail("Test that we have 4 segments");
|
||||
assertEquals(6 * 26, bytes.length);
|
||||
|
||||
int off = 0;
|
||||
|
||||
// Path/initial fill rule: Even-Odd (0)
|
||||
assertArrayEquals(new byte[] {0, PATH_FILL_RULE_RECORD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
Arrays.copyOfRange(bytes, off, off += 26));
|
||||
assertArrayEquals(new byte[] {0, INITIAL_FILL_RULE_RECORD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
Arrays.copyOfRange(bytes, off, off += 26));
|
||||
|
||||
// Rectangle 1: 0, 0, 1, .5
|
||||
assertArrayEquals(new byte[] {0, CLOSED_SUBPATH_LENGTH_RECORD, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
Arrays.copyOfRange(bytes, off, off += 26));
|
||||
assertArrayEquals(new byte[] {0, CLOSED_SUBPATH_BEZIER_UNLINKED, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 1, 0, 0, 0},
|
||||
Arrays.copyOfRange(bytes, off, off += 26));
|
||||
assertArrayEquals(new byte[] {0, CLOSED_SUBPATH_BEZIER_UNLINKED, 0, -128, 0, 0, 1, 0, 0, 0, 0, -128, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0},
|
||||
Arrays.copyOfRange(bytes, off, off += 26));
|
||||
assertArrayEquals(new byte[] {0, CLOSED_SUBPATH_BEZIER_UNLINKED, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0},
|
||||
Arrays.copyOfRange(bytes, off, off += 26));
|
||||
|
||||
// Sanity
|
||||
assertEquals(bytes.length, off);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -113,9 +145,31 @@ public class AdobePathWriterTest {
|
||||
path.curveTo(1, 1, 1, 1, .5, 1);
|
||||
path.lineTo(.5, .5);
|
||||
|
||||
new AdobePathWriter(path).writePath(); // TODO: Should we allow this?
|
||||
byte[] bytes = new AdobePathWriter(path).writePath();
|
||||
|
||||
assertEquals(6 * 26, bytes.length);
|
||||
|
||||
int off = 0;
|
||||
|
||||
// Path/initial fill rule: Even-Odd (0)
|
||||
assertArrayEquals(new byte[] {0, PATH_FILL_RULE_RECORD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
Arrays.copyOfRange(bytes, off, off += 26));
|
||||
assertArrayEquals(new byte[] {0, INITIAL_FILL_RULE_RECORD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
Arrays.copyOfRange(bytes, off, off += 26));
|
||||
|
||||
// Rectangle 1: 0, 0, 1, .5
|
||||
assertArrayEquals(new byte[] {0, CLOSED_SUBPATH_LENGTH_RECORD, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
Arrays.copyOfRange(bytes, off, off += 26));
|
||||
assertArrayEquals(new byte[] {0, CLOSED_SUBPATH_BEZIER_UNLINKED, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 1, 0, 0, 0},
|
||||
Arrays.copyOfRange(bytes, off, off += 26));
|
||||
assertArrayEquals(new byte[] {0, CLOSED_SUBPATH_BEZIER_UNLINKED, 0, -128, 0, 0, 1, 0, 0, 0, 0, -128, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0},
|
||||
Arrays.copyOfRange(bytes, off, off += 26));
|
||||
assertArrayEquals(new byte[] {0, CLOSED_SUBPATH_BEZIER_UNLINKED, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0},
|
||||
Arrays.copyOfRange(bytes, off, off += 26));
|
||||
|
||||
// Sanity
|
||||
assertEquals(bytes.length, off);
|
||||
|
||||
fail("Test that we have 4 segments, and that it is equal to the one above");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -127,9 +181,30 @@ public class AdobePathWriterTest {
|
||||
path.lineTo(.5, .5);
|
||||
path.closePath();
|
||||
|
||||
new AdobePathWriter(path).writePath();
|
||||
byte[] bytes = new AdobePathWriter(path).writePath();
|
||||
|
||||
fail("Test that we have 4 segments, and that it is equal to the one above");
|
||||
assertEquals(6 * 26, bytes.length);
|
||||
|
||||
int off = 0;
|
||||
|
||||
// Path/initial fill rule: Even-Odd (0)
|
||||
assertArrayEquals(new byte[] {0, PATH_FILL_RULE_RECORD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
Arrays.copyOfRange(bytes, off, off += 26));
|
||||
assertArrayEquals(new byte[] {0, INITIAL_FILL_RULE_RECORD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
Arrays.copyOfRange(bytes, off, off += 26));
|
||||
|
||||
// Rectangle 1: 0, 0, 1, .5
|
||||
assertArrayEquals(new byte[] {0, CLOSED_SUBPATH_LENGTH_RECORD, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
Arrays.copyOfRange(bytes, off, off += 26));
|
||||
assertArrayEquals(new byte[] {0, CLOSED_SUBPATH_BEZIER_UNLINKED, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 1, 0, 0, 0},
|
||||
Arrays.copyOfRange(bytes, off, off += 26));
|
||||
assertArrayEquals(new byte[] {0, CLOSED_SUBPATH_BEZIER_UNLINKED, 0, -128, 0, 0, 1, 0, 0, 0, 0, -128, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0},
|
||||
Arrays.copyOfRange(bytes, off, off += 26));
|
||||
assertArrayEquals(new byte[] {0, CLOSED_SUBPATH_BEZIER_UNLINKED, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0},
|
||||
Arrays.copyOfRange(bytes, off, off += 26));
|
||||
|
||||
// Sanity
|
||||
assertEquals(bytes.length, off);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -207,7 +282,6 @@ public class AdobePathWriterTest {
|
||||
AdobePathWriter pathCreator = new AdobePathWriter(path);
|
||||
|
||||
byte[] bytes = pathCreator.writePath();
|
||||
// System.err.println(Arrays.toString(bytes));
|
||||
|
||||
assertEquals(12 * 26, bytes.length);
|
||||
|
||||
|
||||
@@ -38,15 +38,18 @@ import org.junit.Test;
|
||||
import javax.imageio.ImageIO;
|
||||
import javax.imageio.spi.IIORegistry;
|
||||
import javax.imageio.stream.ImageInputStream;
|
||||
import javax.imageio.stream.ImageOutputStream;
|
||||
import java.awt.*;
|
||||
import java.awt.geom.GeneralPath;
|
||||
import java.awt.geom.Path2D;
|
||||
import java.awt.geom.PathIterator;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectInputStream;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
import static org.junit.Assume.assumeTrue;
|
||||
|
||||
/**
|
||||
* PathsTest.
|
||||
@@ -240,6 +243,9 @@ public class PathsTest {
|
||||
}
|
||||
|
||||
static void assertPathEquals(final Path2D expectedPath, final Path2D actualPath) {
|
||||
assertNotNull("Expected path is null, check your tests...", expectedPath);
|
||||
assertNotNull(actualPath);
|
||||
|
||||
PathIterator expectedIterator = expectedPath.getPathIterator(null);
|
||||
PathIterator actualIterator = actualPath.getPathIterator(null);
|
||||
|
||||
@@ -261,4 +267,37 @@ public class PathsTest {
|
||||
|
||||
assertTrue("More points than expected", actualIterator.isDone());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWriteJPEG() throws IOException {
|
||||
Path2D originalPath = readExpectedPath("/ser/multiple-clips.ser");
|
||||
|
||||
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
|
||||
BufferedImage image = new BufferedImage(2, 2, BufferedImage.TYPE_3BYTE_BGR);
|
||||
try (ImageOutputStream stream = ImageIO.createImageOutputStream(bytes)) {
|
||||
boolean written = Paths.writeClipped(image, originalPath, "JPEG", stream);
|
||||
assertTrue(written);
|
||||
}
|
||||
assertTrue(bytes.size() > 1024); // Actual size may be plugin specific...
|
||||
|
||||
Path2D actualPath = Paths.readPath(new ByteArrayImageInputStream(bytes.toByteArray()));
|
||||
assertPathEquals(originalPath, actualPath);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWriteTIFF() throws IOException {
|
||||
Path2D originalPath = readExpectedPath("/ser/grape-path.ser");
|
||||
|
||||
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
|
||||
BufferedImage image = new BufferedImage(2, 2, BufferedImage.TYPE_INT_ARGB);
|
||||
try (ImageOutputStream stream = ImageIO.createImageOutputStream(bytes)) {
|
||||
boolean written = Paths.writeClipped(image, originalPath, "TIFF", stream);
|
||||
assumeTrue(written); // TIFF support is optional
|
||||
}
|
||||
|
||||
assertTrue(bytes.size() > 1024); // Actual size may be plugin specific...
|
||||
|
||||
Path2D actualPath = Paths.readPath(new ByteArrayImageInputStream(bytes.toByteArray()));
|
||||
assertPathEquals(originalPath, actualPath);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user