Thank you. I have tons of changes I want to make, many of them large and affecting the API. If we have to make a release soon, maybe a 0.98 would be better?
Regards Damjan On Sun, Feb 5, 2017 at 7:09 PM, Benedikt Ritter <brit...@apache.org> wrote: > Hi Damjan, > > It’s nice to see some activity in IMAGING again. Do you think the code > base is ready for an RC? I’d like to finally push out a release of this > component. > > Regards, > Benedikt > > > Am 05.02.2017 um 18:07 schrieb dam...@apache.org: > > > > Author: damjan > > Date: Sun Feb 5 17:07:51 2017 > > New Revision: 1781785 > > > > URL: http://svn.apache.org/viewvc?rev=1781785&view=rev > > Log: > > Allow giving PCX a hint as to the number of planes to use, and by > default, > > write 16 color images using 4 planes of 1 bit instead of 1 plane of 4 > bits, > > as GIMP and Apache OpenOffice support the former but not the latter. > > > > Patch by: me > > > > Modified: > > commons/proper/imaging/trunk/src/main/java/org/apache/ > commons/imaging/formats/pcx/PcxConstants.java > > commons/proper/imaging/trunk/src/main/java/org/apache/ > commons/imaging/formats/pcx/PcxWriter.java > > > > Modified: commons/proper/imaging/trunk/src/main/java/org/apache/ > commons/imaging/formats/pcx/PcxConstants.java > > URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/ > src/main/java/org/apache/commons/imaging/formats/pcx/ > PcxConstants.java?rev=1781785&r1=1781784&r2=1781785&view=diff > > ============================================================ > ================== > > --- commons/proper/imaging/trunk/src/main/java/org/apache/ > commons/imaging/formats/pcx/PcxConstants.java (original) > > +++ commons/proper/imaging/trunk/src/main/java/org/apache/ > commons/imaging/formats/pcx/PcxConstants.java Sun Feb 5 17:07:51 2017 > > @@ -22,6 +22,8 @@ public final class PcxConstants { > > > > public static final String PARAM_KEY_PCX_BIT_DEPTH = "PCX_BIT_DEPTH"; > > > > + public static final String PARAM_KEY_PCX_PLANES = "PCX_PLANES"; > > + > > private PcxConstants() { > > } > > } > > > > Modified: commons/proper/imaging/trunk/src/main/java/org/apache/ > commons/imaging/formats/pcx/PcxWriter.java > > URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/ > src/main/java/org/apache/commons/imaging/formats/pcx/ > PcxWriter.java?rev=1781785&r1=1781784&r2=1781785&view=diff > > ============================================================ > ================== > > --- commons/proper/imaging/trunk/src/main/java/org/apache/ > commons/imaging/formats/pcx/PcxWriter.java (original) > > +++ commons/proper/imaging/trunk/src/main/java/org/apache/ > commons/imaging/formats/pcx/PcxWriter.java Sun Feb 5 17:07:51 2017 > > @@ -33,6 +33,7 @@ import org.apache.commons.imaging.palett > > class PcxWriter { > > private int encoding; > > private int bitDepth = -1; > > + private int planes = -1; > > private PixelDensity pixelDensity; > > private final RleWriter rleWriter; > > > > @@ -77,6 +78,17 @@ class PcxWriter { > > bitDepth = ((Number) value).intValue(); > > } > > } > > + > > + if (params.containsKey(PcxConstants.PARAM_KEY_PCX_PLANES)) { > > + final Object value = params.remove(PcxConstants. > PARAM_KEY_PCX_PLANES); > > + if (value != null) { > > + if (!(value instanceof Number)) { > > + throw new ImageWriteException( > > + "Invalid planes parameter: " + value); > > + } > > + planes = ((Number) value).intValue(); > > + } > > + } > > > > if (params.containsKey(ImagingConstants.PARAM_KEY_PIXEL_DENSITY)) > { > > final Object value = params.remove( > ImagingConstants.PARAM_KEY_PIXEL_DENSITY); > > @@ -114,7 +126,11 @@ class PcxWriter { > > } else if (palette.length() > 16 || bitDepth == 8) { > > write256ColorPCX(src, palette, bos); > > } else if (palette.length() > 2 || bitDepth == 4) { > > - write16ColorPCX(src, palette, bos); > > + if (planes == 1) { > > + write16ColorPCXIn1Plane(src, palette, bos); > > + } else { > > + write16ColorPCXIn4Planes(src, palette, bos); > > + } > > } else { > > boolean onlyBlackAndWhite = true; > > if (palette.length() >= 1) { > > @@ -132,7 +148,11 @@ class PcxWriter { > > if (onlyBlackAndWhite) { > > writeBlackAndWhitePCX(src, bos); > > } else { > > - write16ColorPCX(src, palette, bos); > > + if (planes == 1) { > > + write16ColorPCXIn1Plane(src, palette, bos); > > + } else { > > + write16ColorPCXIn4Planes(src, palette, bos); > > + } > > } > > } > > } > > @@ -264,7 +284,7 @@ class PcxWriter { > > rleWriter.flush(bos); > > } > > > > - private void write16ColorPCX(final BufferedImage src, final > SimplePalette palette, > > + private void write16ColorPCXIn1Plane(final BufferedImage src, final > SimplePalette palette, > > final BinaryOutputStream bos) throws ImageWriteException, > IOException { > > int bytesPerLine = (src.getWidth() + 1) / 2; > > if (bytesPerLine % 2 != 0) { > > @@ -316,6 +336,71 @@ class PcxWriter { > > } > > rleWriter.flush(bos); > > } > > + > > + private void write16ColorPCXIn4Planes(final BufferedImage src, > final SimplePalette palette, > > + final BinaryOutputStream bos) throws ImageWriteException, > IOException { > > + int bytesPerLine = (src.getWidth() + 7) / 8; > > + if (bytesPerLine % 2 != 0) { > > + ++bytesPerLine; > > + } > > + > > + final byte[] palette16 = new byte[16 * 3]; > > + for (int i = 0; i < 16; i++) { > > + int rgb; > > + if (i < palette.length()) { > > + rgb = palette.getEntry(i); > > + } else { > > + rgb = 0; > > + } > > + palette16[3 * i + 0] = (byte) (0xff & (rgb >> 16)); > > + palette16[3 * i + 1] = (byte) (0xff & (rgb >> 8)); > > + palette16[3 * i + 2] = (byte) (0xff & rgb); > > + } > > + > > + // PCX header > > + bos.write(10); // manufacturer > > + bos.write(5); // version > > + bos.write(encoding); // encoding > > + bos.write(1); // bits per pixel > > + bos.write2Bytes(0); // xMin > > + bos.write2Bytes(0); // yMin > > + bos.write2Bytes(src.getWidth() - 1); // xMax > > + bos.write2Bytes(src.getHeight() - 1); // yMax > > + bos.write2Bytes((short) > > Math.round(pixelDensity.horizontalDensityInches())); > // hDpi > > + bos.write2Bytes((short) > > Math.round(pixelDensity.verticalDensityInches())); > // vDpi > > + bos.write(palette16); // 16 color palette > > + bos.write(0); // reserved > > + bos.write(4); // planes > > + bos.write2Bytes(bytesPerLine); // bytes per line > > + bos.write2Bytes(1); // palette info > > + bos.write2Bytes(0); // hScreenSize > > + bos.write2Bytes(0); // vScreenSize > > + bos.write(new byte[54]); > > + > > + final byte[] plane0 = new byte[bytesPerLine]; > > + final byte[] plane1 = new byte[bytesPerLine]; > > + final byte[] plane2 = new byte[bytesPerLine]; > > + final byte[] plane3 = new byte[bytesPerLine]; > > + for (int y = 0; y < src.getHeight(); y++) { > > + Arrays.fill(plane0, (byte)0); > > + Arrays.fill(plane1, (byte)0); > > + Arrays.fill(plane2, (byte)0); > > + Arrays.fill(plane3, (byte)0); > > + for (int x = 0; x < src.getWidth(); x++) { > > + final int argb = src.getRGB(x, y); > > + final int index = palette.getPaletteIndex(0xffffff & > argb); > > + plane0[x >>> 3] |= (index & 1) << (7 - (x & 7)); > > + plane1[x >>> 3] |= ((index & 2) >> 1) << (7 - (x & 7)); > > + plane2[x >>> 3] |= ((index & 4) >> 2) << (7 - (x & 7)); > > + plane3[x >>> 3] |= ((index & 8) >> 3) << (7 - (x & 7)); > > + } > > + rleWriter.write(bos, plane0); > > + rleWriter.write(bos, plane1); > > + rleWriter.write(bos, plane2); > > + rleWriter.write(bos, plane3); > > + } > > + rleWriter.flush(bos); > > + } > > > > private void write256ColorPCX(final BufferedImage src, final > SimplePalette palette, > > final BinaryOutputStream bos) throws ImageWriteException, > IOException { > > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org > For additional commands, e-mail: dev-h...@commons.apache.org > >