178 lines · 6.5 KB · Java
RawDownload
/* * Copyright (c) 1995, 2003, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.  Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /*- *      Reads xbitmap format images into a DIBitmap structure. */package sun.awt.image; import java.io.*;import java.awt.image.*; /** * Parse files of the form: * * #define foo_width w * #define foo_height h * static char foo_bits[] = { * 0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn, * 0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn, * 0xnn,0xnn,0xnn,0xnn}; * * @author James Gosling */public class XbmImageDecoder extends ImageDecoder {    private static byte XbmColormap[] = {(byte) 255, (byte) 255, (byte) 255,                                         0, 0, 0};    private static int XbmHints = (ImageConsumer.TOPDOWNLEFTRIGHT |                                   ImageConsumer.COMPLETESCANLINES |                                   ImageConsumer.SINGLEPASS |                                   ImageConsumer.SINGLEFRAME);     public XbmImageDecoder(InputStreamImageSource src, InputStream is) {        super(src, is);        if (!(input instanceof BufferedInputStream)) {            // If the topmost stream is a metered stream,            // we take forever to decode the image...            input = new BufferedInputStream(input, 80);        }    }      /**     * An error has occurred. Throw an exception.     */    private static void error(String s1) throws ImageFormatException {        throw new ImageFormatException(s1);    }     /**     * produce an image from the stream.     */    public void produceImage() throws IOException, ImageFormatException {        char nm[] = new char[80];        int c;        int i = 0;        int state = 0;        int H = 0;        int W = 0;        int x = 0;        int y = 0;        boolean start = true;        byte raster[] = null;        IndexColorModel model = null;        while (!aborted && (c = input.read()) != -1) {            if ('a' <= c && c <= 'z' ||                    'A' <= c && c <= 'Z' ||                    '0' <= c && c <= '9' || c == '#' || c == '_') {                if (i < 78)                    nm[i++] = (char) c;            } else if (i > 0) {                int nc = i;                i = 0;                if (start) {                    if (nc != 7 ||                        nm[0] != '#' ||                        nm[1] != 'd' ||                        nm[2] != 'e' ||                        nm[3] != 'f' ||                        nm[4] != 'i' ||                        nm[5] != 'n' ||                        nm[6] != 'e')                    {                        error("Not an XBM file");                    }                    start = false;                }                if (nm[nc - 1] == 'h')                    state = 1;  /* expecting width */                else if (nm[nc - 1] == 't' && nc > 1 && nm[nc - 2] == 'h')                    state = 2;  /* expecting height */                else if (nc > 2 && state < 0 && nm[0] == '0' && nm[1] == 'x') {                    int n = 0;                    for (int p = 2; p < nc; p++) {                        c = nm[p];                        if ('0' <= c && c <= '9')                            c = c - '0';                        else if ('A' <= c && c <= 'Z')                            c = c - 'A' + 10;                        else if ('a' <= c && c <= 'z')                            c = c - 'a' + 10;                        else                            c = 0;                        n = n * 16 + c;                    }                    for (int mask = 1; mask <= 0x80; mask <<= 1) {                        if (x < W) {                            if ((n & mask) != 0)                                raster[x] = 1;                            else                                raster[x] = 0;                        }                        x++;                    }                    if (x >= W) {                        if (setPixels(0, y, W, 1, model, raster, 0, W) <= 0) {                            return;                        }                        x = 0;                        if (y++ >= H) {                            break;                        }                    }                } else {                    int n = 0;                    for (int p = 0; p < nc; p++)                        if ('0' <= (c = nm[p]) && c <= '9')                            n = n * 10 + c - '0';                        else {                            n = -1;                            break;                        }                    if (n > 0 && state > 0) {                        if (state == 1)                            W = n;                        else                            H = n;                        if (W == 0 || H == 0)                            state = 0;                        else {                            model = new IndexColorModel(8, 2, XbmColormap,                                                        0, false, 0);                            setDimensions(W, H);                            setColorModel(model);                            setHints(XbmHints);                            headerComplete();                            raster = new byte[W];                            state = -1;                        }                    }                }            }        }        input.close();        imageComplete(ImageConsumer.STATICIMAGEDONE, true);    }}