view org.eclipse.swt.gtk.linux.x86/src/org/eclipse/swt/internal/image/PngTrnsChunk.d @ 120:536e43f63c81

Comprehensive update for Win32/Linux32 dmd-2.053/dmd-1.068+Tango-r5661 ===D2=== * added [Try]Immutable/Const/Shared templates to work with differenses in D1/D2 instead of version statements used these templates to work with strict type storage rules of dmd-2.053 * com.ibm.icu now also compilable with D2, but not tested yet * small fixes Snippet288 - shared data is in TLS ===Phobos=== * fixed critical bugs in Phobos implemention completely incorrect segfault prone fromStringz (Linux's port ruthless killer) terrible, incorrect StringBuffer realization (StyledText killer) * fixed small bugs as well Snippet72 - misprint in the snippet * implemented missed functionality for Phobos ByteArrayOutputStream implemented (image loading available) formatting correctly works for all DWT's cases As a result, folowing snippets now works with Phobos (Snippet### - what is fixed): Snippet24, 42, 111, 115, 130, 235, 276 - bad string formatting Snippet48, 282 - crash on image loading Snippet163, 189, 211, 213, 217, 218, 222 - crash on copy/cut in StyledText Snippet244 - hang-up ===Tango=== * few changes for the latest Tango trunc-r5661 * few small performance improvments ===General=== * implMissing-s for only one version changed to implMissingInTango/InPhobos * incorrect calls to Format in toString-s fixed * fixed loading \uXXXX characters in ResourceBundle * added good UTF-8 support for StyledText, TextLayout (Win32) and friends UTF functions revised and tested. It is now in java.nonstandard.*Utf modules StyledText and TextLayout (Win32) modules revised for UTF-8 support * removed small diferences in most identical files in *.swt.* folders *.swt.internal.image, *.swt.events and *.swt.custom are identical in Win32/Linux32 now 179 of 576 (~31%) files in *.swt.* folders are fully identical * Win32: snippets now have right subsystem, pretty icons and native system style controls * small fixes in snippets Snippet44 - it's not Snippet44 Snippet212 - functions work with different images and offsets arrays Win32: Snippet282 - crash on close if the button has an image Snippet293 - setGrayed is commented and others Win32: As a result, folowing snippets now works Snippet68 - color doesn't change Snippet163, 189, 211, 213, 217, 218, 222 - UTF-8 issues (see above) Snippet193 - no tabel headers
author Denis Shelomovskij <verylonglogin.reg@gmail.com>
date Sat, 09 Jul 2011 15:50:20 +0300
parents f713da8bc051
children
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
 * Port to the D programming language:
 *     Frank Benoit <benoit@tionex.de>
 *******************************************************************************/
module org.eclipse.swt.internal.image.PngTrnsChunk;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.internal.image.PngChunk;
import org.eclipse.swt.internal.image.PNGFileFormat;
import org.eclipse.swt.internal.image.PngFileReadState;
import org.eclipse.swt.internal.image.PngIhdrChunk;
import org.eclipse.swt.internal.image.PngPlteChunk;

public class PngTrnsChunk : PngChunk {

    alias PngChunk.validate validate;

    static const int TRANSPARENCY_TYPE_PIXEL = 0;
    static const int TRANSPARENCY_TYPE_ALPHAS = 1;
    static const int RGB_DATA_LENGTH = 6;

this(RGB rgb) {
    super(RGB_DATA_LENGTH);
    setType(TYPE_tRNS);
    setInt16(DATA_OFFSET, rgb.red);
    setInt16(DATA_OFFSET + 2, rgb.green);
    setInt16(DATA_OFFSET + 4, rgb.blue);
    setCRC(computeCRC());
}

this(byte[] reference){
    super(reference);
}

override int getChunkType() {
    return CHUNK_tRNS;
}

void validateLength(PngIhdrChunk header, PngPlteChunk paletteChunk) {
    bool valid;
    switch (header.getColorType()) {
        case PngIhdrChunk.COLOR_TYPE_RGB:
            // Three 2-byte values (RGB)
            valid = getLength() is 6;
            break;
        case PngIhdrChunk.COLOR_TYPE_PALETTE:
            // Three 2-byte values (RGB)
            valid = getLength() <= paletteChunk.getLength();
            break;
        case PngIhdrChunk.COLOR_TYPE_GRAYSCALE:
            // One 2-byte value
            valid = getLength() is 2;
            break;
        // Cannot use both Alpha and tRNS
        case PngIhdrChunk.COLOR_TYPE_RGB_WITH_ALPHA:
        case PngIhdrChunk.COLOR_TYPE_GRAYSCALE_WITH_ALPHA:
        default:
            valid = false;
    }
    if (!valid) {
        SWT.error(SWT.ERROR_INVALID_IMAGE);
    }
}

/**
 * Answer whether the chunk is a valid tRNS chunk.
 */
void validate(PngFileReadState readState, PngIhdrChunk headerChunk, PngPlteChunk paletteChunk) {
    if (!readState.readIHDR
        || (headerChunk.getMustHavePalette() && !readState.readPLTE)
        || readState.readIDAT
        || readState.readIEND)
    {
        SWT.error(SWT.ERROR_INVALID_IMAGE);
    } else {
        readState.readTRNS = true;
    }

    validateLength(headerChunk, paletteChunk);

    super.validate(readState, headerChunk);
}


int getTransparencyType(PngIhdrChunk header) {
    if (header.getColorType() is PngIhdrChunk.COLOR_TYPE_PALETTE) {
        return TRANSPARENCY_TYPE_ALPHAS;
    }
    return TRANSPARENCY_TYPE_PIXEL;
}

/**
 * Answer the transparent pixel RGB value.
 * This is not valid for palette color types.
 * This is not valid for alpha color types.
 * This will convert a grayscale value into
 * a palette index.
 * It will compress a 6 byte RGB into a 3 byte
 * RGB.
 */
int getSwtTransparentPixel(PngIhdrChunk header) {
    switch (header.getColorType()) {
        case PngIhdrChunk.COLOR_TYPE_GRAYSCALE:
            int gray = ((reference[DATA_OFFSET] & 0xFF) << 8)
                + (reference[DATA_OFFSET + 1] & 0xFF);
            if (header.getBitDepth() > 8) {
                return PNGFileFormat.compress16BitDepthTo8BitDepth(gray);
            }
            return gray & 0xFF;
        case PngIhdrChunk.COLOR_TYPE_RGB:
            int red = ((reference[DATA_OFFSET] & 0xFF) << 8)
                | (reference[DATA_OFFSET + 1] & 0xFF);
            int green = ((reference[DATA_OFFSET + 2] & 0xFF) << 8)
                | (reference[DATA_OFFSET + 3] & 0xFF);
            int blue = ((reference[DATA_OFFSET + 4] & 0xFF) << 8)
                | (reference[DATA_OFFSET + 5] & 0xFF);
            if (header.getBitDepth() > 8) {
                red = PNGFileFormat.compress16BitDepthTo8BitDepth(red);
                green = PNGFileFormat.compress16BitDepthTo8BitDepth(green);
                blue = PNGFileFormat.compress16BitDepthTo8BitDepth(blue);
            }
            return (red << 16) | (green << 8) | blue;
        default:
            SWT.error(SWT.ERROR_INVALID_IMAGE);
            return -1;
    }
}

/**
 * Answer an array of Alpha values that correspond to the
 * colors in the palette.
 * This is only valid for the COLOR_TYPE_PALETTE color type.
 */
byte[] getAlphaValues(PngIhdrChunk header, PngPlteChunk paletteChunk) {
    if (header.getColorType() !is PngIhdrChunk.COLOR_TYPE_PALETTE) {
        SWT.error(SWT.ERROR_INVALID_IMAGE);
    }
    byte[] alphas = new byte[paletteChunk.getPaletteSize()];
    int dataLength = getLength();
    int i = 0;
    for (i = 0; i < dataLength; i++) {
        alphas[i] = reference[DATA_OFFSET + i];
    }
    /**
     * Any palette entries which do not have a corresponding
     * alpha value in the tRNS chunk are spec'd to have an
     * alpha of 255.
     */
    for (int j = i; j < alphas.length; j++) {
        alphas[j] = cast(byte) 255;
    }
    return alphas;
}
}