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

  1. /*
  2.  * @(#)Xpm2Image.java    1.4 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 and its
  7.  * documentation for NON-COMMERCIAL purposes and without fee is hereby
  8.  * granted provided that this copyright notice appears in all copies. Please
  9.  * refer to the file "copyright.html" for further important copyright and
  10.  * licensing information.
  11.  * 
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
  13.  * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  14.  * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
  15.  * OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
  16.  * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR
  17.  * ITS DERIVATIVES.
  18.  */
  19.  
  20. /*-
  21.  *    Reads xpixmap format images into a DIBitmap structure.
  22.  */
  23. package awt;
  24.  
  25. import java.util.*;
  26. import java.io.*;
  27.  
  28. /**
  29.  * Parse x pixmap (XPM2) image files and convert them into device
  30.  * independent bitmaps.
  31.  *
  32.  * @version 1.4 31 Jan 1995
  33.  * @author James Gosling
  34.  */
  35. public class Xpm2Image extends DIBitmap {
  36.  
  37.     public Xpm2Image (String fname) {
  38.     this(new BufferedInputStream(new FileInputStream(fname)));
  39.     }
  40.  
  41.     private int readline(InputStream s, byte dst[]) {
  42.     int c;
  43.     int i = 0;
  44.     while ((c = s.read()) != '\n' && c >= 0)
  45.         if (i < dst.length)
  46.         dst[i++] = (byte) c;
  47.     return i > 0 ? i : c < 0 ? -1 : 0;
  48.     }
  49.  
  50.     public Xpm2Image (InputStream s) {
  51.     byte buf[] = new byte[25];
  52.     int lwidth = 0;
  53.     int c;
  54.     int colors = 0;
  55.     if (readline(s, buf) < 5
  56.         || buf[0] != '!'
  57.         || buf[1] != ' '
  58.         || buf[2] != 'X'
  59.         || buf[3] != 'P'
  60.         || buf[4] != 'M'
  61.         || (lwidth = readline(s, buf)) < 7)
  62.         throw new FileFormatException();
  63.     for (int pos = 0, state = 0, n = 0; pos < lwidth; pos++)
  64.         if ((c = buf[pos]) >= '0' && c <= '9') {
  65.         n = n * 10 + c - '0';
  66.         switch (state) {
  67.           case 0:
  68.             width = n;
  69.             break;
  70.           case 1:
  71.             height = n;
  72.             break;
  73.           case 2:
  74.             colors = n;
  75.             break;
  76.         }
  77.         } else if (c == ' ') {
  78.         n = 0;
  79.         state++;
  80.         } else
  81.         throw new FileFormatException();
  82.     if (width <= 0 || height <= 0 || colors <= 1
  83.         || colors > 128 || width > 3000 || height > 3000)
  84.         throw new FileFormatException();
  85.     red = new byte[colors];
  86.     green = new byte[colors];
  87.     blue = new byte[colors];
  88.     byte trt[] = new byte[128];
  89.     for (int i = 0; i < colors; i++) {
  90.         lwidth = readline(s, buf);
  91.         if (lwidth < 11
  92.             || buf[1] != ' '
  93.             || buf[2] != 'c'
  94.             || buf[3] != ' '
  95.             || buf[4] != '#')
  96.         throw new FileFormatException();
  97.         trt[buf[0] & 0x7F] = (byte) i;
  98.         int swidth = lwidth == 11 ? 2 : 4;
  99.         for (int j = 5, sw = 0, slot = 0, n = 0; j < lwidth; j++) {
  100.         c = buf[j];
  101.         if (c >= '0' && c <= '9')
  102.             c = c - '0';
  103.         else if (c >= 'A' && c <= 'F')
  104.             c = c - 'A' + 10;
  105.         else if (c >= 'a' && c <= 'f')
  106.             c = c - 'a' + 10;
  107.         else {
  108.             throw new FileFormatException();
  109.         }
  110.         if (sw < 2)
  111.             n = (n << 4) | c;
  112.         if (++sw >= swidth) {
  113.             sw = 0;
  114.             switch (slot) {
  115.               case 0:
  116.             red[i] = (byte) n;
  117.             break;
  118.               case 1:
  119.             green[i] = (byte) n;
  120.             break;
  121.               case 2:
  122.             blue[i] = (byte) n;
  123.             break;
  124.             }
  125.             slot++;
  126.             n = 0;
  127.         }
  128.         }
  129.     }
  130.     raster = new byte[width * height];
  131.     num_colors = colors;
  132.     trans_index = -1;
  133.     if (buf.length < width)
  134.         buf = new byte[width];
  135.     int yi = 0;
  136.     for (int y = 0; y < height; y++) {
  137.         lwidth = readline(s, buf);
  138.         if (lwidth > width)
  139.         lwidth = width;
  140.         for (int x = 0; x < lwidth; x++) {
  141.         raster[yi + x] = trt[buf[x] & 0x7F];
  142.         }
  143.         yi += width;
  144.     }
  145.     s.close();
  146.     }
  147.  
  148. }
  149.