view dwt/internal/image/PngChunkReader.d @ 7:e831403a80a9

Add 'cast' to casts
author Frank Benoit <benoit@tionex.de>
date Wed, 27 Aug 2008 14:30:35 +0200
parents 1a8b3cb347e0
children 5123b17c98ef
line wrap: on
line source

/*******************************************************************************
 * 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;
    
this(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 = cast(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:
            (cast(PngTrnsChunk) chunk).validate(readState, headerChunk, paletteChunk);
            break;
        case PngChunk.CHUNK_PLTE:
            chunk.validate(readState, headerChunk);
            paletteChunk = cast(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;
}

}