GRASS Programmer's Manual  6.5.svn(2014)-r66266
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
cairodriver/read_bmp.c
Go to the documentation of this file.
1 
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 
6 #include <grass/gis.h>
7 #include "cairodriver.h"
8 
9 static unsigned int get_2(const unsigned char **q)
10 {
11  const unsigned char *p = *q;
12  unsigned int n = (p[0] << 0) | (p[1] << 8);
13 
14  *q += 2;
15  return n;
16 }
17 
18 static unsigned int get_4(const unsigned char **q)
19 {
20  const unsigned char *p = *q;
21  unsigned int n = (p[0] << 0) | (p[1] << 8) | (p[2] << 16) | (p[3] << 24);
22 
23  *q += 4;
24  return n;
25 }
26 
27 static int read_bmp_header(const unsigned char *p)
28 {
29  if (*p++ != 'B')
30  return 0;
31  if (*p++ != 'M')
32  return 0;
33 
34  if (get_4(&p) != HEADER_SIZE + width * height * 4)
35  return 0;
36 
37  get_4(&p);
38 
39  if (get_4(&p) != HEADER_SIZE)
40  return 0;
41 
42  if (get_4(&p) != 40)
43  return 0;
44 
45  if (get_4(&p) != width)
46  return 0;
47  if (get_4(&p) != -height)
48  return 0;
49 
50  get_2(&p);
51  if (get_2(&p) != 32)
52  return 0;
53 
54  if (get_4(&p) != 0)
55  return 0;
56  if (get_4(&p) != width * height * 4)
57  return 0;
58 
59  get_4(&p);
60  get_4(&p);
61  get_4(&p);
62  get_4(&p);
63 
64  return 1;
65 }
66 
67 void read_bmp(void)
68 {
69  char header[HEADER_SIZE];
70  FILE *input;
71 
72  input = fopen(file_name, "rb");
73  if (!input)
74  G_fatal_error("cairo:: couldn't open input file %s", file_name);
75 
76  if (fread(header, sizeof(header), 1, input) != 1)
77  G_fatal_error("cairo:: invalid input file %s", file_name);
78 
79  if (!read_bmp_header(header))
80  G_fatal_error("cairo:: invalid BMP header for %s", file_name);
81 
82  fread(grid, stride, height, input);
83 
84  fclose(input);
85 }
#define HEADER_SIZE
Definition: cairodriver.h:17
tuple q
Definition: forms.py:2019
tuple width
unsigned char * grid
int stride
char * file_name
fclose(fd)
int G_fatal_error(const char *msg,...)
Print a fatal error message to stderr.
int height
int n
Definition: dataquad.c:291
void read_bmp(void)