diff --git a/trunk/src/com/jpexs/decompiler/flash/SWFOutputStream.java b/trunk/src/com/jpexs/decompiler/flash/SWFOutputStream.java index 3f7ae4f70..44e380dab 100644 --- a/trunk/src/com/jpexs/decompiler/flash/SWFOutputStream.java +++ b/trunk/src/com/jpexs/decompiler/flash/SWFOutputStream.java @@ -343,17 +343,31 @@ public class SWFOutputStream extends OutputStream { */ public void writeRECT(RECT value) throws IOException { int nBits = 0; - nBits = enlargeBitCountS(nBits, value.Xmin); - nBits = enlargeBitCountS(nBits, value.Xmax); - nBits = enlargeBitCountS(nBits, value.Ymin); - nBits = enlargeBitCountS(nBits, value.Ymax); + int xMin = truncateTo31Bit(value.Xmin); + int xMax = truncateTo31Bit(value.Xmax); + int yMin = truncateTo31Bit(value.Ymin); + int yMax = truncateTo31Bit(value.Ymax); + nBits = enlargeBitCountS(nBits, xMin); + nBits = enlargeBitCountS(nBits, xMax); + nBits = enlargeBitCountS(nBits, yMin); + nBits = enlargeBitCountS(nBits, yMax); writeUB(5, nBits); - writeSB(nBits, value.Xmin); - writeSB(nBits, value.Xmax); - writeSB(nBits, value.Ymin); - writeSB(nBits, value.Ymax); + writeSB(nBits, xMin); + writeSB(nBits, xMax); + writeSB(nBits, yMin); + writeSB(nBits, yMax); alignByte(); } + + private int truncateTo31Bit(int value) { + if (value > 0x3fffffff) { + value = 0x3fffffff; + } + if (value < -0x3fffffff) { + value = -0x3fffffff; + } + return value; + } /** * Writes list of Tag values to the stream diff --git a/trunk/test/com/jpexs/decompiler/flash/SWFStreamTest.java b/trunk/test/com/jpexs/decompiler/flash/SWFStreamTest.java index 6df586d75..bf4f55197 100644 --- a/trunk/test/com/jpexs/decompiler/flash/SWFStreamTest.java +++ b/trunk/test/com/jpexs/decompiler/flash/SWFStreamTest.java @@ -1,5 +1,6 @@ package com.jpexs.decompiler.flash; +import com.jpexs.decompiler.flash.types.RECT; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -139,4 +140,22 @@ public class SWFStreamTest { assertEquals(ff, sis.readFIXED8()); sis.close(); } + + @Test + public void testRECT() throws IOException { + RECT rect; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try (SWFOutputStream sos = new SWFOutputStream(baos, 10)) { + rect = new RECT(-0x80000000, 0x7FFFFFFF, -0x80000000, 0x7FFFFFFF); + sos.writeRECT(rect); + } + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + try (SWFInputStream sis = new SWFInputStream(bais, 10)) { + RECT readRECT = sis.readRECT(); + assertEquals(readRECT.Xmin, -0x3FFFFFFF); + assertEquals(readRECT.Xmax, 0x3FFFFFFF); + assertEquals(readRECT.Ymin, -0x3FFFFFFF); + assertEquals(readRECT.Ymax, 0x3FFFFFFF); + } + } }