xbmimagedecoder.java

来自「This is a resource based on j2me embedde」· Java 代码 · 共 180 行

JAVA
180
字号
/* * @(#)XbmImageDecoder.java	1.20 06/10/10 * * Copyright  1990-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER *  * This program 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.  *  * This program 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 at /legal/license.txt).  *  * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.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}; *  * @version 1.15 08/19/02 * @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);    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?