home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1995 November / PCWK1195.iso / inne / win95 / sieciowe / hotja32.lzh / hotjava / classsrc / awt / xbmimage.java < prev    next >
Text File  |  1995-08-11  |  4KB  |  152 lines

  1. /*
  2.  * @(#)XbmImage.java    1.10 95/01/31 James Gosling
  3.  *
  4.  * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Permission to use, copy, modify, and distribute this software
  7.  * and its documentation for NON-COMMERCIAL purposes and without
  8.  * fee is hereby granted provided that this copyright notice
  9.  * appears in all copies. Please refer to the file "copyright.html"
  10.  * for further important copyright and licensing information.
  11.  *
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
  13.  * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
  14.  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  15.  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
  16.  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  17.  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
  18.  */
  19.  
  20. /*-
  21.  *    Reads xbitmap format images into a DIBitmap structure.
  22.  */
  23. package awt;
  24.  
  25. import java.util.*;
  26. import java.io.*;
  27.  
  28. /**
  29.  * Parse files of the form:
  30.  * 
  31.  * #define foo_width w
  32.  * #define foo_height h
  33.  * static char foo_bits[] = {
  34.  * 0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,
  35.  * 0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,0xnn,
  36.  * 0xnn,0xnn,0xnn,0xnn};
  37.  * 
  38.  * @version 1.10 31 Jan 1995
  39.  * @author James Gosling
  40.  */
  41. public class XbmImage extends DIBitmap {
  42.  
  43.     private static final boolean verbose = true;
  44.     private static final int BUFSIZE = 1024;
  45.  
  46.     private static void error(String s1) {
  47.     throw new Exception(s1);
  48.     }
  49.  
  50.     public XbmImage (String fname) {
  51.     this(new BufferedInputStream(new FileInputStream(fname), BUFSIZE));
  52.     }
  53.  
  54.     public XbmImage (InputStream s) {
  55.     char nm[] = new char[80];
  56.     int c;
  57.     int i = 0;
  58.     int state = 0;
  59.     int H = 0;
  60.     int W = 0;
  61.     int x = 0;
  62.     int y = 0;
  63.     boolean start = true;
  64.     int rpos = 0;
  65.     while ((c = s.read()) != -1) {
  66.         if ('a' <= c && c <= 'z' ||
  67.             'A' <= c && c <= 'Z' ||
  68.             '0' <= c && c <= '9' || c == '#' || c == '_') {
  69.         if (i < 78)
  70.             nm[i++] = (char) c;
  71.         } else if (i > 0) {
  72.         int nc = i;
  73.         i = 0;
  74.         if (start) {
  75.             if (nc != 7 ||
  76.             nm[0] != '#' ||
  77.             nm[1] != 'd' ||
  78.             nm[2] != 'e' ||
  79.             nm[3] != 'f' ||
  80.             nm[4] != 'i' ||
  81.             nm[5] != 'n' ||
  82.             nm[6] != 'e')
  83.             throw new FileFormatException("Not an XBM file");
  84.             start = false;
  85.         }
  86.         if (nm[nc - 1] == 'h')
  87.             state = 1;    /* expecting width */
  88.         else if (nm[nc - 1] == 't' && nc > 1 && nm[nc - 2] == 'h')
  89.             state = 2;    /* expecting height */
  90.         else if (nc > 2 && state < 0 && nm[0] == '0' && nm[1] == 'x') {
  91.             int n = 0;
  92.             for (int p = 2; p < nc; p++) {
  93.             c = nm[p];
  94.             if ('0' <= c && c <= '9')
  95.                 c = c - '0';
  96.             else if ('A' <= c && c <= 'Z')
  97.                 c = c - 'A' + 10;
  98.             else if ('a' <= c && c <= 'z')
  99.                 c = c - 'a' + 10;
  100.             else
  101.                 c = 0;
  102.             n = n * 16 + c;
  103.             }
  104.             for (int mask = 1; mask <= 0x80; mask <<= 1) {
  105.             if (x < W) {
  106.                 if ((n & mask) != 0)
  107.                 raster[rpos] = 1;
  108.                 rpos++;
  109.             }
  110.             x++;
  111.             }
  112.             if (x >= W) {
  113.             x = 0;
  114.             y++;
  115.             }
  116.         } else {
  117.             int n = 0;
  118.             for (int p = 0; p < nc; p++)
  119.             if ('0' <= (c = nm[p]) && c <= '9')
  120.                 n = n * 10 + c - '0';
  121.             else {
  122.                 n = -1;
  123.                 break;
  124.             }
  125.             if (n > 0 && state > 0) {
  126.             if (state == 1)
  127.                 W = n;
  128.             else
  129.                 H = n;
  130.             if (W == 0 || H == 0)
  131.                 state = 0;
  132.             else {
  133.                 raster = new byte[W * H];
  134.                 red = new byte[2];
  135.                 green = red;
  136.                 blue = red;
  137.                 red[0] = (byte) 255;
  138.                 red[1] = 0;
  139.                 width = W;
  140.                 height = H;
  141.                 num_colors = 2;
  142.                 state = -1;
  143.             }
  144.             }
  145.         }
  146.         }
  147.     }
  148.     s.close();
  149.     }
  150.  
  151. }
  152.