From: Taq <ta...@us...> - 2005-10-02 21:33:32
|
Update of /cvsroot/jfreechart/jcommon/source/com/keypoint In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24176/source/com/keypoint Modified Files: PngEncoder.java Log Message: Reapplied the 'setResolution' patch for the PNG-Encoder as requested by David Thielen. Index: PngEncoder.java =================================================================== RCS file: /cvsroot/jfreechart/jcommon/source/com/keypoint/PngEncoder.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** PngEncoder.java 12 Jul 2005 10:43:36 -0000 1.3 --- PngEncoder.java 2 Oct 2005 10:40:05 -0000 1.4 *************** *** 52,56 **** */ ! public class PngEncoder extends Object { /** Constant specifying that alpha channel should be encoded. */ --- 52,56 ---- */ ! public class PngEncoder { /** Constant specifying that alpha channel should be encoded. */ *************** *** 81,84 **** --- 81,86 ---- protected static final byte[] IEND = {73, 69, 78, 68}; + protected static final byte[] PHYS = {'p', 'H', 'Y', 's'}; + /** The png bytes. */ protected byte[] pngBytes; *************** *** 120,123 **** --- 122,134 ---- protected int bytesPerPixel; + /** The physical pixel dimension : number of pixels per inch on the X axis. */ + private int xDpi = 0; + + /** The physical pixel dimension : number of pixels per inch on the Y axis. */ + private int yDpi = 0; + + /** Used for conversion of DPI to Pixels per Meter. */ + static private float INCH_IN_METER_UNIT = 0.0254f; + /** * The compression level (1 = best speed, 9 = best compression, *************** *** 204,207 **** --- 215,229 ---- /** + * Returns the image to be encoded. + * + * @param image A Java Image object which uses the DirectColorModel + * @see java.awt.Image + * @see java.awt.image.DirectColorModel + */ + public Image getImage() { + return image; + } + + /** * Creates an array of bytes that is the PNG equivalent of the current * image, specifying whether to encode alpha or not. *************** *** 233,236 **** --- 255,259 ---- //hdrPos = bytePos; writeHeader(); + writeResolution(); //dataPos = bytePos; if (writeImageData()) { *************** *** 416,422 **** */ protected void writeHeader() { - int startPos; ! startPos = this.bytePos = writeInt4(13, this.bytePos); this.bytePos = writeBytes(IHDR, this.bytePos); this.width = this.image.getWidth(null); --- 439,444 ---- */ protected void writeHeader() { ! int startPos = this.bytePos = writeInt4(13, this.bytePos); this.bytePos = writeBytes(IHDR, this.bytePos); this.width = this.image.getWidth(null); *************** *** 447,451 **** */ protected void filterSub(byte[] pixels, int startPos, int width) { - int i; int offset = this.bytesPerPixel; int actualStart = startPos + offset; --- 469,472 ---- *************** *** 454,458 **** int leftExtract = 0; ! for (i = actualStart; i < startPos + nBytes; i++) { this.leftBytes[leftInsert] = pixels[i]; pixels[i] = (byte) ((pixels[i] - this.leftBytes[leftExtract]) --- 475,479 ---- int leftExtract = 0; ! for (int i = actualStart; i < startPos + nBytes; i++) { this.leftBytes[leftInsert] = pixels[i]; pixels[i] = (byte) ((pixels[i] - this.leftBytes[leftExtract]) *************** *** 472,482 **** */ protected void filterUp(byte[] pixels, int startPos, int width) { - int i, nBytes; - byte currentByte; ! nBytes = width * this.bytesPerPixel; ! for (i = 0; i < nBytes; i++) { ! currentByte = pixels[startPos + i]; pixels[startPos + i] = (byte) ((pixels[startPos + i] - this.priorRow[i]) % 256); --- 493,501 ---- */ protected void filterUp(byte[] pixels, int startPos, int width) { ! final int nBytes = width * this.bytesPerPixel; ! for (int i = 0; i < nBytes; i++) { ! final byte currentByte = pixels[startPos + i]; pixels[startPos + i] = (byte) ((pixels[startPos + i] - this.priorRow[i]) % 256); *************** *** 626,628 **** --- 645,714 ---- } + + /** + * Set the DPI for the X axis. + * + * @param xDpi The number of dots per inch + */ + public void setXDpi(int xDpi) { + this.xDpi = Math.round(xDpi / INCH_IN_METER_UNIT); + + } + + /** + * Get the DPI for the X axis. + * + * @return The number of dots per inch + */ + public int getXDpi() { + return Math.round(xDpi * INCH_IN_METER_UNIT); + } + + /** + * Set the DPI for the Y axis. + * + * @param yDpi The number of dots per inch + */ + public void setYDpi(int yDpi) { + this.yDpi = Math.round(yDpi / INCH_IN_METER_UNIT); + } + + /** + * Get the DPI for the Y axis. + * + * @return The number of dots per inch + */ + public int getYDpi() { + return Math.round(yDpi * INCH_IN_METER_UNIT); + } + + /** + * Set the DPI resolution. + * + * @param xDpi The number of dots per inch for the X axis. + * @param yDpi The number of dots per inch for the Y axis. + */ + public void setDpi(int xDpi, int yDpi) { + this.xDpi = Math.round(xDpi / INCH_IN_METER_UNIT); + this.yDpi = Math.round(yDpi / INCH_IN_METER_UNIT); + } + + /** + * Write a PNG "pHYs" chunk into the pngBytes array. + */ + protected void writeResolution() { + if (xDpi > 0 && yDpi > 0) { + + final int startPos = bytePos = writeInt4(9, bytePos); + bytePos = writeBytes(PHYS, bytePos); + bytePos = writeInt4(xDpi, bytePos); + bytePos = writeInt4(yDpi, bytePos); + bytePos = writeByte(1, bytePos); // unit is the meter. + + crc.reset(); + crc.update(pngBytes, startPos, bytePos - startPos); + crcValue = crc.getValue(); + bytePos = writeInt4((int) crcValue, bytePos); + } + } } |