Mercurial > projects > dwt-mac
diff dwt/internal/image/PngChunkReader.d @ 0:380af2bdd8e5
Upload of whole dwt tree
author | Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com> |
---|---|
date | Sat, 09 Aug 2008 17:00:02 +0200 |
parents | |
children | 1a8b3cb347e0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dwt/internal/image/PngChunkReader.d Sat Aug 09 17:00:02 2008 +0200 @@ -0,0 +1,72 @@ +/******************************************************************************* + * Copyright (c) 2000, 2006 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +module dwt.internal.image; + + +import dwt.DWT; + +public class PngChunkReader { + LEDataInputStream inputStream; + PngFileReadState readState; + PngIhdrChunk headerChunk; + PngPlteChunk paletteChunk; + +PngChunkReader(LEDataInputStream inputStream) { + this.inputStream = inputStream; + readState = new PngFileReadState(); + headerChunk = null; +} + +PngIhdrChunk getIhdrChunk() { + if (headerChunk is null) { + try { + PngChunk chunk = PngChunk.readNextFromStream(inputStream); + if (chunk is null) DWT.error(DWT.ERROR_INVALID_IMAGE); + headerChunk = (PngIhdrChunk) chunk; + headerChunk.validate(readState, null); + } catch (ClassCastException e) { + DWT.error(DWT.ERROR_INVALID_IMAGE); + } + } + return headerChunk; +} + +PngChunk readNextChunk() { + if (headerChunk is null) return getIhdrChunk(); + + PngChunk chunk = PngChunk.readNextFromStream(inputStream); + if (chunk is null) DWT.error(DWT.ERROR_INVALID_IMAGE); + switch (chunk.getChunkType()) { + case PngChunk.CHUNK_tRNS: + ((PngTrnsChunk) chunk).validate(readState, headerChunk, paletteChunk); + break; + case PngChunk.CHUNK_PLTE: + chunk.validate(readState, headerChunk); + paletteChunk = (PngPlteChunk) chunk; + break; + default: + chunk.validate(readState, headerChunk); + } + if (readState.readIDAT && !(chunk.getChunkType() is PngChunk.CHUNK_IDAT)) { + readState.readPixelData = true; + } + return chunk; +} + +bool readPixelData() { + return readState.readPixelData; +} + +bool hasMoreChunks() { + return !readState.readIEND; +} + +}