summaryrefslogtreecommitdiffstats
path: root/src/bmp.c
blob: 4262e81ddff451cb5fce45edb0ef0275c31e10a0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
void GetBMPHeaderInfo (unsigned char *Image,unsigned int *offset,unsigned int *x_size,unsigned int *y_size, unsigned char *depth)
{
        *offset = ((int)Image[13] << 24) + ((int)Image[12] << 16) + ((int)Image[11] << 8) + Image[10];
        *x_size = ((int)Image[21] << 24) + ((int)Image[20] << 16) + ((int)Image[19] << 8) + Image[18];
        *y_size = ((int)Image[25] << 24) + ((int)Image[24] << 16) + ((int)Image[23] << 8) + Image[22];
        *depth  = ((int)Image[29] << 8) + Image[28];
}

void WriteBMPHeaderInfo(unsigned char *Image,unsigned int offset,unsigned int x_size,unsigned int y_size, unsigned char depth)
{
        unsigned int ByteSize, i;
        ByteSize = (x_size*y_size*(depth/8));
        // 2 - signature, must be 4D42 hex
        Image[0]=0x42;
        Image[1]=0x4d;
        // 4 - size of BMP file in bytes (unreliable)
        Image[5] = (ByteSize+offset) >> 24;
		Image[4] = (ByteSize+offset) >> 16;
		Image[3] = (ByteSize+offset) >> 8;
        Image[2] = (ByteSize+offset);
        // 4 - reserved, must be zero
        Image[6] = 0;
        Image[7] = 0;
        Image[8] = 0;
        Image[9] = 0;
        // 4 - offset
        Image[13] = offset >> 24;
        Image[12] = offset >> 16;
        Image[11] = offset >> 8;
        Image[10] = offset;
		// 4 - size of BITMAPINFOHEADER structure, must be 40
		Image[14] = 40;
		Image[15] = 0;
		Image[16] = 0;
		Image[17] = 0;
        // 4 - x_size
        Image[21] = x_size >> 24;
        Image[20] = x_size >> 16;
        Image[19] = x_size >> 8;
        Image[18] = x_size;
        // 4 - y_size
        Image[25] = y_size >> 24;
        Image[24] = y_size >> 16;
        Image[23] = y_size >> 8;
        Image[22] = y_size;
        // 2 - number of planes in the image, must be 1
        Image[26] = 1;
        Image[27] = 0;
        // 2 - depth
        Image[29]= 0x0;
        Image[28]= depth;
        // 4 - compression type (0=none, 1=RLE-8, 2=RLE-4)
        Image[30] = 0;
        Image[31] = 0;
        Image[32] = 0;
        Image[33] = 0;
        // 34  4 - size of image data in bytes (including padding)
        Image[37] = ByteSize >> 24;
		Image[36] = ByteSize >> 16;
		Image[35] = ByteSize >> 8;
        Image[34] = ByteSize;

		/*	If it is a grayscale image of 8 bits we need to make the palette available	*/
        if(depth == 8)
        {
		for(i = 0; i <= 0xff; i++) {
		   	Image[(i*4)+54]=i;
        	Image[(i*4)+1+54]=i;
        	Image[(i*4)+2+54]=i;
        	Image[(i*4)+3+54]=00;
		}

		}
		else
		for(i = 38; i < offset; i++)
        	Image[i]=0;
}