1:
37:
38:
39: package ;
40:
41: import ;
42: import ;
43: import ;
44: import ;
45: import ;
46: import ;
47: import ;
48: import ;
49: import ;
50: import ;
51:
52: public class XBMDecoder extends ImageDecoder
53: {
54: BufferedReader reader;
55: static final ColorModel cm = ColorModel.getRGBdefault ();
56: static final int black = 0xff000000;
57: static final int transparent = 0x00000000;
58: static final int masktable[] = { 0x01, 0x02, 0x04, 0x08,
59: 0x10, 0x20, 0x40, 0x80 };
60:
61: public XBMDecoder (String filename)
62: {
63: super (filename);
64: }
65:
66: public XBMDecoder (URL url)
67: {
68: super (url);
69: }
70:
71: public void produce (Vector v, InputStream is) throws IOException
72: {
73: reader = new BufferedReader (new InputStreamReader (is));
74: int width = -1, height = -1;
75:
76: for (int i = 0; i < 2; i++)
77: {
78: String line = reader.readLine ();
79: StringTokenizer st = new StringTokenizer (line);
80:
81: st.nextToken ();
82: st.nextToken ();
83: if (i == 0)
84: width = Integer.parseInt (st.nextToken (), 10);
85: else
86: height = Integer.parseInt (st.nextToken (), 10);
87: }
88:
89: for (int i = 0; i < v.size (); i++)
90: {
91: ImageConsumer ic = (ImageConsumer) v.elementAt (i);
92:
93: ic.setDimensions (width, height);
94: ic.setColorModel (cm);
95: ic.setHints (ImageConsumer.COMPLETESCANLINES
96: | ImageConsumer.SINGLEFRAME
97: | ImageConsumer.SINGLEPASS
98: | ImageConsumer.TOPDOWNLEFTRIGHT);
99: }
100:
101:
102: while (reader.read () != '{') { }
103:
104:
105: for (int line = 0; line < height; line++)
106: {
107: int scanline[] = getScanline (reader, width);
108:
109: for (int i = 0; i < v.size (); i++)
110: {
111: ImageConsumer ic = (ImageConsumer) v.elementAt (i);
112: ic.setPixels (0, 0 + line, width, 1, cm, scanline, 0, width);
113: }
114: }
115:
116:
117: for (int i = 0; i < v.size (); i++)
118: {
119: ImageConsumer ic = (ImageConsumer) v.elementAt (i);
120: ic.imageComplete (ImageConsumer.STATICIMAGEDONE);
121: }
122: }
123:
124: public static int[] getScanline (Reader in, int len) throws IOException
125: {
126: char byteStr[] = new char[2];
127: int scanline[] = new int[len];
128: int x = 0;
129:
130: while (x < len)
131: {
132: int ch = in.read ();
133: if (ch == '0')
134: {
135: in.read ();
136:
137: byteStr[0] = (char) in.read ();
138: byteStr[1] = (char) in.read ();
139:
140: int byteVal = Integer.parseInt (new String (byteStr), 16);
141:
142: for (int i = 0; i < 8; i++, x++)
143: {
144: if (x == len)
145: return scanline;
146:
147: scanline[x] = ((byteVal & masktable[i]) != 0) ?
148: black : transparent;
149: }
150: }
151: }
152:
153: return scanline;
154: }
155: }