bits2pixels.c revision 6df26cac
1/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/vmware/bits2pixels.c,v 1.1 2001/04/05 19:29:43 dawes Exp $ */
2/* **********************************************************
3 * Copyright (C) 1999-2001 VMware, Inc.
4 * All Rights Reserved
5 * **********************************************************/
6#ifdef VMX86_DEVEL
7char rcsId_bits2pixels[] = "Id: bits2pixels.c,v 1.6 2001/01/26 23:32:15 yoel Exp $";
8#else
9#define FILECODE "F(814)"
10#endif
11
12#ifdef HAVE_CONFIG_H
13#include "config.h"
14#endif
15
16/*
17 * bits2pixels.c --
18 *
19 *      Emulation routines to convert bitmaps to pixmaps
20 */
21
22#include "vm_basic_types.h"
23#include "bits2pixels.h"
24
25
26/*
27 *  Local functions
28 */
29
30static void RasterBitsToPixels8(uint8 *bits, uint32 bits_increment,
31			 uint8 *pix, uint32 pix_increment,
32			 uint32 width, uint32 height, uint32 fg, uint32 bg);
33
34static void RasterBitsToPixels16(uint8 *bits, uint32 bits_increment,
35			  uint8 *pix, uint32 pix_increment,
36			  uint32 width, uint32 height, uint32 fg, uint32 bg);
37
38static void RasterBitsToPixels24(uint8 *bits, uint32 bits_increment,
39			  uint8 *pix, uint32 pix_increment,
40			  uint32 width, uint32 height, uint32 fg, uint32 bg);
41
42static void RasterBitsToPixels32(uint8 *bits, uint32 bits_increment,
43			  uint8 *pix, uint32 pix_increment,
44			  uint32 width, uint32 height, uint32 fg, uint32 bg);
45
46
47/*
48 *----------------------------------------------------------------------
49 *
50 * vmwareRaster_BitsToPixels --
51 *
52 *	Convert a bitmap to a pixmap, converting 1 bits to the foreground
53 *      color (fg) and 0 bits to the background color (bg).
54 *
55 * Results:
56 *      Pixmap filled with pixels
57 *
58 * Side effects:
59 *	None
60 *
61 *----------------------------------------------------------------------
62 */
63
64void
65vmwareRaster_BitsToPixels(uint8 *bits, uint32 bits_increment,
66		    uint8 *pix, uint32 pix_increment, int bytes_per_pixel,
67		    uint32 width, uint32 height, uint32 fg, uint32 bg)
68{
69   switch (bytes_per_pixel) {
70      case 1:
71	 RasterBitsToPixels8(bits, bits_increment, pix, pix_increment,
72			     width, height, fg, bg);
73	 break;
74
75      case 2:
76	 RasterBitsToPixels16(bits, bits_increment, pix, pix_increment,
77			      width, height, fg, bg);
78	 break;
79
80      case 3:
81	 RasterBitsToPixels24(bits, bits_increment, pix, pix_increment,
82			      width, height, fg, bg);
83	 break;
84
85      case 4:
86	 RasterBitsToPixels32(bits, bits_increment, pix, pix_increment,
87			      width, height, fg, bg);
88	 break;
89   }
90}
91
92
93/*
94 *----------------------------------------------------------------------
95 *
96 * RasterBitsToPixels8 --
97 *
98 *	Convert a bitmap to a pixmap, converting 1 bits to the foreground
99 *      color (fg) and 0 bits to the background color (bg), for an 8-bit
100 *	pixmap
101 *
102 * Results:
103 *      Pixmap filled with pixels
104 *
105 * Side effects:
106 *	None
107 *
108 *----------------------------------------------------------------------
109 */
110
111void
112RasterBitsToPixels8(uint8 *bits, uint32 bits_increment,
113		    uint8 *pix, uint32 pix_increment,
114		    uint32 width, uint32 height, uint32 fg, uint32 bg)
115{
116   uint8 *lpix, *lbits;
117   int i, j;
118   uint32 expbits = 0;		 /* Bits to be expanded */
119
120   for (i=0; i<height; i++) {
121      lpix = pix;
122      lbits = bits;
123      for (j = width ; j > 0; j -= 4) {
124	 expbits = (*lbits >> 4) & 0x0f;
125
126	 if (j < 4)
127	    break;
128
129	 switch (expbits) {
130	 case 0:
131	    *lpix++ = bg;
132	    *lpix++ = bg;
133	    *lpix++ = bg;
134	    *lpix++ = bg;
135	    break;
136	 case 1:
137	    *lpix++ = bg;
138	    *lpix++ = bg;
139	    *lpix++ = bg;
140	    *lpix++ = fg;
141	    break;
142	 case 2:
143	    *lpix++ = bg;
144	    *lpix++ = bg;
145	    *lpix++ = fg;
146	    *lpix++ = bg;
147	    break;
148	 case 3:
149	    *lpix++ = bg;
150	    *lpix++ = bg;
151	    *lpix++ = fg;
152	    *lpix++ = fg;
153	    break;
154	 case 4:
155	    *lpix++ = bg;
156	    *lpix++ = fg;
157	    *lpix++ = bg;
158	    *lpix++ = bg;
159	    break;
160	 case 5:
161	    *lpix++ = bg;
162	    *lpix++ = fg;
163	    *lpix++ = bg;
164	    *lpix++ = fg;
165	    break;
166	 case 6:
167	    *lpix++ = bg;
168	    *lpix++ = fg;
169	    *lpix++ = fg;
170	    *lpix++ = bg;
171	    break;
172	 case 7:
173	    *lpix++ = bg;
174	    *lpix++ = fg;
175	    *lpix++ = fg;
176	    *lpix++ = fg;
177	    break;
178	 case 8:
179	    *lpix++ = fg;
180	    *lpix++ = bg;
181	    *lpix++ = bg;
182	    *lpix++ = bg;
183	    break;
184	 case 9:
185	    *lpix++ = fg;
186	    *lpix++ = bg;
187	    *lpix++ = bg;
188	    *lpix++ = fg;
189	    break;
190	 case 10:
191	    *lpix++ = fg;
192	    *lpix++ = bg;
193	    *lpix++ = fg;
194	    *lpix++ = bg;
195	    break;
196	 case 11:
197	    *lpix++ = fg;
198	    *lpix++ = bg;
199	    *lpix++ = fg;
200	    *lpix++ = fg;
201	    break;
202	 case 12:
203	    *lpix++ = fg;
204	    *lpix++ = fg;
205	    *lpix++ = bg;
206	    *lpix++ = bg;
207	    break;
208	 case 13:
209	    *lpix++ = fg;
210	    *lpix++ = fg;
211	    *lpix++ = bg;
212	    *lpix++ = fg;
213	    break;
214	 case 14:
215	    *lpix++ = fg;
216	    *lpix++ = fg;
217	    *lpix++ = fg;
218	    *lpix++ = bg;
219	    break;
220	 case 15:
221	    *lpix++ = fg;
222	    *lpix++ = fg;
223	    *lpix++ = fg;
224	    *lpix++ = fg;
225	    break;
226	 }
227
228	 expbits = *lbits & 0x0f;
229
230	 j -= 4;
231	 if (j < 4) {
232	    break;
233	 }
234
235	 switch (expbits) {
236	 case 0:
237	    *lpix++ = bg;
238	    *lpix++ = bg;
239	    *lpix++ = bg;
240	    *lpix++ = bg;
241	    break;
242	 case 1:
243	    *lpix++ = bg;
244	    *lpix++ = bg;
245	    *lpix++ = bg;
246	    *lpix++ = fg;
247	    break;
248	 case 2:
249	    *lpix++ = bg;
250	    *lpix++ = bg;
251	    *lpix++ = fg;
252	    *lpix++ = bg;
253	    break;
254	 case 3:
255	    *lpix++ = bg;
256	    *lpix++ = bg;
257	    *lpix++ = fg;
258	    *lpix++ = fg;
259	    break;
260	 case 4:
261	    *lpix++ = bg;
262	    *lpix++ = fg;
263	    *lpix++ = bg;
264	    *lpix++ = bg;
265	    break;
266	 case 5:
267	    *lpix++ = bg;
268	    *lpix++ = fg;
269	    *lpix++ = bg;
270	    *lpix++ = fg;
271	    break;
272	 case 6:
273	    *lpix++ = bg;
274	    *lpix++ = fg;
275	    *lpix++ = fg;
276	    *lpix++ = bg;
277	    break;
278	 case 7:
279	    *lpix++ = bg;
280	    *lpix++ = fg;
281	    *lpix++ = fg;
282	    *lpix++ = fg;
283	    break;
284	 case 8:
285	    *lpix++ = fg;
286	    *lpix++ = bg;
287	    *lpix++ = bg;
288	    *lpix++ = bg;
289	    break;
290	 case 9:
291	    *lpix++ = fg;
292	    *lpix++ = bg;
293	    *lpix++ = bg;
294	    *lpix++ = fg;
295	    break;
296	 case 10:
297	    *lpix++ = fg;
298	    *lpix++ = bg;
299	    *lpix++ = fg;
300	    *lpix++ = bg;
301	    break;
302	 case 11:
303	    *lpix++ = fg;
304	    *lpix++ = bg;
305	    *lpix++ = fg;
306	    *lpix++ = fg;
307	    break;
308	 case 12:
309	    *lpix++ = fg;
310	    *lpix++ = fg;
311	    *lpix++ = bg;
312	    *lpix++ = bg;
313	    break;
314	 case 13:
315	    *lpix++ = fg;
316	    *lpix++ = fg;
317	    *lpix++ = bg;
318	    *lpix++ = fg;
319	    break;
320	 case 14:
321	    *lpix++ = fg;
322	    *lpix++ = fg;
323	    *lpix++ = fg;
324	    *lpix++ = bg;
325	    break;
326	 case 15:
327	    *lpix++ = fg;
328	    *lpix++ = fg;
329	    *lpix++ = fg;
330	    *lpix++ = fg;
331	    break;
332	 }
333	 lbits++;
334      }
335
336      if (j > 0) {
337	 *lpix++ = (expbits & 0x08) ? fg : bg;
338	 j--;
339	 if (j > 0) {
340	    *lpix++ = (expbits & 0x04) ? fg : bg;
341	    j--;
342	    if (j > 0) {
343	       *lpix++ = (expbits & 0x02) ? fg : bg;
344	       j--;
345	    }
346	 }
347      }
348
349      pix += pix_increment;
350      bits += bits_increment;
351   }
352   return;
353}
354
355
356/*
357 *----------------------------------------------------------------------
358 *
359 * RasterBitsToPixels16 --
360 *
361 *	Convert a bitmap to a pixmap, converting 1 bits to the foreground
362 *      color (fg) and 0 bits to the background color (bg), for a 16-bit
363 *	pixmap
364 *
365 * Results:
366 *      Pixmap filled with pixels
367 *
368 * Side effects:
369 *	None
370 *
371 *----------------------------------------------------------------------
372 */
373
374void
375RasterBitsToPixels16(uint8 *bits, uint32 bits_increment,
376		     uint8 *pix, uint32 pix_increment,
377		     uint32 width, uint32 height, uint32 fg, uint32 bg)
378{
379   uint16 *lpix;
380   uint8 *lbits;
381   int i, j;
382   uint32 expbits = 0;		 /* Bits to be expanded */
383
384   for (i=0; i<height; i++) {
385      lpix = (uint16 *)pix;
386      lbits = bits;
387      for (j = width; j > 0; j -= 4) {
388	 expbits = (*lbits >> 4) & 0x0f;
389
390	 if (j < 4)
391	    break;
392
393	 switch (expbits) {
394	 case 0:
395	    *lpix++ = bg;
396	    *lpix++ = bg;
397	    *lpix++ = bg;
398	    *lpix++ = bg;
399	    break;
400	 case 1:
401	    *lpix++ = bg;
402	    *lpix++ = bg;
403	    *lpix++ = bg;
404	    *lpix++ = fg;
405	    break;
406	 case 2:
407	    *lpix++ = bg;
408	    *lpix++ = bg;
409	    *lpix++ = fg;
410	    *lpix++ = bg;
411	    break;
412	 case 3:
413	    *lpix++ = bg;
414	    *lpix++ = bg;
415	    *lpix++ = fg;
416	    *lpix++ = fg;
417	    break;
418	 case 4:
419	    *lpix++ = bg;
420	    *lpix++ = fg;
421	    *lpix++ = bg;
422	    *lpix++ = bg;
423	    break;
424	 case 5:
425	    *lpix++ = bg;
426	    *lpix++ = fg;
427	    *lpix++ = bg;
428	    *lpix++ = fg;
429	    break;
430	 case 6:
431	    *lpix++ = bg;
432	    *lpix++ = fg;
433	    *lpix++ = fg;
434	    *lpix++ = bg;
435	    break;
436	 case 7:
437	    *lpix++ = bg;
438	    *lpix++ = fg;
439	    *lpix++ = fg;
440	    *lpix++ = fg;
441	    break;
442	 case 8:
443	    *lpix++ = fg;
444	    *lpix++ = bg;
445	    *lpix++ = bg;
446	    *lpix++ = bg;
447	    break;
448	 case 9:
449	    *lpix++ = fg;
450	    *lpix++ = bg;
451	    *lpix++ = bg;
452	    *lpix++ = fg;
453	    break;
454	 case 10:
455	    *lpix++ = fg;
456	    *lpix++ = bg;
457	    *lpix++ = fg;
458	    *lpix++ = bg;
459	    break;
460	 case 11:
461	    *lpix++ = fg;
462	    *lpix++ = bg;
463	    *lpix++ = fg;
464	    *lpix++ = fg;
465	    break;
466	 case 12:
467	    *lpix++ = fg;
468	    *lpix++ = fg;
469	    *lpix++ = bg;
470	    *lpix++ = bg;
471	    break;
472	 case 13:
473	    *lpix++ = fg;
474	    *lpix++ = fg;
475	    *lpix++ = bg;
476	    *lpix++ = fg;
477	    break;
478	 case 14:
479	    *lpix++ = fg;
480	    *lpix++ = fg;
481	    *lpix++ = fg;
482	    *lpix++ = bg;
483	    break;
484	 case 15:
485	    *lpix++ = fg;
486	    *lpix++ = fg;
487	    *lpix++ = fg;
488	    *lpix++ = fg;
489	    break;
490	 }
491
492	 expbits = *lbits & 0x0f;
493
494	 j -= 4;
495	 if (j < 4) {
496	    break;
497	 }
498
499	 switch (expbits) {
500	 case 0:
501	    *lpix++ = bg;
502	    *lpix++ = bg;
503	    *lpix++ = bg;
504	    *lpix++ = bg;
505	    break;
506	 case 1:
507	    *lpix++ = bg;
508	    *lpix++ = bg;
509	    *lpix++ = bg;
510	    *lpix++ = fg;
511	    break;
512	 case 2:
513	    *lpix++ = bg;
514	    *lpix++ = bg;
515	    *lpix++ = fg;
516	    *lpix++ = bg;
517	    break;
518	 case 3:
519	    *lpix++ = bg;
520	    *lpix++ = bg;
521	    *lpix++ = fg;
522	    *lpix++ = fg;
523	    break;
524	 case 4:
525	    *lpix++ = bg;
526	    *lpix++ = fg;
527	    *lpix++ = bg;
528	    *lpix++ = bg;
529	    break;
530	 case 5:
531	    *lpix++ = bg;
532	    *lpix++ = fg;
533	    *lpix++ = bg;
534	    *lpix++ = fg;
535	    break;
536	 case 6:
537	    *lpix++ = bg;
538	    *lpix++ = fg;
539	    *lpix++ = fg;
540	    *lpix++ = bg;
541	    break;
542	 case 7:
543	    *lpix++ = bg;
544	    *lpix++ = fg;
545	    *lpix++ = fg;
546	    *lpix++ = fg;
547	    break;
548	 case 8:
549	    *lpix++ = fg;
550	    *lpix++ = bg;
551	    *lpix++ = bg;
552	    *lpix++ = bg;
553	    break;
554	 case 9:
555	    *lpix++ = fg;
556	    *lpix++ = bg;
557	    *lpix++ = bg;
558	    *lpix++ = fg;
559	    break;
560	 case 10:
561	    *lpix++ = fg;
562	    *lpix++ = bg;
563	    *lpix++ = fg;
564	    *lpix++ = bg;
565	    break;
566	 case 11:
567	    *lpix++ = fg;
568	    *lpix++ = bg;
569	    *lpix++ = fg;
570	    *lpix++ = fg;
571	    break;
572	 case 12:
573	    *lpix++ = fg;
574	    *lpix++ = fg;
575	    *lpix++ = bg;
576	    *lpix++ = bg;
577	    break;
578	 case 13:
579	    *lpix++ = fg;
580	    *lpix++ = fg;
581	    *lpix++ = bg;
582	    *lpix++ = fg;
583	    break;
584	 case 14:
585	    *lpix++ = fg;
586	    *lpix++ = fg;
587	    *lpix++ = fg;
588	    *lpix++ = bg;
589	    break;
590	 case 15:
591	    *lpix++ = fg;
592	    *lpix++ = fg;
593	    *lpix++ = fg;
594	    *lpix++ = fg;
595	    break;
596	 }
597	 lbits++;
598      }
599
600      if (j > 0) {
601	 *lpix++ = (expbits & 0x08) ? fg : bg;
602	 j--;
603	 if (j > 0) {
604	    *lpix++ = (expbits & 0x04) ? fg : bg;
605	    j--;
606	    if (j > 0) {
607	       *lpix++ = (expbits & 0x02) ? fg : bg;
608	       j--;
609	    }
610	 }
611      }
612
613      pix += pix_increment;
614      bits += bits_increment;
615   }
616   return;
617}
618
619
620
621/*
622 *----------------------------------------------------------------------
623 *
624 * RasterBitsToPixels24 --
625 *
626 *	Convert a bitmap to a pixmap, converting 1 bits to the foreground
627 *      color (fg) and 0 bits to the background color (bg), for a 24-bit
628 *	pixmap
629 *
630 * Results:
631 *      Pixmap filled with pixels
632 *
633 * Side effects:
634 *	None
635 *
636 *----------------------------------------------------------------------
637 */
638
639void
640RasterBitsToPixels24(uint8 *bits, uint32 bits_increment,
641		     uint8 *pix, uint32 pix_increment,
642		     uint32 width, uint32 height, uint32 fg, uint32 bg)
643{
644   uint8 *lpix, *lbits;
645   uint32 fgColor1, fgColor2, fgColor3;
646   uint32 bgColor1, bgColor2, bgColor3;
647
648   int i, j;
649   uint32 expbits = 0;		 /* Bits to be expanded */
650
651   fgColor1 = fg & 0x000000ff;
652   fgColor2 = (fg >> 8) & 0x000000ff;
653   fgColor3 = (fg >> 16) & 0x000000ff;
654
655   bgColor1 = bg & 0x000000ff;
656   bgColor2 = (bg >> 8) & 0x000000ff;
657   bgColor3 = (bg >> 16) & 0x000000ff;
658
659   for (i=0; i<height; i++) {
660      lpix = pix;
661      lbits = bits;
662      for (j = width; j > 0; j -= 4) {
663	 expbits = (*lbits >> 4) & 0x0f;
664
665	 if (j < 4)
666	    break;
667
668	 switch (expbits) {
669	 case 0:
670	    *lpix++ = bgColor1;
671	    *lpix++ = bgColor2;
672	    *lpix++ = bgColor3;
673	    *lpix++ = bgColor1;
674	    *lpix++ = bgColor2;
675	    *lpix++ = bgColor3;
676	    *lpix++ = bgColor1;
677	    *lpix++ = bgColor2;
678	    *lpix++ = bgColor3;
679	    *lpix++ = bgColor1;
680	    *lpix++ = bgColor2;
681	    *lpix++ = bgColor3;
682	    break;
683	 case 1:
684	    *lpix++ = bgColor1;
685	    *lpix++ = bgColor2;
686	    *lpix++ = bgColor3;
687	    *lpix++ = bgColor1;
688	    *lpix++ = bgColor2;
689	    *lpix++ = bgColor3;
690	    *lpix++ = bgColor1;
691	    *lpix++ = bgColor2;
692	    *lpix++ = bgColor3;
693	    *lpix++ = fgColor1;
694	    *lpix++ = fgColor2;
695	    *lpix++ = fgColor3;
696	    break;
697	 case 2:
698	    *lpix++ = bgColor1;
699	    *lpix++ = bgColor2;
700	    *lpix++ = bgColor3;
701	    *lpix++ = bgColor1;
702	    *lpix++ = bgColor2;
703	    *lpix++ = bgColor3;
704	    *lpix++ = fgColor1;
705	    *lpix++ = fgColor2;
706	    *lpix++ = fgColor3;
707	    *lpix++ = bgColor1;
708	    *lpix++ = bgColor2;
709	    *lpix++ = bgColor3;
710	    break;
711	 case 3:
712	    *lpix++ = bgColor1;
713	    *lpix++ = bgColor2;
714	    *lpix++ = bgColor3;
715	    *lpix++ = bgColor1;
716	    *lpix++ = bgColor2;
717	    *lpix++ = bgColor3;
718	    *lpix++ = fgColor1;
719	    *lpix++ = fgColor2;
720	    *lpix++ = fgColor3;
721	    *lpix++ = fgColor1;
722	    *lpix++ = fgColor2;
723	    *lpix++ = fgColor3;
724	    break;
725	 case 4:
726	    *lpix++ = bgColor1;
727	    *lpix++ = bgColor2;
728	    *lpix++ = bgColor3;
729	    *lpix++ = fgColor1;
730	    *lpix++ = fgColor2;
731	    *lpix++ = fgColor3;
732	    *lpix++ = bgColor1;
733	    *lpix++ = bgColor2;
734	    *lpix++ = bgColor3;
735	    *lpix++ = bgColor1;
736	    *lpix++ = bgColor2;
737	    *lpix++ = bgColor3;
738	    break;
739	 case 5:
740	    *lpix++ = bgColor1;
741	    *lpix++ = bgColor2;
742	    *lpix++ = bgColor3;
743	    *lpix++ = fgColor1;
744	    *lpix++ = fgColor2;
745	    *lpix++ = fgColor3;
746	    *lpix++ = bgColor1;
747	    *lpix++ = bgColor2;
748	    *lpix++ = bgColor3;
749	    *lpix++ = fgColor1;
750	    *lpix++ = fgColor2;
751	    *lpix++ = fgColor3;
752	    break;
753	 case 6:
754	    *lpix++ = bgColor1;
755	    *lpix++ = bgColor2;
756	    *lpix++ = bgColor3;
757	    *lpix++ = fgColor1;
758	    *lpix++ = fgColor2;
759	    *lpix++ = fgColor3;
760	    *lpix++ = fgColor1;
761	    *lpix++ = fgColor2;
762	    *lpix++ = fgColor3;
763	    *lpix++ = bgColor1;
764	    *lpix++ = bgColor2;
765	    *lpix++ = bgColor3;
766	    break;
767	 case 7:
768	    *lpix++ = bgColor1;
769	    *lpix++ = bgColor2;
770	    *lpix++ = bgColor3;
771	    *lpix++ = fgColor1;
772	    *lpix++ = fgColor2;
773	    *lpix++ = fgColor3;
774	    *lpix++ = fgColor1;
775	    *lpix++ = fgColor2;
776	    *lpix++ = fgColor3;
777	    *lpix++ = fgColor1;
778	    *lpix++ = fgColor2;
779	    *lpix++ = fgColor3;
780	    break;
781	 case 8:
782	    *lpix++ = fgColor1;
783	    *lpix++ = fgColor2;
784	    *lpix++ = fgColor3;
785	    *lpix++ = bgColor1;
786	    *lpix++ = bgColor2;
787	    *lpix++ = bgColor3;
788	    *lpix++ = bgColor1;
789	    *lpix++ = bgColor2;
790	    *lpix++ = bgColor3;
791	    *lpix++ = bgColor1;
792	    *lpix++ = bgColor2;
793	    *lpix++ = bgColor3;
794	    break;
795	 case 9:
796	    *lpix++ = fgColor1;
797	    *lpix++ = fgColor2;
798	    *lpix++ = fgColor3;
799	    *lpix++ = bgColor1;
800	    *lpix++ = bgColor2;
801	    *lpix++ = bgColor3;
802	    *lpix++ = bgColor1;
803	    *lpix++ = bgColor2;
804	    *lpix++ = bgColor3;
805	    *lpix++ = fgColor1;
806	    *lpix++ = fgColor2;
807	    *lpix++ = fgColor3;
808	    break;
809	 case 10:
810	    *lpix++ = fgColor1;
811	    *lpix++ = fgColor2;
812	    *lpix++ = fgColor3;
813	    *lpix++ = bgColor1;
814	    *lpix++ = bgColor2;
815	    *lpix++ = bgColor3;
816	    *lpix++ = fgColor1;
817	    *lpix++ = fgColor2;
818	    *lpix++ = fgColor3;
819	    *lpix++ = bgColor1;
820	    *lpix++ = bgColor2;
821	    *lpix++ = bgColor3;
822	    break;
823	 case 11:
824	    *lpix++ = fgColor1;
825	    *lpix++ = fgColor2;
826	    *lpix++ = fgColor3;
827	    *lpix++ = bgColor1;
828	    *lpix++ = bgColor2;
829	    *lpix++ = bgColor3;
830	    *lpix++ = fgColor1;
831	    *lpix++ = fgColor2;
832	    *lpix++ = fgColor3;
833	    *lpix++ = fgColor1;
834	    *lpix++ = fgColor2;
835	    *lpix++ = fgColor3;
836	    break;
837	 case 12:
838	    *lpix++ = fgColor1;
839	    *lpix++ = fgColor2;
840	    *lpix++ = fgColor3;
841	    *lpix++ = fgColor1;
842	    *lpix++ = fgColor2;
843	    *lpix++ = fgColor3;
844	    *lpix++ = bgColor1;
845	    *lpix++ = bgColor2;
846	    *lpix++ = bgColor3;
847	    *lpix++ = bgColor1;
848	    *lpix++ = bgColor2;
849	    *lpix++ = bgColor3;
850	    break;
851	 case 13:
852	    *lpix++ = fgColor1;
853	    *lpix++ = fgColor2;
854	    *lpix++ = fgColor3;
855	    *lpix++ = fgColor1;
856	    *lpix++ = fgColor2;
857	    *lpix++ = fgColor3;
858	    *lpix++ = bgColor1;
859	    *lpix++ = bgColor2;
860	    *lpix++ = bgColor3;
861	    *lpix++ = fgColor1;
862	    *lpix++ = fgColor2;
863	    *lpix++ = fgColor3;
864	    break;
865	 case 14:
866	    *lpix++ = fgColor1;
867	    *lpix++ = fgColor2;
868	    *lpix++ = fgColor3;
869	    *lpix++ = fgColor1;
870	    *lpix++ = fgColor2;
871	    *lpix++ = fgColor3;
872	    *lpix++ = fgColor1;
873	    *lpix++ = fgColor2;
874	    *lpix++ = fgColor3;
875	    *lpix++ = bgColor1;
876	    *lpix++ = bgColor2;
877	    *lpix++ = bgColor3;
878	    break;
879	 case 15:
880	    *lpix++ = fgColor1;
881	    *lpix++ = fgColor2;
882	    *lpix++ = fgColor3;
883	    *lpix++ = fgColor1;
884	    *lpix++ = fgColor2;
885	    *lpix++ = fgColor3;
886	    *lpix++ = fgColor1;
887	    *lpix++ = fgColor2;
888	    *lpix++ = fgColor3;
889	    *lpix++ = fgColor1;
890	    *lpix++ = fgColor2;
891	    *lpix++ = fgColor3;
892	    break;
893	 }
894
895	 expbits = *lbits & 0x0f;
896
897	 j -= 4;
898	 if (j < 4) {
899	    break;
900	 }
901
902	 switch (expbits) {
903	 case 0:
904	    *lpix++ = bgColor1;
905	    *lpix++ = bgColor2;
906	    *lpix++ = bgColor3;
907	    *lpix++ = bgColor1;
908	    *lpix++ = bgColor2;
909	    *lpix++ = bgColor3;
910	    *lpix++ = bgColor1;
911	    *lpix++ = bgColor2;
912	    *lpix++ = bgColor3;
913	    *lpix++ = bgColor1;
914	    *lpix++ = bgColor2;
915	    *lpix++ = bgColor3;
916	    break;
917	 case 1:
918	    *lpix++ = bgColor1;
919	    *lpix++ = bgColor2;
920	    *lpix++ = bgColor3;
921	    *lpix++ = bgColor1;
922	    *lpix++ = bgColor2;
923	    *lpix++ = bgColor3;
924	    *lpix++ = bgColor1;
925	    *lpix++ = bgColor2;
926	    *lpix++ = bgColor3;
927	    *lpix++ = fgColor1;
928	    *lpix++ = fgColor2;
929	    *lpix++ = fgColor3;
930	    break;
931	 case 2:
932	    *lpix++ = bgColor1;
933	    *lpix++ = bgColor2;
934	    *lpix++ = bgColor3;
935	    *lpix++ = bgColor1;
936	    *lpix++ = bgColor2;
937	    *lpix++ = bgColor3;
938	    *lpix++ = fgColor1;
939	    *lpix++ = fgColor2;
940	    *lpix++ = fgColor3;
941	    *lpix++ = bgColor1;
942	    *lpix++ = bgColor2;
943	    *lpix++ = bgColor3;
944	    break;
945	 case 3:
946	    *lpix++ = bgColor1;
947	    *lpix++ = bgColor2;
948	    *lpix++ = bgColor3;
949	    *lpix++ = bgColor1;
950	    *lpix++ = bgColor2;
951	    *lpix++ = bgColor3;
952	    *lpix++ = fgColor1;
953	    *lpix++ = fgColor2;
954	    *lpix++ = fgColor3;
955	    *lpix++ = fgColor1;
956	    *lpix++ = fgColor2;
957	    *lpix++ = fgColor3;
958	    break;
959	 case 4:
960	    *lpix++ = bgColor1;
961	    *lpix++ = bgColor2;
962	    *lpix++ = bgColor3;
963	    *lpix++ = fgColor1;
964	    *lpix++ = fgColor2;
965	    *lpix++ = fgColor3;
966	    *lpix++ = bgColor1;
967	    *lpix++ = bgColor2;
968	    *lpix++ = bgColor3;
969	    *lpix++ = bgColor1;
970	    *lpix++ = bgColor2;
971	    *lpix++ = bgColor3;
972	    break;
973	 case 5:
974	    *lpix++ = bgColor1;
975	    *lpix++ = bgColor2;
976	    *lpix++ = bgColor3;
977	    *lpix++ = fgColor1;
978	    *lpix++ = fgColor2;
979	    *lpix++ = fgColor3;
980	    *lpix++ = bgColor1;
981	    *lpix++ = bgColor2;
982	    *lpix++ = bgColor3;
983	    *lpix++ = fgColor1;
984	    *lpix++ = fgColor2;
985	    *lpix++ = fgColor3;
986	    break;
987	 case 6:
988	    *lpix++ = bgColor1;
989	    *lpix++ = bgColor2;
990	    *lpix++ = bgColor3;
991	    *lpix++ = fgColor1;
992	    *lpix++ = fgColor2;
993	    *lpix++ = fgColor3;
994	    *lpix++ = fgColor1;
995	    *lpix++ = fgColor2;
996	    *lpix++ = fgColor3;
997	    *lpix++ = bgColor1;
998	    *lpix++ = bgColor2;
999	    *lpix++ = bgColor3;
1000	    break;
1001	 case 7:
1002	    *lpix++ = bgColor1;
1003	    *lpix++ = bgColor2;
1004	    *lpix++ = bgColor3;
1005	    *lpix++ = fgColor1;
1006	    *lpix++ = fgColor2;
1007	    *lpix++ = fgColor3;
1008	    *lpix++ = fgColor1;
1009	    *lpix++ = fgColor2;
1010	    *lpix++ = fgColor3;
1011	    *lpix++ = fgColor1;
1012	    *lpix++ = fgColor2;
1013	    *lpix++ = fgColor3;
1014	    break;
1015	 case 8:
1016	    *lpix++ = fgColor1;
1017	    *lpix++ = fgColor2;
1018	    *lpix++ = fgColor3;
1019	    *lpix++ = bgColor1;
1020	    *lpix++ = bgColor2;
1021	    *lpix++ = bgColor3;
1022	    *lpix++ = bgColor1;
1023	    *lpix++ = bgColor2;
1024	    *lpix++ = bgColor3;
1025	    *lpix++ = bgColor1;
1026	    *lpix++ = bgColor2;
1027	    *lpix++ = bgColor3;
1028	    break;
1029	 case 9:
1030	    *lpix++ = fgColor1;
1031	    *lpix++ = fgColor2;
1032	    *lpix++ = fgColor3;
1033	    *lpix++ = bgColor1;
1034	    *lpix++ = bgColor2;
1035	    *lpix++ = bgColor3;
1036	    *lpix++ = bgColor1;
1037	    *lpix++ = bgColor2;
1038	    *lpix++ = bgColor3;
1039	    *lpix++ = fgColor1;
1040	    *lpix++ = fgColor2;
1041	    *lpix++ = fgColor3;
1042	    break;
1043	 case 10:
1044	    *lpix++ = fgColor1;
1045	    *lpix++ = fgColor2;
1046	    *lpix++ = fgColor3;
1047	    *lpix++ = bgColor1;
1048	    *lpix++ = bgColor2;
1049	    *lpix++ = bgColor3;
1050	    *lpix++ = fgColor1;
1051	    *lpix++ = fgColor2;
1052	    *lpix++ = fgColor3;
1053	    *lpix++ = bgColor1;
1054	    *lpix++ = bgColor2;
1055	    *lpix++ = bgColor3;
1056	    break;
1057	 case 11:
1058	    *lpix++ = fgColor1;
1059	    *lpix++ = fgColor2;
1060	    *lpix++ = fgColor3;
1061	    *lpix++ = bgColor1;
1062	    *lpix++ = bgColor2;
1063	    *lpix++ = bgColor3;
1064	    *lpix++ = fgColor1;
1065	    *lpix++ = fgColor2;
1066	    *lpix++ = fgColor3;
1067	    *lpix++ = fgColor1;
1068	    *lpix++ = fgColor2;
1069	    *lpix++ = fgColor3;
1070	    break;
1071	 case 12:
1072	    *lpix++ = fgColor1;
1073	    *lpix++ = fgColor2;
1074	    *lpix++ = fgColor3;
1075	    *lpix++ = fgColor1;
1076	    *lpix++ = fgColor2;
1077	    *lpix++ = fgColor3;
1078	    *lpix++ = bgColor1;
1079	    *lpix++ = bgColor2;
1080	    *lpix++ = bgColor3;
1081	    *lpix++ = bgColor1;
1082	    *lpix++ = bgColor2;
1083	    *lpix++ = bgColor3;
1084	    break;
1085	 case 13:
1086	    *lpix++ = fgColor1;
1087	    *lpix++ = fgColor2;
1088	    *lpix++ = fgColor3;
1089	    *lpix++ = fgColor1;
1090	    *lpix++ = fgColor2;
1091	    *lpix++ = fgColor3;
1092	    *lpix++ = bgColor1;
1093	    *lpix++ = bgColor2;
1094	    *lpix++ = bgColor3;
1095	    *lpix++ = fgColor1;
1096	    *lpix++ = fgColor2;
1097	    *lpix++ = fgColor3;
1098	    break;
1099	 case 14:
1100	    *lpix++ = fgColor1;
1101	    *lpix++ = fgColor2;
1102	    *lpix++ = fgColor3;
1103	    *lpix++ = fgColor1;
1104	    *lpix++ = fgColor2;
1105	    *lpix++ = fgColor3;
1106	    *lpix++ = fgColor1;
1107	    *lpix++ = fgColor2;
1108	    *lpix++ = fgColor3;
1109	    *lpix++ = bgColor1;
1110	    *lpix++ = bgColor2;
1111	    *lpix++ = bgColor3;
1112	    break;
1113	 case 15:
1114	    *lpix++ = fgColor1;
1115	    *lpix++ = fgColor2;
1116	    *lpix++ = fgColor3;
1117	    *lpix++ = fgColor1;
1118	    *lpix++ = fgColor2;
1119	    *lpix++ = fgColor3;
1120	    *lpix++ = fgColor1;
1121	    *lpix++ = fgColor2;
1122	    *lpix++ = fgColor3;
1123	    *lpix++ = fgColor1;
1124	    *lpix++ = fgColor2;
1125	    *lpix++ = fgColor3;
1126	    break;
1127	 }
1128	 lbits++;
1129      }
1130
1131      if (j > 0) {
1132	 *lpix++ = (expbits & 0x08) ? fgColor1 : bgColor1;
1133	 *lpix++ = (expbits & 0x08) ? fgColor2 : bgColor2;
1134	 *lpix++ = (expbits & 0x08) ? fgColor3 : bgColor3;
1135	 j--;
1136	 if (j > 0) {
1137	    *lpix++ = (expbits & 0x04) ? fgColor1 : bgColor1;
1138	    *lpix++ = (expbits & 0x04) ? fgColor2 : bgColor2;
1139	    *lpix++ = (expbits & 0x04) ? fgColor3 : bgColor3;
1140	    j--;
1141	    if (j > 0) {
1142	       *lpix++ = (expbits & 0x02) ? fgColor1 : bgColor1;
1143	       *lpix++ = (expbits & 0x02) ? fgColor2 : bgColor2;
1144	       *lpix++ = (expbits & 0x02) ? fgColor3 : bgColor3;
1145	       j--;
1146	    }
1147	 }
1148      }
1149
1150      pix += pix_increment;
1151      bits += bits_increment;
1152   }
1153   return;
1154}
1155
1156
1157
1158/*
1159 *----------------------------------------------------------------------
1160 *
1161 * RasterBitsToPixels32 --
1162 *
1163 *	Convert a bitmap to a pixmap, converting 1 bits to the foreground
1164 *      color (fg) and 0 bits to the background color (bg), for a 32-bit
1165 *	pixmap
1166 *
1167 * Results:
1168 *      Pixmap filled with pixels
1169 *
1170 * Side effects:
1171 *	None
1172 *
1173 *----------------------------------------------------------------------
1174 */
1175
1176void
1177RasterBitsToPixels32(uint8 *bits, uint32 bits_increment,
1178		     uint8 *pix, uint32 pix_increment,
1179		     uint32 width, uint32 height, uint32 fg, uint32 bg)
1180{
1181   uint32 *lpix;
1182   uint8 *lbits;
1183   int i, j;
1184   uint32 expbits = 0;		 /* Bits to be expanded */
1185
1186   for (i=0; i<height; i++) {
1187      lpix = (uint32 *)pix;
1188      lbits = bits;
1189      for (j = width; j > 0; j -= 4) {
1190	 expbits = (*lbits >> 4) & 0x0f;
1191
1192	 if (j < 4)
1193	    break;
1194
1195	 switch (expbits) {
1196	 case 0:
1197	    *lpix++ = bg;
1198	    *lpix++ = bg;
1199	    *lpix++ = bg;
1200	    *lpix++ = bg;
1201	    break;
1202	 case 1:
1203	    *lpix++ = bg;
1204	    *lpix++ = bg;
1205	    *lpix++ = bg;
1206	    *lpix++ = fg;
1207	    break;
1208	 case 2:
1209	    *lpix++ = bg;
1210	    *lpix++ = bg;
1211	    *lpix++ = fg;
1212	    *lpix++ = bg;
1213	    break;
1214	 case 3:
1215	    *lpix++ = bg;
1216	    *lpix++ = bg;
1217	    *lpix++ = fg;
1218	    *lpix++ = fg;
1219	    break;
1220	 case 4:
1221	    *lpix++ = bg;
1222	    *lpix++ = fg;
1223	    *lpix++ = bg;
1224	    *lpix++ = bg;
1225	    break;
1226	 case 5:
1227	    *lpix++ = bg;
1228	    *lpix++ = fg;
1229	    *lpix++ = bg;
1230	    *lpix++ = fg;
1231	    break;
1232	 case 6:
1233	    *lpix++ = bg;
1234	    *lpix++ = fg;
1235	    *lpix++ = fg;
1236	    *lpix++ = bg;
1237	    break;
1238	 case 7:
1239	    *lpix++ = bg;
1240	    *lpix++ = fg;
1241	    *lpix++ = fg;
1242	    *lpix++ = fg;
1243	    break;
1244	 case 8:
1245	    *lpix++ = fg;
1246	    *lpix++ = bg;
1247	    *lpix++ = bg;
1248	    *lpix++ = bg;
1249	    break;
1250	 case 9:
1251	    *lpix++ = fg;
1252	    *lpix++ = bg;
1253	    *lpix++ = bg;
1254	    *lpix++ = fg;
1255	    break;
1256	 case 10:
1257	    *lpix++ = fg;
1258	    *lpix++ = bg;
1259	    *lpix++ = fg;
1260	    *lpix++ = bg;
1261	    break;
1262	 case 11:
1263	    *lpix++ = fg;
1264	    *lpix++ = bg;
1265	    *lpix++ = fg;
1266	    *lpix++ = fg;
1267	    break;
1268	 case 12:
1269	    *lpix++ = fg;
1270	    *lpix++ = fg;
1271	    *lpix++ = bg;
1272	    *lpix++ = bg;
1273	    break;
1274	 case 13:
1275	    *lpix++ = fg;
1276	    *lpix++ = fg;
1277	    *lpix++ = bg;
1278	    *lpix++ = fg;
1279	    break;
1280	 case 14:
1281	    *lpix++ = fg;
1282	    *lpix++ = fg;
1283	    *lpix++ = fg;
1284	    *lpix++ = bg;
1285	    break;
1286	 case 15:
1287	    *lpix++ = fg;
1288	    *lpix++ = fg;
1289	    *lpix++ = fg;
1290	    *lpix++ = fg;
1291	    break;
1292	 }
1293
1294	 expbits = *lbits & 0x0f;
1295
1296	 j -= 4;
1297	 if (j < 4) {
1298	    break;
1299	 }
1300
1301	 switch (expbits) {
1302	 case 0:
1303	    *lpix++ = bg;
1304	    *lpix++ = bg;
1305	    *lpix++ = bg;
1306	    *lpix++ = bg;
1307	    break;
1308	 case 1:
1309	    *lpix++ = bg;
1310	    *lpix++ = bg;
1311	    *lpix++ = bg;
1312	    *lpix++ = fg;
1313	    break;
1314	 case 2:
1315	    *lpix++ = bg;
1316	    *lpix++ = bg;
1317	    *lpix++ = fg;
1318	    *lpix++ = bg;
1319	    break;
1320	 case 3:
1321	    *lpix++ = bg;
1322	    *lpix++ = bg;
1323	    *lpix++ = fg;
1324	    *lpix++ = fg;
1325	    break;
1326	 case 4:
1327	    *lpix++ = bg;
1328	    *lpix++ = fg;
1329	    *lpix++ = bg;
1330	    *lpix++ = bg;
1331	    break;
1332	 case 5:
1333	    *lpix++ = bg;
1334	    *lpix++ = fg;
1335	    *lpix++ = bg;
1336	    *lpix++ = fg;
1337	    break;
1338	 case 6:
1339	    *lpix++ = bg;
1340	    *lpix++ = fg;
1341	    *lpix++ = fg;
1342	    *lpix++ = bg;
1343	    break;
1344	 case 7:
1345	    *lpix++ = bg;
1346	    *lpix++ = fg;
1347	    *lpix++ = fg;
1348	    *lpix++ = fg;
1349	    break;
1350	 case 8:
1351	    *lpix++ = fg;
1352	    *lpix++ = bg;
1353	    *lpix++ = bg;
1354	    *lpix++ = bg;
1355	    break;
1356	 case 9:
1357	    *lpix++ = fg;
1358	    *lpix++ = bg;
1359	    *lpix++ = bg;
1360	    *lpix++ = fg;
1361	    break;
1362	 case 10:
1363	    *lpix++ = fg;
1364	    *lpix++ = bg;
1365	    *lpix++ = fg;
1366	    *lpix++ = bg;
1367	    break;
1368	 case 11:
1369	    *lpix++ = fg;
1370	    *lpix++ = bg;
1371	    *lpix++ = fg;
1372	    *lpix++ = fg;
1373	    break;
1374	 case 12:
1375	    *lpix++ = fg;
1376	    *lpix++ = fg;
1377	    *lpix++ = bg;
1378	    *lpix++ = bg;
1379	    break;
1380	 case 13:
1381	    *lpix++ = fg;
1382	    *lpix++ = fg;
1383	    *lpix++ = bg;
1384	    *lpix++ = fg;
1385	    break;
1386	 case 14:
1387	    *lpix++ = fg;
1388	    *lpix++ = fg;
1389	    *lpix++ = fg;
1390	    *lpix++ = bg;
1391	    break;
1392	 case 15:
1393	    *lpix++ = fg;
1394	    *lpix++ = fg;
1395	    *lpix++ = fg;
1396	    *lpix++ = fg;
1397	    break;
1398	 }
1399	 lbits++;
1400      }
1401
1402      if (j > 0) {
1403	 *lpix++ = (expbits & 0x08) ? fg : bg;
1404	 j--;
1405	 if (j > 0) {
1406	    *lpix++ = (expbits & 0x04) ? fg : bg;
1407	    j--;
1408	    if (j > 0) {
1409	       *lpix++ = (expbits & 0x02) ? fg : bg;
1410	       j--;
1411	    }
1412	 }
1413      }
1414
1415      pix += pix_increment;
1416      bits += bits_increment;
1417   }
1418   return;
1419}
1420