annotate dwt/internal/image/PNGFileFormat.d @ 240:ce446666f5a2

Update to SWT 3.4M7
author Frank Benoit <benoit@tionex.de>
date Mon, 12 May 2008 19:13:01 +0200
parents 08789b28bdf3
children c0d810de7093
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
134
116d23207a86 changed PNG loader to use internal inflating
Frank Benoit <benoit@tionex.de>
parents: 131
diff changeset
1 /*******************************************************************************
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2 * Copyright (c) 2000, 2006 IBM Corporation and others.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
3 * All rights reserved. This program and the accompanying materials
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
4 * are made available under the terms of the Eclipse Public License v1.0
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
5 * which accompanies this distribution, and is available at
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
6 * http://www.eclipse.org/legal/epl-v10.html
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
7 *
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
8 * Contributors:
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
9 * IBM Corporation - initial API and implementation
108
0f12f6bb9739 author notice
Frank Benoit <benoit@tionex.de>
parents: 71
diff changeset
10 * Port to the D programming language:
0f12f6bb9739 author notice
Frank Benoit <benoit@tionex.de>
parents: 71
diff changeset
11 * Frank Benoit <benoit@tionex.de>
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
12 *******************************************************************************/
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
13 module dwt.internal.image.PNGFileFormat;
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
15
71
295b29fc7d13 Renamed SWT to DWT
Frank Benoit <benoit@tionex.de>
parents: 59
diff changeset
16 import dwt.DWT;
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
17 import dwt.graphics.ImageData;
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
18 import dwt.graphics.ImageLoaderEvent;
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
19 import dwt.graphics.ImageLoader;
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
20 import dwt.graphics.PaletteData;
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
21 import dwt.internal.Compatibility;
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
22 import dwt.internal.image.FileFormat;
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
23 import dwt.internal.image.PngIhdrChunk;
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
24 import dwt.internal.image.PngPlteChunk;
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
25 import dwt.internal.image.PngChunkReader;
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
26 import dwt.internal.image.PngChunk;
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
27 import dwt.internal.image.PngTrnsChunk;
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
28 import dwt.internal.image.PngIdatChunk;
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
29 import dwt.internal.image.PngEncoder;
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
30 import dwt.internal.image.PngInputStream;
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
31 import dwt.internal.image.PngDecodingDataStream;
200
08789b28bdf3 import dwt.dwthelper.utils now explicit
Frank Benoit <benoit@tionex.de>
parents: 152
diff changeset
32 import dwt.dwthelper.utils;
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
33
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
34 import dwt.dwthelper.BufferedInputStream;
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
35
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
36 import tango.core.Exception;
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
37
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
38 final class PNGFileFormat : FileFormat {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
39 static final int SIGNATURE_LENGTH = 8;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
40 static final int PRIME = 65521;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
41 PngIhdrChunk headerChunk;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
42 PngPlteChunk paletteChunk;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
43 ImageData imageData;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
44 byte[] data;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
45 byte[] alphaPalette;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
46 byte headerByte1;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
47 byte headerByte2;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
48 int adler;
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
49
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
50 /**
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
51 * Skip over signature data. This has already been
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
52 * verified in isFileFormat().
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
53 */
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
54 void readSignature() {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
55 byte[] signature = new byte[SIGNATURE_LENGTH];
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
56 inputStream.read(signature);
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
57 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
58 /**
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
59 * Load the PNG image from the byte stream.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
60 */
152
17f8449522fd overloads second walkthrough
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
61 override ImageData[] loadFromByteStream() {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
62 try {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
63 readSignature();
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
64 PngChunkReader chunkReader = new PngChunkReader(inputStream);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
65 headerChunk = chunkReader.getIhdrChunk();
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
66 int width = headerChunk.getWidth(), height = headerChunk.getHeight();
71
295b29fc7d13 Renamed SWT to DWT
Frank Benoit <benoit@tionex.de>
parents: 59
diff changeset
67 if (width <= 0 || height <= 0) DWT.error(DWT.ERROR_INVALID_IMAGE);
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
68 int imageSize = getAlignedBytesPerRow() * height;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
69 data = new byte[imageSize];
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
70 imageData = ImageData.internal_new(
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
71 width,
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
72 height,
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
73 headerChunk.getSwtBitsPerPixel(),
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
74 new PaletteData(0, 0, 0),
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
75 4,
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
76 data,
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
77 0,
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
78 null,
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
79 null,
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
80 -1,
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
81 -1,
71
295b29fc7d13 Renamed SWT to DWT
Frank Benoit <benoit@tionex.de>
parents: 59
diff changeset
82 DWT.IMAGE_PNG,
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
83 0,
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
84 0,
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
85 0,
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
86 0);
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
87
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
88 if (headerChunk.usesDirectColor()) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
89 imageData.palette = headerChunk.getPaletteData();
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
90 }
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
91
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
92 // Read and process chunks until the IEND chunk is encountered.
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
93 while (chunkReader.hasMoreChunks()) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
94 readNextChunk(chunkReader);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
95 }
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
96
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
97 return [imageData];
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
98 } catch (IOException e) {
71
295b29fc7d13 Renamed SWT to DWT
Frank Benoit <benoit@tionex.de>
parents: 59
diff changeset
99 DWT.error(DWT.ERROR_INVALID_IMAGE);
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
100 return null;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
101 }
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
102 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
103 /**
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
104 * Read and handle the next chunk of data from the
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
105 * PNG file.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
106 */
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
107 void readNextChunk(PngChunkReader chunkReader) {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
108 PngChunk chunk = chunkReader.readNextChunk();
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
109 switch (chunk.getChunkType()) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
110 case PngChunk.CHUNK_IEND:
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
111 break;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
112 case PngChunk.CHUNK_PLTE:
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
113 if (!headerChunk.usesDirectColor()) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
114 paletteChunk = cast(PngPlteChunk) chunk;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
115 imageData.palette = paletteChunk.getPaletteData();
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
116 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
117 break;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
118 case PngChunk.CHUNK_tRNS:
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
119 PngTrnsChunk trnsChunk = cast(PngTrnsChunk) chunk;
131
ee2998e3cfaa replace == and !=
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
120 if (trnsChunk.getTransparencyType(headerChunk) is
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
121 PngTrnsChunk.TRANSPARENCY_TYPE_PIXEL)
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
122 {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
123 imageData.transparentPixel =
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
124 trnsChunk.getSwtTransparentPixel(headerChunk);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
125 } else {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
126 alphaPalette = trnsChunk.getAlphaValues(headerChunk, paletteChunk);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
127 int transparentCount = 0, transparentPixel = -1;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
128 for (int i = 0; i < alphaPalette.length; i++) {
131
ee2998e3cfaa replace == and !=
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
129 if ((alphaPalette[i] & 0xFF) !is 255) {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
130 transparentCount++;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
131 transparentPixel = i;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
132 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
133 }
131
ee2998e3cfaa replace == and !=
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
134 if (transparentCount is 0) {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
135 alphaPalette = null;
131
ee2998e3cfaa replace == and !=
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
136 } else if (transparentCount is 1 && alphaPalette[transparentPixel] is 0) {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
137 alphaPalette = null;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
138 imageData.transparentPixel = transparentPixel;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
139 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
140 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
141 break;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
142 case PngChunk.CHUNK_IDAT:
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
143 if (chunkReader.readPixelData()) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
144 // All IDAT chunks in an image file must be
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
145 // sequential. If the pixel data has already
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
146 // been read and another IDAT block is encountered,
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
147 // then this is an invalid image.
71
295b29fc7d13 Renamed SWT to DWT
Frank Benoit <benoit@tionex.de>
parents: 59
diff changeset
148 DWT.error(DWT.ERROR_INVALID_IMAGE);
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
149 } else {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
150 // Read in the pixel data for the image. This should
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
151 // go through all the image's IDAT chunks.
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
152 PngIdatChunk dataChunk = cast(PngIdatChunk) chunk;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
153 readPixelData(dataChunk, chunkReader);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
154 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
155 break;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
156 default:
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
157 if (chunk.isCritical()) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
158 // All critical chunks must be supported.
71
295b29fc7d13 Renamed SWT to DWT
Frank Benoit <benoit@tionex.de>
parents: 59
diff changeset
159 DWT.error(DWT.ERROR_NOT_IMPLEMENTED);
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
160 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
161 }
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
162 }
152
17f8449522fd overloads second walkthrough
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
163 override void unloadIntoByteStream(ImageLoader loader) {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
164 PngEncoder encoder = new PngEncoder(loader);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
165 encoder.encode(outputStream);
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
166 }
152
17f8449522fd overloads second walkthrough
Frank Benoit <benoit@tionex.de>
parents: 135
diff changeset
167 override bool isFileFormat(LEDataInputStream stream) {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
168 try {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
169 byte[] signature = new byte[SIGNATURE_LENGTH];
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
170 stream.read(signature);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
171 stream.unread(signature);
131
ee2998e3cfaa replace == and !=
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
172 if ((signature[0] & 0xFF) !is 137) return false; //137
ee2998e3cfaa replace == and !=
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
173 if ((signature[1] & 0xFF) !is 80) return false; //P
ee2998e3cfaa replace == and !=
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
174 if ((signature[2] & 0xFF) !is 78) return false; //N
ee2998e3cfaa replace == and !=
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
175 if ((signature[3] & 0xFF) !is 71) return false; //G
ee2998e3cfaa replace == and !=
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
176 if ((signature[4] & 0xFF) !is 13) return false; //<RETURN>
ee2998e3cfaa replace == and !=
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
177 if ((signature[5] & 0xFF) !is 10) return false; //<LINEFEED>
ee2998e3cfaa replace == and !=
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
178 if ((signature[6] & 0xFF) !is 26) return false; //<CTRL/Z>
240
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 200
diff changeset
179 if ((signature[7] & 0xFF) !is 10) return false; //<LINEFEED>
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
180 return true;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
181 } catch (Exception e) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
182 return false;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
183 }
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
184 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
185 /**
71
295b29fc7d13 Renamed SWT to DWT
Frank Benoit <benoit@tionex.de>
parents: 59
diff changeset
186 * DWT does not support 16-bit depths. If this image uses
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
187 * 16-bit depths, convert the data to an 8-bit depth.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
188 */
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
189 byte[] validateBitDepth(byte[] data) {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
190 if (headerChunk.getBitDepth() > 8) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
191 byte[] result = new byte[data.length / 2];
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
192 compress16BitDepthTo8BitDepth(data, 0, result, 0, result.length);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
193 return result;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
194 } else {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
195 return data;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
196 }
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
197 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
198 /**
71
295b29fc7d13 Renamed SWT to DWT
Frank Benoit <benoit@tionex.de>
parents: 59
diff changeset
199 * DWT does not support greyscale as a color type. For
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
200 * plain grayscale, we create a palette. For Grayscale
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
201 * with Alpha, however, we need to convert the pixels
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
202 * to use RGB values.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
203 * Note: This method assumes that the bit depth of the
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
204 * data has already been restricted to 8 or less.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
205 */
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
206 void setPixelData(byte[] data, ImageData imageData) {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
207 switch (headerChunk.getColorType()) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
208 case PngIhdrChunk.COLOR_TYPE_GRAYSCALE_WITH_ALPHA:
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
209 {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
210 int width = imageData.width;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
211 int height = imageData.height;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
212 int destBytesPerLine = imageData.bytesPerLine;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
213 /*
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
214 * If the image uses 16-bit depth, it is converted
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
215 * to an 8-bit depth image.
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
216 */
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
217 int srcBytesPerLine = getAlignedBytesPerRow();
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
218 if (headerChunk.getBitDepth() > 8) srcBytesPerLine /= 2;
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
219
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
220 byte[] rgbData = new byte[destBytesPerLine * height];
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
221 byte[] alphaData = new byte[width * height];
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
222 for (int y = 0; y < height; y++) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
223 int srcIndex = srcBytesPerLine * y;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
224 int destIndex = destBytesPerLine * y;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
225 int destAlphaIndex = width * y;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
226 for (int x = 0; x < width; x++) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
227 byte grey = data[srcIndex];
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
228 byte alpha = data[srcIndex + 1];
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
229 rgbData[destIndex + 0] = grey;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
230 rgbData[destIndex + 1] = grey;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
231 rgbData[destIndex + 2] = grey;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
232 alphaData[destAlphaIndex] = alpha;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
233 srcIndex += 2;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
234 destIndex += 3;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
235 destAlphaIndex++;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
236 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
237 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
238 imageData.data = rgbData;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
239 imageData.alphaData = alphaData;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
240 break;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
241 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
242 case PngIhdrChunk.COLOR_TYPE_RGB_WITH_ALPHA:
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
243 {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
244 int width = imageData.width;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
245 int height = imageData.height;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
246 int destBytesPerLine = imageData.bytesPerLine;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
247 int srcBytesPerLine = getAlignedBytesPerRow();
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
248 /*
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
249 * If the image uses 16-bit depth, it is converted
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
250 * to an 8-bit depth image.
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
251 */
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
252 if (headerChunk.getBitDepth() > 8) srcBytesPerLine /= 2;
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
253
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
254 byte[] rgbData = new byte[destBytesPerLine * height];
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
255 byte[] alphaData = new byte[width * height];
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
256 for (int y = 0; y < height; y++) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
257 int srcIndex = srcBytesPerLine * y;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
258 int destIndex = destBytesPerLine * y;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
259 int destAlphaIndex = width * y;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
260 for (int x = 0; x < width; x++) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
261 rgbData[destIndex + 0] = data[srcIndex + 0];
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
262 rgbData[destIndex + 1] = data[srcIndex + 1];
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
263 rgbData[destIndex + 2] = data[srcIndex + 2];
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
264 alphaData[destAlphaIndex] = data[srcIndex + 3];
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
265 srcIndex += 4;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
266 destIndex += 3;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
267 destAlphaIndex++;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
268 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
269 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
270 imageData.data = rgbData;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
271 imageData.alphaData = alphaData;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
272 break;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
273 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
274 case PngIhdrChunk.COLOR_TYPE_RGB:
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
275 imageData.data = data;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
276 break;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
277 case PngIhdrChunk.COLOR_TYPE_PALETTE:
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
278 imageData.data = data;
131
ee2998e3cfaa replace == and !=
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
279 if (alphaPalette !is null) {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
280 int size = imageData.width * imageData.height;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
281 byte[] alphaData = new byte[size];
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
282 byte[] pixelData = new byte[size];
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
283 imageData.getPixels(0, 0, size, pixelData, 0);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
284 for (int i = 0; i < pixelData.length; i++) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
285 alphaData[i] = alphaPalette[pixelData[i] & 0xFF];
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
286 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
287 imageData.alphaData = alphaData;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
288 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
289 break;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
290 default:
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
291 imageData.data = data;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
292 break;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
293 }
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
294 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
295 /**
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
296 * PNG supports some color types and bit depths that are
71
295b29fc7d13 Renamed SWT to DWT
Frank Benoit <benoit@tionex.de>
parents: 59
diff changeset
297 * unsupported by DWT. If the image uses an unsupported
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
298 * color type (either of the gray scale types) or bit
71
295b29fc7d13 Renamed SWT to DWT
Frank Benoit <benoit@tionex.de>
parents: 59
diff changeset
299 * depth (16), convert the data to an DWT-supported
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
300 * format. Then assign the data into the ImageData given.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
301 */
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
302 void setImageDataValues(byte[] data, ImageData imageData) {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
303 byte[] result = validateBitDepth(data);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
304 setPixelData(result, imageData);
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
305 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
306 /**
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
307 * Read the image data from the data stream. This must handle
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
308 * decoding the data, filtering, and interlacing.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
309 */
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
310 void readPixelData(PngIdatChunk chunk, PngChunkReader chunkReader) {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
311 InputStream stream = new PngInputStream(chunk, chunkReader);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
312 //TEMPORARY CODE
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
313 //PORTING_FIXME
135
311ea7977d1f changed PNG loader to use internal inflating
Frank Benoit <benoit@tionex.de>
parents: 134
diff changeset
314 bool use3_2 = true;//System.getProperty("dwt.internal.image.PNGFileFormat_3.2") !is null;
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
315 InputStream inflaterStream = use3_2 ? null : Compatibility.newInflaterInputStream(stream);
131
ee2998e3cfaa replace == and !=
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
316 if (inflaterStream !is null) {
240
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 200
diff changeset
317 stream = inflaterStream;
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
318 } else {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
319 stream = new PngDecodingDataStream(stream);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
320 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
321 int interlaceMethod = headerChunk.getInterlaceMethod();
131
ee2998e3cfaa replace == and !=
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
322 if (interlaceMethod is PngIhdrChunk.INTERLACE_METHOD_NONE) {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
323 readNonInterlacedImage(stream);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
324 } else {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
325 readInterlacedImage(stream);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
326 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
327 /*
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
328 * InflaterInputStream does not consume all bytes in the stream
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
329 * when it is closed. This may leave unread IDAT chunks. The fix
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
330 * is to read all available bytes before closing it.
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
331 */
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
332 while (stream.available() > 0) stream.read();
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
333 stream.close();
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
334 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
335 /**
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
336 * Answer the number of bytes in a word-aligned row of pixel data.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
337 */
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
338 int getAlignedBytesPerRow() {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
339 return ((getBytesPerRow(headerChunk.getWidth()) + 3) / 4) * 4;
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
340 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
341 /**
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
342 * Answer the number of bytes in each row of the image
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
343 * data. Each PNG row is byte-aligned, so images with bit
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
344 * depths less than a byte may have unused bits at the
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
345 * end of each row. The value of these bits is undefined.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
346 */
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
347 int getBytesPerRow() {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
348 return getBytesPerRow(headerChunk.getWidth());
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
349 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
350 /**
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
351 * Answer the number of bytes needed to represent a pixel.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
352 * This value depends on the image's color type and bit
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
353 * depth.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
354 * Note that this method rounds up if an image's pixel size
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
355 * isn't byte-aligned.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
356 */
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
357 int getBytesPerPixel() {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
358 int bitsPerPixel = headerChunk.getBitsPerPixel();
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
359 return (bitsPerPixel + 7) / 8;
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
360 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
361 /**
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
362 * Answer the number of bytes in a row of the given pixel
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
363 * width. Each row is byte-aligned, so images with bit
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
364 * depths less than a byte may have unused bits at the
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
365 * end of each row. The value of these bits is undefined.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
366 */
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
367 int getBytesPerRow(int rowWidthInPixels) {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
368 int bitsPerPixel = headerChunk.getBitsPerPixel();
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
369 int bitsPerRow = bitsPerPixel * rowWidthInPixels;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
370 int bitsPerByte = 8;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
371 return (bitsPerRow + (bitsPerByte - 1)) / bitsPerByte;
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
372 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
373 /**
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
374 * 1. Read one of the seven frames of interlaced data.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
375 * 2. Update the imageData.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
376 * 3. Notify the image loader's listeners of the frame load.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
377 */
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
378 void readInterlaceFrame(
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
379 InputStream inputStream,
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
380 int rowInterval,
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
381 int columnInterval,
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
382 int startRow,
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
383 int startColumn,
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
384 int frameCount)
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
385 {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
386 int width = headerChunk.getWidth();
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
387 int alignedBytesPerRow = getAlignedBytesPerRow();
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
388 int height = headerChunk.getHeight();
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
389 if (startRow >= height || startColumn >= width) return;
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
390
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
391 int pixelsPerRow = (width - startColumn + columnInterval - 1) / columnInterval;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
392 int bytesPerRow = getBytesPerRow(pixelsPerRow);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
393 byte[] row1 = new byte[bytesPerRow];
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
394 byte[] row2 = new byte[bytesPerRow];
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
395 byte[] currentRow = row1;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
396 byte[] lastRow = row2;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
397 for (int row = startRow; row < height; row += rowInterval) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
398 byte filterType = cast(byte)inputStream.read();
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
399 int read = 0;
131
ee2998e3cfaa replace == and !=
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
400 while (read !is bytesPerRow) {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
401 read += inputStream.read(currentRow, read, bytesPerRow - read);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
402 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
403 filterRow(currentRow, lastRow, filterType);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
404 if (headerChunk.getBitDepth() >= 8) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
405 int bytesPerPixel = getBytesPerPixel();
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
406 int dataOffset = (row * alignedBytesPerRow) + (startColumn * bytesPerPixel);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
407 for (int rowOffset = 0; rowOffset < currentRow.length; rowOffset += bytesPerPixel) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
408 for (int byteOffset = 0; byteOffset < bytesPerPixel; byteOffset++) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
409 data[dataOffset + byteOffset] = currentRow[rowOffset + byteOffset];
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
410 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
411 dataOffset += (columnInterval * bytesPerPixel);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
412 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
413 } else {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
414 int bitsPerPixel = headerChunk.getBitDepth();
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
415 int pixelsPerByte = 8 / bitsPerPixel;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
416 int column = startColumn;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
417 int rowBase = row * alignedBytesPerRow;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
418 int valueMask = 0;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
419 for (int i = 0; i < bitsPerPixel; i++) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
420 valueMask <<= 1;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
421 valueMask |= 1;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
422 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
423 int maxShift = 8 - bitsPerPixel;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
424 for (int byteOffset = 0; byteOffset < currentRow.length; byteOffset++) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
425 for (int bitOffset = maxShift; bitOffset >= 0; bitOffset -= bitsPerPixel) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
426 if (column < width) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
427 int dataOffset = rowBase + (column * bitsPerPixel / 8);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
428 int value = (currentRow[byteOffset] >> bitOffset) & valueMask;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
429 int dataShift = maxShift - (bitsPerPixel * (column % pixelsPerByte));
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
430 data[dataOffset] |= value << dataShift;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
431 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
432 column += columnInterval;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
433 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
434 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
435 }
131
ee2998e3cfaa replace == and !=
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
436 currentRow = (currentRow is row1) ? row2 : row1;
ee2998e3cfaa replace == and !=
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
437 lastRow = (lastRow is row1) ? row2 : row1;
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
438 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
439 setImageDataValues(data, imageData);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
440 fireInterlacedFrameEvent(frameCount);
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
441 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
442 /**
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
443 * Read the pixel data for an interlaced image from the
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
444 * data stream.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
445 */
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
446 void readInterlacedImage(InputStream inputStream) {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
447 readInterlaceFrame(inputStream, 8, 8, 0, 0, 0);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
448 readInterlaceFrame(inputStream, 8, 8, 0, 4, 1);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
449 readInterlaceFrame(inputStream, 8, 4, 4, 0, 2);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
450 readInterlaceFrame(inputStream, 4, 4, 0, 2, 3);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
451 readInterlaceFrame(inputStream, 4, 2, 2, 0, 4);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
452 readInterlaceFrame(inputStream, 2, 2, 0, 1, 5);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
453 readInterlaceFrame(inputStream, 2, 1, 1, 0, 6);
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
454 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
455 /**
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
456 * Fire an event to let listeners know that an interlaced
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
457 * frame has been loaded.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
458 * finalFrame should be true if the image has finished
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
459 * loading, false if there are more frames to come.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
460 */
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
461 void fireInterlacedFrameEvent(int frameCount) {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
462 if (loader.hasListeners()) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
463 ImageData image = cast(ImageData) imageData.clone();
131
ee2998e3cfaa replace == and !=
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
464 bool finalFrame = frameCount is 6;
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
465 loader.notifyListeners(new ImageLoaderEvent(loader, image, frameCount, finalFrame));
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
466 }
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
467 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
468 /**
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
469 * Read the pixel data for a non-interlaced image from the
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
470 * data stream.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
471 * Update the imageData to reflect the new data.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
472 */
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
473 void readNonInterlacedImage(InputStream inputStream) {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
474 int dataOffset = 0;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
475 int alignedBytesPerRow = getAlignedBytesPerRow();
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
476 int bytesPerRow = getBytesPerRow();
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
477 byte[] row1 = new byte[bytesPerRow];
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
478 byte[] row2 = new byte[bytesPerRow];
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
479 byte[] currentRow = row1;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
480 byte[] lastRow = row2;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
481 int height = headerChunk.getHeight();
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
482 for (int row = 0; row < height; row++) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
483 byte filterType = cast(byte)inputStream.read();
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
484 int read = 0;
131
ee2998e3cfaa replace == and !=
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
485 while (read !is bytesPerRow) {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
486 read += inputStream.read(currentRow, read, bytesPerRow - read);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
487 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
488 filterRow(currentRow, lastRow, filterType);
25
fc2b263b8a3f Merged back the System.arraycopy and use a System class
Frank Benoit <benoit@tionex.de>
parents: 14
diff changeset
489 System.arraycopy(currentRow, 0, data, dataOffset, bytesPerRow);
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
490 dataOffset += alignedBytesPerRow;
131
ee2998e3cfaa replace == and !=
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
491 currentRow = (currentRow is row1) ? row2 : row1;
ee2998e3cfaa replace == and !=
Frank Benoit <benoit@tionex.de>
parents: 108
diff changeset
492 lastRow = (lastRow is row1) ? row2 : row1;
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
493 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
494 setImageDataValues(data, imageData);
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
495 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
496 /**
71
295b29fc7d13 Renamed SWT to DWT
Frank Benoit <benoit@tionex.de>
parents: 59
diff changeset
497 * DWT does not support 16-bit depth color formats.
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
498 * Convert the 16-bit data to 8-bit data.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
499 * The correct way to do this is to multiply each
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
500 * 16 bit value by the value:
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
501 * (2^8 - 1) / (2^16 - 1).
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
502 * The fast way to do this is just to drop the low
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
503 * byte of the 16-bit value.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
504 */
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
505 static void compress16BitDepthTo8BitDepth(
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
506 byte[] source,
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
507 int sourceOffset,
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
508 byte[] destination,
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
509 int destinationOffset,
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
510 int numberOfValues)
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
511 {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
512 //double multiplier = (Compatibility.pow2(8) - 1) / (Compatibility.pow2(16) - 1);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
513 for (int i = 0; i < numberOfValues; i++) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
514 int sourceIndex = sourceOffset + (2 * i);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
515 int destinationIndex = destinationOffset + i;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
516 //int value = (source[sourceIndex] << 8) | source[sourceIndex + 1];
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
517 //byte compressedValue = (byte)(value * multiplier);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
518 byte compressedValue = source[sourceIndex];
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
519 destination[destinationIndex] = compressedValue;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
520 }
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
521 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
522 /**
71
295b29fc7d13 Renamed SWT to DWT
Frank Benoit <benoit@tionex.de>
parents: 59
diff changeset
523 * DWT does not support 16-bit depth color formats.
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
524 * Convert the 16-bit data to 8-bit data.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
525 * The correct way to do this is to multiply each
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
526 * 16 bit value by the value:
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
527 * (2^8 - 1) / (2^16 - 1).
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
528 * The fast way to do this is just to drop the low
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
529 * byte of the 16-bit value.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
530 */
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
531 static int compress16BitDepthTo8BitDepth(int value) {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
532 //double multiplier = (Compatibility.pow2(8) - 1) / (Compatibility.pow2(16) - 1);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
533 //byte compressedValue = (byte)(value * multiplier);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
534 return value >> 8;
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
535 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
536 /**
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
537 * PNG supports four filtering types. These types are applied
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
538 * per row of image data. This method unfilters the given row
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
539 * based on the filterType.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
540 */
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
541 void filterRow(byte[] row, byte[] previousRow, int filterType) {
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
542 int byteOffset = headerChunk.getFilterByteOffset();
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
543 switch (filterType) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
544 case PngIhdrChunk.FILTER_NONE:
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
545 break;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
546 case PngIhdrChunk.FILTER_SUB:
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
547 for (int i = byteOffset; i < row.length; i++) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
548 int current = row[i] & 0xFF;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
549 int left = row[i - byteOffset] & 0xFF;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
550 row[i] = cast(byte)((current + left) & 0xFF);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
551 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
552 break;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
553 case PngIhdrChunk.FILTER_UP:
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
554 for (int i = 0; i < row.length; i++) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
555 int current = row[i] & 0xFF;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
556 int above = previousRow[i] & 0xFF;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
557 row[i] = cast(byte)((current + above) & 0xFF);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
558 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
559 break;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
560 case PngIhdrChunk.FILTER_AVERAGE:
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
561 for (int i = 0; i < row.length; i++) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
562 int left = (i < byteOffset) ? 0 : row[i - byteOffset] & 0xFF;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
563 int above = previousRow[i] & 0xFF;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
564 int current = row[i] & 0xFF;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
565 row[i] = cast(byte)((current + ((left + above) / 2)) & 0xFF);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
566 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
567 break;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
568 case PngIhdrChunk.FILTER_PAETH:
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
569 for (int i = 0; i < row.length; i++) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
570 int left = (i < byteOffset) ? 0 : row[i - byteOffset] & 0xFF;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
571 int aboveLeft = (i < byteOffset) ? 0 : previousRow[i - byteOffset] & 0xFF;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
572 int above = previousRow[i] & 0xFF;
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
573
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
574 int a = Math.abs(above - aboveLeft);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
575 int b = Math.abs(left - aboveLeft);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
576 int c = Math.abs(left - aboveLeft + above - aboveLeft);
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
577
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
578 int preductor = 0;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
579 if (a <= b && a <= c) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
580 preductor = left;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
581 } else if (b <= c) {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
582 preductor = above;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
583 } else {
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
584 preductor = aboveLeft;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
585 }
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
586
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
587 int currentValue = row[i] & 0xFF;
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
588 row[i] = cast(byte) ((currentValue + preductor) & 0xFF);
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
589 }
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
590 break;
55
93981635e709 Checked and inserted missing default switch cases.
Frank Benoit <benoit@tionex.de>
parents: 25
diff changeset
591 default:
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
592 }
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
593 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
594
59
8cec8f536af3 All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents: 55
diff changeset
595 }