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