/*
 * fb2ppm
 * Copyright (c) 1999 Ichiya KAMKI all rights reserved.
 *
 * 再配付禁止 :-)
 * ... こんないいかげんなコードを参考にしたりしてはいけません (^^;;
 *
 */

#include <stdio.h>

void print_char2(int c){
    int i;
    unsigned int d;

    for(i = 0; i < 4; i++){
	d = (c & 0x3) << 6;
	printf("%d %d %d ", d, d, d);
	c >>= 2;
    }
}
void print_char4(int c){
    int i;
    int c_l, c_h, c_l4, c_h4;
    int c_r, c_g, c_b;

    c_l = c & 0xf;
    c_h = (c >> 4) & 0xf;

    c_l4 = c_l << 4;
    c_h4 = c_h << 4;

    printf("%d %d %d ", c_l4, c_l4, c_l4);
    printf("%d %d %d ", c_h4, c_h4, c_h4);
}
void print_char15(int c){
    int r, g, b;
    unsigned int L, R, D;

    L = c;
    R = getchar();
    D = (R << 8) | (L & 0xff);
    printf("%d %d %d ", (((D>>10) & 0x1f) << 3), (((D>>5) & 0x1f) << 3), ((D & 0x1f) << 3));
}
void print_char16(int c){
    int r, g, b;
    unsigned int L, R, D;

    L = c;
    R = getchar();
    D = (R << 8) | (L & 0xff);
    printf("%d %d %d ", (((D>>11) & 0x1f) << 3), (((D>>5) & 0x3f) << 3), ((D & 0x1f) << 3));
}
void print_char32(int c){
    int r, g, b, d;

    b = c;
    g = getchar();
    r = getchar();
    d = getchar();

    printf("%d %d %d ", r & 0xff, g & 0xff, b & 0xff);
}


void usage(){
    printf("fb2ppm xres yres depth < fb_image > ppm_image\n");
    exit(0);
}

int main(int argc, char* argv[]){
    int i, c;
    int x, y, d;
    if(argc < 4){ usage(); }

    x = atoi(argv[1]);
    y = atoi(argv[2]);
    d = atoi(argv[3]);

    fprintf(stderr, "%d x %d %dbpp\n", x, y, d);

    printf("P3\n");
    printf("# fb2pnm\n");
    printf("%d %d\n", x, y);
    printf("255\n");

    switch(d){

    case 2:

	i = 16;
	while(EOF != (c = getchar())){
	    print_char2(c);
	    if(0 == (-- i)){
		printf("\n");
		i = 16;
	    }
	}
	break;

    case 4:

	i = 16;
	while(EOF != (c = getchar())){
	    print_char4(c);
	    if(0 == (-- i)){
		printf("\n");
		i = 16;
	    }
	}
	break;

    case 15:

	i = 16;
	while(EOF != (c = getchar())){
	    print_char15(c);
	    if(0 == (-- i)){
		printf("\n");
		i = 16;
	    }
	}
	break;

    case 16:

	i = 16;
	while(EOF != (c = getchar())){
	    print_char16(c);
	    if(0 == (-- i)){
		printf("\n");
		i = 16;
	    }
	}
	break;

    case 32:

	i = 16;
	while(EOF != (c = getchar())){
	    print_char32(c);
	    if(0 == (-- i)){
		printf("\n");
		i = 16;
	    }
	}
	break;

    };
    return 0;
}
