Mercurial > hg > Members > yuuhi > OpenCL
comparison fft_fixstart/pgm.h @ 3:f3cfea46e585
add fft_fixstar sample
author | Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 04 Feb 2013 02:59:58 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
2:ccea4e6a1945 | 3:f3cfea46e585 |
---|---|
1 #ifndef _PGM_H_ | |
2 #define _PGM_H_ | |
3 | |
4 #include <math.h> | |
5 #include <string.h> | |
6 | |
7 #define PGM_MAGIC "P5" | |
8 | |
9 #ifdef _WIN32 | |
10 #define STRTOK_R(ptr, del, saveptr) strtok_s(ptr, del, saveptr) | |
11 #else | |
12 #define STRTOK_R(ptr, del, saveptr) strtok_r(ptr, del, saveptr) | |
13 #endif | |
14 | |
15 typedef struct _pgm_t { | |
16 int width; | |
17 int height; | |
18 unsigned char *buf; | |
19 } pgm_t; | |
20 | |
21 int readPGM(pgm_t* pgm, const char* filename) | |
22 { | |
23 char *token, *pc, *saveptr; | |
24 char *buf; | |
25 size_t bufsize; | |
26 char del[] = " \t\n"; | |
27 unsigned char *dot; | |
28 | |
29 long begin, end; | |
30 int filesize; | |
31 int i, w, h, luma, pixs; | |
32 | |
33 | |
34 FILE* fp; | |
35 if ((fp = fopen(filename, "rb"))==NULL) { | |
36 fprintf(stderr, "Failed to open file\n"); | |
37 return -1; | |
38 } | |
39 | |
40 fseek(fp, 0, SEEK_SET); | |
41 begin = ftell(fp); | |
42 fseek(fp, 0, SEEK_END); | |
43 end = ftell(fp); | |
44 filesize = (int)(end - begin); | |
45 | |
46 buf = (char*)malloc(filesize * sizeof(char)); | |
47 fseek(fp, 0, SEEK_SET); | |
48 bufsize = fread(buf, filesize * sizeof(char), 1, fp); | |
49 | |
50 fclose(fp); | |
51 | |
52 token = (char *)STRTOK_R(buf, del, &saveptr); | |
53 if (strncmp(token, PGM_MAGIC, 2) != 0) { | |
54 return -1; | |
55 } | |
56 | |
57 token = (char *)STRTOK_R(NULL, del, &saveptr); | |
58 if (token[0] == '#' ) { | |
59 token = (char *)STRTOK_R(NULL, "\n", &saveptr); | |
60 token = (char *)STRTOK_R(NULL, del, &saveptr); | |
61 } | |
62 | |
63 w = strtoul(token, &pc, 10); | |
64 token = (char *)STRTOK_R(NULL, del, &saveptr); | |
65 h = strtoul(token, &pc, 10); | |
66 token = (char *)STRTOK_R(NULL, del, &saveptr); | |
67 luma = strtoul(token, &pc, 10); | |
68 | |
69 token = pc + 1; | |
70 pixs = w * h; | |
71 | |
72 pgm->buf = (unsigned char *)malloc(pixs * sizeof(unsigned char)); | |
73 | |
74 dot = pgm->buf; | |
75 | |
76 for (i=0; i< pixs; i++, dot++) { | |
77 *dot = *token++; | |
78 } | |
79 | |
80 pgm->width = w; | |
81 pgm->height = h; | |
82 | |
83 return 0; | |
84 } | |
85 | |
86 int writePGM(pgm_t* pgm, const char* filename) | |
87 { | |
88 int i, w, h, pixs; | |
89 FILE* fp; | |
90 unsigned char* dot; | |
91 | |
92 w = pgm->width; | |
93 h = pgm->height; | |
94 pixs = w * h; | |
95 | |
96 if ((fp = fopen(filename, "wb+")) ==NULL) { | |
97 fprintf(stderr, "Failed to open file\n"); | |
98 return -1; | |
99 } | |
100 | |
101 fprintf (fp, "%s\n%d %d\n255\n", PGM_MAGIC, w, h); | |
102 | |
103 dot = pgm->buf; | |
104 | |
105 for (i=0; i<pixs; i++, dot++) { | |
106 putc((unsigned char)*dot, fp); | |
107 } | |
108 | |
109 fclose(fp); | |
110 | |
111 return 0; | |
112 } | |
113 | |
114 int normalizeD2PGM(pgm_t* pgm, double* x) | |
115 { | |
116 int i, j, w, h; | |
117 | |
118 w = pgm->width; | |
119 h = pgm->height; | |
120 | |
121 pgm->buf = (unsigned char*)malloc(w * h * sizeof(unsigned char)); | |
122 | |
123 double min = 0; | |
124 double max = 0; | |
125 for (i=0; i < h; i++) { | |
126 for (j=0; j < w; j++) { | |
127 if (max < x[i*w+j]) | |
128 max = x[i*w+j]; | |
129 if (min > x[i*w+j]) | |
130 min = x[i*w+j]; | |
131 } | |
132 } | |
133 | |
134 for (i=0; i < h; i++) { | |
135 for (j=0; j < w; j++) { | |
136 if((max-min)!=0) | |
137 pgm->buf[i*w+j] = (unsigned char)(255*(x[i*w+j]-min)/(max-min)); | |
138 else | |
139 pgm->buf[i*w+j]= 0; | |
140 } | |
141 } | |
142 | |
143 return 0; | |
144 } | |
145 | |
146 int normalizeF2PGM(pgm_t* pgm, float* x) | |
147 { | |
148 int i, j, w, h; | |
149 | |
150 w = pgm->width; | |
151 h = pgm->height; | |
152 | |
153 pgm->buf = (unsigned char*)malloc(w * h * sizeof(unsigned char)); | |
154 | |
155 float min = 0; | |
156 float max = 0; | |
157 for (i=0; i < h; i++) { | |
158 for (j=0; j < w; j++) { | |
159 if (max < x[i*w+j]) | |
160 max = x[i*w+j]; | |
161 if (min > x[i*w+j]) | |
162 min = x[i*w+j]; | |
163 } | |
164 } | |
165 | |
166 for (i=0; i < h; i++) { | |
167 for (j=0; j < w; j++) { | |
168 if((max-min)!=0) | |
169 pgm->buf[i*w+j] = (unsigned char)(255*(x[i*w+j]-min)/(max-min)); | |
170 else | |
171 pgm->buf[i*w+j]= 0; | |
172 } | |
173 } | |
174 | |
175 return 0; | |
176 } | |
177 | |
178 int destroyPGM(pgm_t* pgm) | |
179 { | |
180 if (pgm->buf) { | |
181 free(pgm->buf); | |
182 } | |
183 | |
184 return 0; | |
185 } | |
186 | |
187 #endif /* _PGM_H_ */ |